{"version":3,"file":"app.1e95a321b3943f007a9d.js","mappings":"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ZCoEIthC,G,OAAoC,OACxDk9C,GAAiBl9C,EAAKo9C,WAChBp9C,EAAK2/B,eACA,EAAW3/B,EAAK6/B,iBAAkB,GAC1C,EAAW7/B,EAAK8/B,SAAU,GACvB9/B,EAAK4/B,YACFyd,GAAoBr9C,EAAKw9B,gBAE3Bx9B,EAAK0hC,aADD1hC,EAAKshC,iBAEXthC,EAAKs9C,Y,yFC3FYt9C,G,OAAwD,UAC9E,GAAAA,EAAA,0BACMA,EAAKgiC,a,4FCFchiC,G,OAA8D,UACvF,GAAAA,EAAA,0BACSA,EAAKmiC,gB,isBC2BtB,OACI,OACI,OAAY,UACC,WACH,QACA,QACF,MACC,OACA,OACE,SACG,YACF,UACC,WACA,YAEb,OAAY,MACC,MACH,MACA,MACF,MACC,MACA,MACE,MACG,MACF,MACC,MACA,OAEb,OAAW,SACC,UACE,YACD,WACF,SACE,WACF,UAEX,OAAW,MACC,MACE,MACD,MACF,MACE,MACF,OACG,cAGlB,OAAO,KACA,OAGX,OACI,OACI,OAAY,UACC,WACH,QACA,QACF,MACC,OACA,OACE,SACG,YACF,UACC,WACA,YAEb,OAAY,MACC,MACH,MACA,MACF,MACC,MACA,MACE,MACG,MACF,MACC,MACA,OAEb,OAAW,SACC,UACE,YACD,WACF,SACE,WACF,UAEX,OAAW,MACC,MACE,MACD,MACF,MACE,MACF,OACG,cAGlB,OAAO,KACA,OAGX,OACI,OACI,OAAY,UACC,UACH,OACA,QACF,MACC,OACA,UACE,OACG,YACF,UACC,WACA,YAEb,OAAY,MACC,MACH,OACA,MACF,MACC,MACA,OACE,OACG,MACF,MACC,MACA,OAEb,OAAW,QACC,QACE,WACD,QACF,WACE,SACF,YAEX,OAAW,MACC,MACE,MACD,MACF,MACE,MACF,OACG,cAGlB,OAAO,GACA,KAGX,OACI,OACI,OAAY,SACC,UACH,OACA,SACF,MACC,OACA,OACE,SACG,WACF,UACC,SACA,WAEb,OAAY,MACC,MACH,MACA,MACF,MACC,MACA,MACE,MACG,MACF,MACC,MACA,OAEb,OAAW,cACC,UACE,QACD,UACF,UACE,UACF,eAEX,OAAW,MACC,MACE,MACD,MACF,MACE,MACF,OACG,cAGlB,OAAO,GACA,KAGX,OACI,OACI,OAAY,SACC,UACH,UACA,UACF,QACC,SACA,SACE,YACG,aACF,UACC,WACA,YAEb,OAAY,MACC,MACH,OACA,MACF,MACC,MACA,MACE,MACG,QACF,MACC,MACA,OAEb,OAAW,QACC,OACE,SACD,YACF,SACE,UACF,YAEX,OAAW,MACC,OACE,MACD,OACF,MACE,MACF,OACG,iBAGlB,OAAO,KACA,OAIX,OACI,OACI,OAAY,SACC,UACH,OACA,QACF,MACC,OACA,OACE,SACG,YACF,UACC,WACA,YAEb,OAAY,MACC,MACH,OACA,MACF,MACC,OACA,OACE,MACG,OACF,MACC,MACA,OAEb,OAAW,SACC,WACE,WACD,aACF,UACE,UACF,WAEX,OAAW,KACC,KACE,KACD,KACF,KACE,KACF,MACG,gBAGlB,OAAO,GACA,KCtUP,I,8LAAU,GACO,EzLwQd1/C,GAASpR,KAAKwS,MAAO,IyLtQV,GACC,EACC,IACK,G,kKCYT2xD,EAAuBx1C,G,IASzBzU,EAICkyD,E,MAZPC,EAAAA,CACK19C,EAAY29C,EAAUC,IAAAA,IAAW,gBAEtBD,EAFsB,aAGxBC,EAHwB,4B,gBArB5B59C,G,MACRzU,EAAAA,CAACyU,EAAKnM,MAAOmM,EAAK69C,Y,MACLt+D,EAAZgK,E,OADD,wB,IACahK,EAAL,KAAPgK,EAAL,M,qBAKE,4BAJiB,GAAAA,EAAQhK,GAIzB,MAFkB,GjM6YArS,EOKnB,G0LlZqBqc,EAAQhK,GjM6YP5R,EiM7YcqyB,EAAK89C,ejM8YxB,EAAI5wE,EAAIS,EiM5YxB,iB,cAKM,iCAEW,EAFX,MAGcqyB,EAAK89C,cAHnB,iBjMsYX,IAAuB5wE,EAAGS,EiMhXzBowE,EANUxyD,EAAYiqD,EAAZ,GAAYA,GAAZ,MAGCkI,EAAe19C,OAAK,OAAK,GAH1B,MAEC09C,EAAe19C,EAAW,GAAO,EAAPw1C,QAAW,GAFtC,MACCkI,EAAe19C,EAAW,GAAO,EAAPw1C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","sources":["webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Util.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Option.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Types.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Int32.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Numeric.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/lib/long.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Long.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Date.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/RegExp.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/String.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Global.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Array.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/List.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/AsyncBuilder.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Choice.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Async.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Event.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Observable.js","webpack:///./src/Client/output/fable_modules/Fable.Elmish.3.1.0/prelude.fs","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Timer.js","webpack:///./src/Client/output/fable_modules/Fable.Elmish.3.1.0/cmd.fs","webpack:///./src/Shared/Infrastructure/DateTime.fs","webpack:///./src/Shared/DtoTypes/DateRangeDto.fs","webpack:///./src/Client/output/fable_modules/Fable.Remoting.Client.7.32.0/Types.fs","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Reflection.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/FSharp.Core.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/FSharp.Collections.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Seq.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/MapUtil.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/MutableMap.js","webpack:///./src/Client/output/fable_modules/Fable.SimpleJson.3.24.0/TypeInfo.Converter.fs","webpack:///./src/Client/output/fable_modules/Fable.Remoting.Client.7.32.0/Extensions.fs","webpack:///./src/Client/output/fable_modules/Fable.Remoting.Client.7.32.0/Http.fs","webpack:///./src/Client/output/fable_modules/Fable.Parsimmon.4.1.0/Parsimmon.js","webpack:///./src/Client/output/fable_modules/Fable.Parsimmon.4.1.0/Parsimmon.fs","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Double.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Map.js","webpack:///./src/Client/output/fable_modules/Fable.SimpleJson.3.24.0/Parser.fs","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/lib/big.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Decimal.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/BigInt/n.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/BigInt/z.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/BigInt.js","webpack:///./src/Client/output/fable_modules/Fable.SimpleJson.3.24.0/SimpleJson.fs","webpack:///./src/Client/output/fable_modules/Fable.SimpleJson.3.24.0/TypeCheck.fs","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Uri.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/DateOffset.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/DateOnly.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/TimeOnly.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Guid.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/BitConverter.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Set.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/MutableSet.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/TimeSpan.js","webpack:///./src/Client/output/fable_modules/Fable.SimpleJson.3.24.0/isBrowser.js","webpack:///./src/Client/output/fable_modules/Fable.SimpleJson.3.24.0/Json.Converter.fs","webpack:///./src/Client/output/fable_modules/Fable.SimpleJson.3.24.0/quote.js","webpack:///./src/Client/output/fable_modules/Fable.Remoting.Client.7.32.0/Proxy.fs","webpack:///./src/Shared/Dto/User.fs","webpack:///./src/Shared/Dto/Dto.fs","webpack:///./src/Shared/Infrastructure/DatedValue.fs","webpack:///./src/Shared/Dto/Location.fs","webpack:///./src/Shared/Dto/MapSensorData.fs","webpack:///./src/Shared/Dto/MapSensor.fs","webpack:///./src/Shared/Dto/SensorDetailPage.fs","webpack:///./src/Shared/Dto/Page/UserList.fs","webpack:///./src/Shared/DtoTypes/Alert.fs","webpack:///./src/Client/output/fable_modules/Fable.Remoting.Client.7.32.0/Remoting.fs","webpack:///./src/Client/Infrastructure/Api.fs","webpack:///./src/Shared/Shared.fs","webpack:///./src/Client/Infrastructure/LocalStorage.fs","webpack:///./src/Client/Session.fs","webpack:///./src/Client/Page/PendingSession.fs","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Range.js","webpack:///./src/Client/output/fable_modules/Fable.Elmish.3.1.0/ring.fs","webpack:///./src/Client/output/fable_modules/Fable.Elmish.3.1.0/program.fs","webpack:///./src/Client/output/fable_modules/Thoth.Elmish.Toast.3.0.0/Toast.fs","webpack:///./src/Client/output/fable_modules/Fable.Promise.3.1.0/Promise.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Common.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Notification.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Heading.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Icon.fs","webpack:///./src/Client/output/fable_modules/Fable.FontAwesome.2.0.0/FontAwesome.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Layouts/Columns.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Layouts/Column.fs","webpack:///./src/Client/InfrastructureTypes/Toast.fs","webpack:///./src/Shared/Infrastructure/List.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Button.fs","webpack:///./src/Client/Components/SubmitButton.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Box.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Form/Field.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Form/Label.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Form/Control.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Form/Input.fs","webpack:///./src/Shared/Infrastructure/String.fs","webpack:///./src/Client/output/fable_modules/Fable.React.7.4.2/Fable.React.Extensions.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Layouts/Level.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Layouts/Hero.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Layouts/Container.fs","webpack:///./src/Client/Page/Login.fs","webpack:///./src/Client/Infrastructure/Clickable.fs","webpack:///./src/Client/output/fable_modules/Fable.Elmish.Browser.3.0.4/prelude.fs","webpack:///./src/Client/output/fable_modules/Fable.Elmish.Browser.3.0.4/parser.fs","webpack:///./src/Client/Domain/Routing.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Components/Navbar.fs","webpack:///./src/Client/Domain/PageSkeleton.fs","webpack:///./src/Client/Domain/Loadable.fs","webpack:///./src/Client/output/fable_modules/Fable.React.7.4.2/Fable.React.Helpers.fs","webpack:///./src/Client/Page/Home.fs","webpack:///./src/Client/Forms/ChangePassword.fs","webpack:///./src/Client/Components/Box.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Content.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Form/Checkbox.fs","webpack:///./src/Client/Forms/NotificationSettings.fs","webpack:///./src/Client/InfrastructureTypes/Container.fs","webpack:///./src/Client/Page/User/MySettings.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Components/Tabs.fs","webpack:///./src/Client/Map/MapMarker.fs","webpack:///./src/Client/icon.js","webpack:///./src/Client/Domain/MeasuredValueString.fs","webpack:///./src/Client/output/fable_modules/Fulma.Extensions.Wikiki.Tooltip.3.0.0/Tooltip.fs","webpack:///./src/Client/Map/Symbol/SignalStrength.fs","webpack:///./src/Client/Map/Symbol/LeafletWetness.fs","webpack:///./src/Shared/Infrastructure/Math.fs","webpack:///./src/Client/Map/Symbol/RainFall.fs","webpack:///./src/Client/Map/Symbol/AverageWindSpeed.fs","webpack:///./src/Client/Map/Symbol/SoilPh.fs","webpack:///./src/Client/Map/Symbol/SoilMoisture.fs","webpack:///./src/Client/Map/Symbol/RadiationIntensity.fs","webpack:///./src/Client/Map/Symbol/BatteryLevel.fs","webpack:///./src/Shared/Infrastructure/TimeSpan.fs","webpack:///./src/Client/Map/SensorPopup.fs","webpack:///./src/Client/output/fable_modules/Fable.ReactLeaflet.1.0.1/ReactLeaflet.fs","webpack:///./src/Client/InfrastructureTypes/Exceptions.fs","webpack:///./src/Client/Page/PublicMap.fs","webpack:///./src/Client/output/fable_modules/Thoth.Json.10.2.0/Types.fs","webpack:///./src/Client/output/fable_modules/Thoth.Json.10.2.0/Encode.fs","webpack:///./src/Client/output/fable_modules/Thoth.Json.10.2.0/Decode.fs","webpack:///./src/Client/Page/User/SensorMap.fs","webpack:///./src/Client/Components/PhysicalSensorRefreshButton.fs","webpack:///./src/Shared/Infrastructure/Option.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Form/Select.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Components/Modal.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Delete.fs","webpack:///./src/Client/Forms/PhysicalSensor.fs","webpack:///./src/Shared/DtoTypes/PhysicalSensor.fs","webpack:///./src/Client/InfrastructureTypes/Cmds.fs","webpack:///./src/Client/Infrastructure/Table.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Table.fs","webpack:///./src/Client/Page/Admin/PhysicalSensorList.fs","webpack:///./src/Client/Forms/ChoosePhysicalSensor.fs","webpack:///./src/Client/Domain/DeviceLocation.fs","webpack:///./src/Shared/Infrastructure/Double.fs","webpack:///./src/Client/InfrastructureTypes/Inputs.fs","webpack:///./src/Client/InfrastructureTypes/Boolean.fs","webpack:///./src/Client/Components/Select.fs","webpack:///./src/Shared/Infrastructure/Int.fs","webpack:///./src/Client/Forms/MapSensor.fs","webpack:///./src/Shared/Domain/SensorType.fs","webpack:///./src/Shared/IdValue.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Components/Dropdown.fs","webpack:///./src/Client/Page/Admin/MapSensorList.fs","webpack:///./src/Shared/Infrastructure/DateTimeOffset.fs","webpack:///./src/Shared/Infrastructure/Bool.fs","webpack:///./src/Client/Components/Modal.fs","webpack:///./src/Client/Forms/Gateway.fs","webpack:///./src/Client/Components/StatusDot.fs","webpack:///./src/Client/Page/Admin/GatewayList.fs","webpack:///./src/Shared/Infrastructure/Dict.fs","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Components/Panel.fs","webpack:///./src/Client/Components/Flatpickr.fs","webpack:///./src/Client/Forms/User.fs","webpack:///./src/Client/Components/DatePicker.fs","webpack:///./src/Shared/Infrastructure/DateOnly.fs","webpack:///./src/Client/Forms/AddPackage.fs","webpack:///./src/Client/Page/Admin/UserList.fs","webpack:///./src/Client/Forms/LeafletWetnessConfiguration.fs","webpack:///./src/Client/Page/Admin/CalculationConfiguration.fs","webpack:///./src/Client/Page/PasswordLost.fs","webpack:///./src/Client/Page/ResetPassword.fs","webpack:///./src/Client/Components/Graph/AxisTicks.fs","webpack:///./src/Client/Components/Graph/GraphCommon.fs","webpack:///./src/Client/Components/Graph/Graph.AirSensor.fs","webpack:///./src/Client/Components/Graph/Graph.GroundSensor.fs","webpack:///./src/Client/Components/Graph/Graph.RainFallSensor.fs","webpack:///./src/Client/Components/Graph/Graph.LeafletMoistureSensor.fs","webpack:///./src/Client/Components/Graph/Graph.SoilPhSensor.fs","webpack:///./src/Client/Components/Graph/Graph.AverageWindSpeedSensor.fs","webpack:///./src/Client/Components/Graph/Graph.WeatherStation.fs","webpack:///./src/Client/Components/Graph/Graph.LiquidLevelSensor.fs","webpack:///./src/Client/Components/Graph/Graph.SolarRadiationSensor.fs","webpack:///./src/Client/output/fable_modules/Fable.Date.1.0.0/Date.Local.fs","webpack:///./src/Client/output/fable_modules/Fulma.Elmish.0.2.0/DatePicker/Types.fs","webpack:///./src/Client/Components/DateRangePicker.fs","webpack:///./src/Client/output/fable_modules/Feliz.Bulma.2.18.0/ElementBuilders.fs","webpack:///./src/Client/Components/DateRangeSelect.fs","webpack:///./src/Client/Page/User/MapSensorDataPage.fs","webpack:///./src/Shared/Dto/SensorGraphData.fs","webpack:///./src/Client/Infrastructure/Tooltip.fs","webpack:///./src/Shared/Dto/AlertMessage.fs","webpack:///./src/Client/Page/Admin/AlertsList.fs","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Char.js","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Unicode.13.0.0.js","webpack:///./src/Client/output/fable_modules/Fulma.2.14.1/Elements/Form/Help.fs","webpack:///./src/Client/Forms/ContactInfo.fs","webpack:///./src/Client/Forms/AlertForm.fs","webpack:///./src/Client/Forms/BuyAlertPackagesForm.fs","webpack:///./src/Client/InfrastructureTypes/Columns.fs","webpack:///./src/Client/InfrastructureTypes/Html.fs","webpack:///./src/Client/Components/ConfirmationModal.fs","webpack:///./src/Client/Page/User/MyAlerts.fs","webpack:///./src/Client/Page/User/MySensorsData.fs","webpack:///./src/Client/Page/User/UserDefinedMapSensorProperties.fs","webpack:///./src/Client/Page/User/MyMapSensors.fs","webpack:///./src/Client/Forms/RimPro.fs","webpack:///./src/Shared/Tuple.fs","webpack:///./src/Client/output/fable_modules/fable-library.3.7.22/Seq2.js","webpack:///./src/Client/Page/User/RimPro.fs","webpack:///./src/Client/Page/User/MyGateways.fs","webpack:///./src/Client/Components/Graph/Graph.Scab.fs","webpack:///./src/Shared/Dto/Scab.fs","webpack:///./src/Client/Page/User/ScabData.fs","webpack:///./src/Client/Forms/RenameScabStation.fs","webpack:///./src/Client/Page/User/MyScabStations.fs","webpack:///./src/Client/Page/User/MyUserGroups.fs","webpack:///./src/Client/Forms/RenamePeronosporaStation.fs","webpack:///./src/Client/Page/User/MyPeronosporaStations.fs","webpack:///./src/Client/Components/Graph/Graph.Peronospora.fs","webpack:///./src/Client/Page/User/PeronosporaData.fs","webpack:///./src/Client/Forms/UserGroup.fs","webpack:///./src/Client/Page/Admin/GroupList.fs","webpack:///./src/Client/output/fable_modules/Fable.Elmish.React.3.0.1/common.fs","webpack:///./src/Client/output/fable_modules/Fable.Elmish.Browser.3.0.4/navigation.fs","webpack:///./src/Client/Navbar.fs","webpack:///./src/Client/Page/NotFound.fs","webpack:///./src/Client/Index.fs","webpack:///./src/Client/App.fs","webpack:///./src/Client/output/fable_modules/Fable.Elmish.React.3.0.1/react.fs","webpack:///./src/Client/Domain/Location.fs"],"sourcesContent":["// tslint:disable:ban-types\nexport function isIterable(x) {\n return x != null && typeof x === \"object\" && Symbol.iterator in x;\n}\nexport function isArrayLike(x) {\n return Array.isArray(x) || ArrayBuffer.isView(x);\n}\nfunction isComparer(x) {\n return typeof x.Compare === \"function\";\n}\nfunction isComparable(x) {\n return typeof x.CompareTo === \"function\";\n}\nfunction isEquatable(x) {\n return typeof x.Equals === \"function\";\n}\nfunction isHashable(x) {\n return typeof x.GetHashCode === \"function\";\n}\nexport function isDisposable(x) {\n return x != null && typeof x.Dispose === \"function\";\n}\nexport function disposeSafe(x) {\n if (isDisposable(x)) {\n x.Dispose();\n }\n}\nexport function sameConstructor(x, y) {\n var _a, _b;\n return ((_a = Object.getPrototypeOf(x)) === null || _a === void 0 ? void 0 : _a.constructor) === ((_b = Object.getPrototypeOf(y)) === null || _b === void 0 ? void 0 : _b.constructor);\n}\nexport class Enumerator {\n constructor(iter) {\n this.iter = iter;\n }\n [\"System.Collections.Generic.IEnumerator`1.get_Current\"]() {\n return this.current;\n }\n [\"System.Collections.IEnumerator.get_Current\"]() {\n return this.current;\n }\n [\"System.Collections.IEnumerator.MoveNext\"]() {\n const cur = this.iter.next();\n this.current = cur.value;\n return !cur.done;\n }\n [\"System.Collections.IEnumerator.Reset\"]() {\n throw new Error(\"JS iterators cannot be reset\");\n }\n Dispose() {\n return;\n }\n}\nexport function getEnumerator(o) {\n return typeof o.GetEnumerator === \"function\"\n ? o.GetEnumerator()\n : new Enumerator(o[Symbol.iterator]());\n}\nexport function toIterator(en) {\n return {\n [Symbol.iterator]() { return this; },\n next() {\n const hasNext = en[\"System.Collections.IEnumerator.MoveNext\"]();\n const current = hasNext ? en[\"System.Collections.IEnumerator.get_Current\"]() : undefined;\n return { done: !hasNext, value: current };\n },\n };\n}\nexport class Comparer {\n constructor(f) {\n this.Compare = f || compare;\n }\n}\nexport function comparerFromEqualityComparer(comparer) {\n // Sometimes IEqualityComparer also implements IComparer\n if (isComparer(comparer)) {\n return new Comparer(comparer.Compare);\n }\n else {\n return new Comparer((x, y) => {\n const xhash = comparer.GetHashCode(x);\n const yhash = comparer.GetHashCode(y);\n if (xhash === yhash) {\n return comparer.Equals(x, y) ? 0 : -1;\n }\n else {\n return xhash < yhash ? -1 : 1;\n }\n });\n }\n}\nexport function assertEqual(actual, expected, msg) {\n if (!equals(actual, expected)) {\n throw Object.assign(new Error(msg || `Expected: ${expected} - Actual: ${actual}`), {\n actual,\n expected,\n });\n }\n}\nexport function assertNotEqual(actual, expected, msg) {\n if (equals(actual, expected)) {\n throw Object.assign(new Error(msg || `Expected: ${expected} - Actual: ${actual}`), {\n actual,\n expected,\n });\n }\n}\nexport class Lazy {\n constructor(factory) {\n this.factory = factory;\n this.isValueCreated = false;\n }\n get Value() {\n if (!this.isValueCreated) {\n this.createdValue = this.factory();\n this.isValueCreated = true;\n }\n return this.createdValue;\n }\n get IsValueCreated() {\n return this.isValueCreated;\n }\n}\nexport function lazyFromValue(v) {\n return new Lazy(() => v);\n}\nexport function padWithZeros(i, length) {\n let str = i.toString(10);\n while (str.length < length) {\n str = \"0\" + str;\n }\n return str;\n}\nexport function padLeftAndRightWithZeros(i, lengthLeft, lengthRight) {\n let str = i.toString(10);\n while (str.length < lengthLeft) {\n str = \"0\" + str;\n }\n while (str.length < lengthRight) {\n str = str + \"0\";\n }\n return str;\n}\nexport function dateOffset(date) {\n const date1 = date;\n return typeof date1.offset === \"number\"\n ? date1.offset\n : (date.kind === 1 /* UTC */\n ? 0 : date.getTimezoneOffset() * -60000);\n}\nexport function int16ToString(i, radix) {\n i = i < 0 && radix != null && radix !== 10 ? 0xFFFF + i + 1 : i;\n return i.toString(radix);\n}\nexport function int32ToString(i, radix) {\n i = i < 0 && radix != null && radix !== 10 ? 0xFFFFFFFF + i + 1 : i;\n return i.toString(radix);\n}\nexport class ObjectRef {\n static id(o) {\n if (!ObjectRef.idMap.has(o)) {\n ObjectRef.idMap.set(o, ++ObjectRef.count);\n }\n return ObjectRef.idMap.get(o);\n }\n}\nObjectRef.idMap = new WeakMap();\nObjectRef.count = 0;\nexport function stringHash(s) {\n let i = 0;\n let h = 5381;\n const len = s.length;\n while (i < len) {\n h = (h * 33) ^ s.charCodeAt(i++);\n }\n return h;\n}\nexport function numberHash(x) {\n return x * 2654435761 | 0;\n}\n// From https://stackoverflow.com/a/37449594\nexport function combineHashCodes(hashes) {\n if (hashes.length === 0) {\n return 0;\n }\n return hashes.reduce((h1, h2) => {\n return ((h1 << 5) + h1) ^ h2;\n });\n}\nexport function physicalHash(x) {\n if (x == null) {\n return 0;\n }\n switch (typeof x) {\n case \"boolean\":\n return x ? 1 : 0;\n case \"number\":\n return numberHash(x);\n case \"string\":\n return stringHash(x);\n default:\n return numberHash(ObjectRef.id(x));\n }\n}\nexport function identityHash(x) {\n if (x == null) {\n return 0;\n }\n else if (isHashable(x)) {\n return x.GetHashCode();\n }\n else {\n return physicalHash(x);\n }\n}\nexport function dateHash(x) {\n return x.getTime();\n}\nexport function arrayHash(x) {\n const len = x.length;\n const hashes = new Array(len);\n for (let i = 0; i < len; i++) {\n hashes[i] = structuralHash(x[i]);\n }\n return combineHashCodes(hashes);\n}\nexport function structuralHash(x) {\n var _a;\n if (x == null) {\n return 0;\n }\n switch (typeof x) {\n case \"boolean\":\n return x ? 1 : 0;\n case \"number\":\n return numberHash(x);\n case \"string\":\n return stringHash(x);\n default: {\n if (isHashable(x)) {\n return x.GetHashCode();\n }\n else if (isArrayLike(x)) {\n return arrayHash(x);\n }\n else if (x instanceof Date) {\n return dateHash(x);\n }\n else if (((_a = Object.getPrototypeOf(x)) === null || _a === void 0 ? void 0 : _a.constructor) === Object) {\n // TODO: check call-stack to prevent cyclic objects?\n const hashes = Object.values(x).map((v) => structuralHash(v));\n return combineHashCodes(hashes);\n }\n else {\n // Classes don't implement GetHashCode by default, but must use identity hashing\n return numberHash(ObjectRef.id(x));\n // return stringHash(String(x));\n }\n }\n }\n}\n// Intended for custom numeric types, like long or decimal\nexport function fastStructuralHash(x) {\n return stringHash(String(x));\n}\n// Intended for declared types that may or may not implement GetHashCode\nexport function safeHash(x) {\n return x == null ? 0 : isHashable(x) ? x.GetHashCode() : numberHash(ObjectRef.id(x));\n}\nexport function equalArraysWith(x, y, eq) {\n if (x == null) {\n return y == null;\n }\n if (y == null) {\n return false;\n }\n if (x.length !== y.length) {\n return false;\n }\n for (let i = 0; i < x.length; i++) {\n if (!eq(x[i], y[i])) {\n return false;\n }\n }\n return true;\n}\nexport function equalArrays(x, y) {\n return equalArraysWith(x, y, equals);\n}\nfunction equalObjects(x, y) {\n const xKeys = Object.keys(x);\n const yKeys = Object.keys(y);\n if (xKeys.length !== yKeys.length) {\n return false;\n }\n xKeys.sort();\n yKeys.sort();\n for (let i = 0; i < xKeys.length; i++) {\n if (xKeys[i] !== yKeys[i] || !equals(x[xKeys[i]], y[yKeys[i]])) {\n return false;\n }\n }\n return true;\n}\nexport function equals(x, y) {\n var _a;\n if (x === y) {\n return true;\n }\n else if (x == null) {\n return y == null;\n }\n else if (y == null) {\n return false;\n }\n else if (typeof x !== \"object\") {\n return false;\n }\n else if (isEquatable(x)) {\n return x.Equals(y);\n }\n else if (isArrayLike(x)) {\n return isArrayLike(y) && equalArrays(x, y);\n }\n else if (x instanceof Date) {\n return (y instanceof Date) && compareDates(x, y) === 0;\n }\n else {\n return ((_a = Object.getPrototypeOf(x)) === null || _a === void 0 ? void 0 : _a.constructor) === Object && equalObjects(x, y);\n }\n}\nexport function compareDates(x, y) {\n let xtime;\n let ytime;\n // DateTimeOffset and DateTime deals with equality differently.\n if (\"offset\" in x && \"offset\" in y) {\n xtime = x.getTime();\n ytime = y.getTime();\n }\n else {\n xtime = x.getTime() + dateOffset(x);\n ytime = y.getTime() + dateOffset(y);\n }\n return xtime === ytime ? 0 : (xtime < ytime ? -1 : 1);\n}\nexport function comparePrimitives(x, y) {\n return x === y ? 0 : (x < y ? -1 : 1);\n}\nexport function compareArraysWith(x, y, comp) {\n if (x == null) {\n return y == null ? 0 : 1;\n }\n if (y == null) {\n return -1;\n }\n if (x.length !== y.length) {\n return x.length < y.length ? -1 : 1;\n }\n for (let i = 0, j = 0; i < x.length; i++) {\n j = comp(x[i], y[i]);\n if (j !== 0) {\n return j;\n }\n }\n return 0;\n}\nexport function compareArrays(x, y) {\n return compareArraysWith(x, y, compare);\n}\nfunction compareObjects(x, y) {\n const xKeys = Object.keys(x);\n const yKeys = Object.keys(y);\n if (xKeys.length !== yKeys.length) {\n return xKeys.length < yKeys.length ? -1 : 1;\n }\n xKeys.sort();\n yKeys.sort();\n for (let i = 0, j = 0; i < xKeys.length; i++) {\n const key = xKeys[i];\n if (key !== yKeys[i]) {\n return key < yKeys[i] ? -1 : 1;\n }\n else {\n j = compare(x[key], y[key]);\n if (j !== 0) {\n return j;\n }\n }\n }\n return 0;\n}\nexport function compare(x, y) {\n var _a;\n if (x === y) {\n return 0;\n }\n else if (x == null) {\n return y == null ? 0 : -1;\n }\n else if (y == null) {\n return 1;\n }\n else if (typeof x !== \"object\") {\n return x < y ? -1 : 1;\n }\n else if (isComparable(x)) {\n return x.CompareTo(y);\n }\n else if (isArrayLike(x)) {\n return isArrayLike(y) ? compareArrays(x, y) : -1;\n }\n else if (x instanceof Date) {\n return y instanceof Date ? compareDates(x, y) : -1;\n }\n else {\n return ((_a = Object.getPrototypeOf(x)) === null || _a === void 0 ? void 0 : _a.constructor) === Object ? compareObjects(x, y) : -1;\n }\n}\nexport function min(comparer, x, y) {\n return comparer(x, y) < 0 ? x : y;\n}\nexport function max(comparer, x, y) {\n return comparer(x, y) > 0 ? x : y;\n}\nexport function clamp(comparer, value, min, max) {\n return (comparer(value, min) < 0) ? min : (comparer(value, max) > 0) ? max : value;\n}\nexport function createAtom(value) {\n let atom = value;\n return (value, isSetter) => {\n if (!isSetter) {\n return atom;\n }\n else {\n atom = value;\n return void 0;\n }\n };\n}\nexport function createObj(fields) {\n const obj = {};\n for (const kv of fields) {\n obj[kv[0]] = kv[1];\n }\n return obj;\n}\nexport function jsOptions(mutator) {\n const opts = {};\n mutator(opts);\n return opts;\n}\nexport function round(value, digits = 0) {\n const m = Math.pow(10, digits);\n const n = +(digits ? value * m : value).toFixed(8);\n const i = Math.floor(n);\n const f = n - i;\n const e = 1e-8;\n const r = (f > 0.5 - e && f < 0.5 + e) ? ((i % 2 === 0) ? i : i + 1) : Math.round(n);\n return digits ? r / m : r;\n}\nexport function sign(x) {\n return x > 0 ? 1 : x < 0 ? -1 : 0;\n}\nexport function unescapeDataString(s) {\n // https://stackoverflow.com/a/4458580/524236\n return decodeURIComponent((s).replace(/\\+/g, \"%20\"));\n}\nexport function escapeDataString(s) {\n return encodeURIComponent(s).replace(/!/g, \"%21\")\n .replace(/'/g, \"%27\")\n .replace(/\\(/g, \"%28\")\n .replace(/\\)/g, \"%29\")\n .replace(/\\*/g, \"%2A\");\n}\nexport function escapeUriString(s) {\n return encodeURI(s);\n}\n// ICollection.Clear and Count members can be called on Arrays\n// or Dictionaries so we need a runtime check (see #1120)\nexport function count(col) {\n if (isArrayLike(col)) {\n return col.length;\n }\n else {\n let count = 0;\n for (const _ of col) {\n count++;\n }\n return count;\n }\n}\nexport function clear(col) {\n if (isArrayLike(col)) {\n col.splice(0);\n }\n else {\n col.clear();\n }\n}\nconst CURRIED = Symbol(\"curried\");\nexport function uncurry(arity, f) {\n // f may be a function option with None value\n if (f == null || f.length > 1) {\n return f;\n }\n const uncurried = (...args) => {\n let res = f;\n for (let i = 0; i < arity; i++) {\n res = res(args[i]);\n }\n return res;\n };\n uncurried[CURRIED] = f;\n return uncurried;\n}\nfunction _curry(args, arity, f) {\n return (arg) => arity === 1\n ? f(...args.concat([arg]))\n // Note it's important to generate a new args array every time\n // because a partially applied function can be run multiple times\n : _curry(args.concat([arg]), arity - 1, f);\n}\nexport function curry(arity, f) {\n if (f == null || f.length === 1) {\n return f;\n }\n else if (CURRIED in f) {\n return f[CURRIED];\n }\n else {\n return _curry([], arity, f);\n }\n}\nexport function checkArity(arity, f) {\n return f.length > arity\n ? (...args1) => (...args2) => f.apply(undefined, args1.concat(args2))\n : f;\n}\nexport function partialApply(arity, f, args) {\n if (f == null) {\n return undefined;\n }\n else if (CURRIED in f) {\n f = f[CURRIED];\n for (let i = 0; i < args.length; i++) {\n f = f(args[i]);\n }\n return f;\n }\n else {\n return _curry(args, arity, f);\n }\n}\nexport function mapCurriedArgs(fn, mappings) {\n function mapArg(fn, arg, mappings, idx) {\n const mapping = mappings[idx];\n if (mapping !== 0) {\n const expectedArity = mapping[0];\n const actualArity = mapping[1];\n if (expectedArity > 1) {\n arg = curry(expectedArity, arg);\n }\n if (actualArity > 1) {\n arg = uncurry(actualArity, arg);\n }\n }\n const res = fn(arg);\n if (idx + 1 === mappings.length) {\n return res;\n }\n else {\n return (arg) => mapArg(res, arg, mappings, idx + 1);\n }\n }\n return (arg) => mapArg(fn, arg, mappings, 0);\n}\n","import { compare, equals, structuralHash } from \"./Util.js\";\n// Using a class here for better compatibility with TS files importing Some\nexport class Some {\n constructor(value) {\n this.value = value;\n }\n toJSON() {\n return this.value;\n }\n // Don't add \"Some\" for consistency with erased options\n toString() {\n return String(this.value);\n }\n GetHashCode() {\n return structuralHash(this.value);\n }\n Equals(other) {\n if (other == null) {\n return false;\n }\n else {\n return equals(this.value, other instanceof Some ? other.value : other);\n }\n }\n CompareTo(other) {\n if (other == null) {\n return 1;\n }\n else {\n return compare(this.value, other instanceof Some ? other.value : other);\n }\n }\n}\nexport function some(x) {\n return x == null || x instanceof Some ? new Some(x) : x;\n}\nexport function value(x) {\n if (x == null) {\n throw new Error(\"Option has no value\");\n }\n else {\n return x instanceof Some ? x.value : x;\n }\n}\nexport function ofNullable(x) {\n // This will fail with unit probably, an alternative would be:\n // return x === null ? undefined : (x === undefined ? new Some(x) : x);\n return x == null ? undefined : x;\n}\nexport function toNullable(x) {\n return x == null ? null : value(x);\n}\nexport function flatten(x) {\n return x == null ? undefined : value(x);\n}\nexport function toArray(opt) {\n return (opt == null) ? [] : [value(opt)];\n}\nexport function defaultArg(opt, defaultValue) {\n return (opt != null) ? value(opt) : defaultValue;\n}\nexport function defaultArgWith(opt, defThunk) {\n return (opt != null) ? value(opt) : defThunk();\n}\nexport function orElse(opt, ifNone) {\n return opt == null ? ifNone : opt;\n}\nexport function orElseWith(opt, ifNoneThunk) {\n return opt == null ? ifNoneThunk() : opt;\n}\nexport function filter(predicate, opt) {\n return (opt != null) ? (predicate(value(opt)) ? opt : undefined) : opt;\n}\nexport function map(mapping, opt) {\n return (opt != null) ? some(mapping(value(opt))) : undefined;\n}\nexport function map2(mapping, opt1, opt2) {\n return (opt1 != null && opt2 != null) ? mapping(value(opt1), value(opt2)) : undefined;\n}\nexport function map3(mapping, opt1, opt2, opt3) {\n return (opt1 != null && opt2 != null && opt3 != null) ? mapping(value(opt1), value(opt2), value(opt3)) : undefined;\n}\nexport function bind(binder, opt) {\n return opt != null ? binder(value(opt)) : undefined;\n}\nexport function tryOp(op, arg) {\n try {\n return some(op(arg));\n }\n catch (_a) {\n return undefined;\n }\n}\n","import { combineHashCodes, compare, compareArrays, equalArrays, equals, sameConstructor, numberHash, structuralHash } from \"./Util.js\";\nexport function seqToString(self) {\n let count = 0;\n let str = \"[\";\n for (const x of self) {\n if (count === 0) {\n str += toString(x);\n }\n else if (count === 100) {\n str += \"; ...\";\n break;\n }\n else {\n str += \"; \" + toString(x);\n }\n count++;\n }\n return str + \"]\";\n}\nexport function toString(x, callStack = 0) {\n var _a, _b;\n if (x != null && typeof x === \"object\") {\n if (typeof x.toString === \"function\") {\n return x.toString();\n }\n else if (Symbol.iterator in x) {\n return seqToString(x);\n }\n else { // TODO: Date?\n const cons = (_a = Object.getPrototypeOf(x)) === null || _a === void 0 ? void 0 : _a.constructor;\n return cons === Object && callStack < 10\n // Same format as recordToString\n ? \"{ \" + Object.entries(x).map(([k, v]) => k + \" = \" + toString(v, callStack + 1)).join(\"\\n \") + \" }\"\n : (_b = cons === null || cons === void 0 ? void 0 : cons.name) !== null && _b !== void 0 ? _b : \"\";\n }\n }\n return String(x);\n}\nexport function unionToString(name, fields) {\n if (fields.length === 0) {\n return name;\n }\n else {\n let fieldStr = \"\";\n let withParens = true;\n if (fields.length === 1) {\n fieldStr = toString(fields[0]);\n withParens = fieldStr.indexOf(\" \") >= 0;\n }\n else {\n fieldStr = fields.map((x) => toString(x)).join(\", \");\n }\n return name + (withParens ? \" (\" : \" \") + fieldStr + (withParens ? \")\" : \"\");\n }\n}\nexport class Union {\n get name() {\n return this.cases()[this.tag];\n }\n toJSON() {\n return this.fields.length === 0 ? this.name : [this.name].concat(this.fields);\n }\n toString() {\n return unionToString(this.name, this.fields);\n }\n GetHashCode() {\n const hashes = this.fields.map((x) => structuralHash(x));\n hashes.splice(0, 0, numberHash(this.tag));\n return combineHashCodes(hashes);\n }\n Equals(other) {\n if (this === other) {\n return true;\n }\n else if (!sameConstructor(this, other)) {\n return false;\n }\n else if (this.tag === other.tag) {\n return equalArrays(this.fields, other.fields);\n }\n else {\n return false;\n }\n }\n CompareTo(other) {\n if (this === other) {\n return 0;\n }\n else if (!sameConstructor(this, other)) {\n return -1;\n }\n else if (this.tag === other.tag) {\n return compareArrays(this.fields, other.fields);\n }\n else {\n return this.tag < other.tag ? -1 : 1;\n }\n }\n}\nfunction recordToJSON(self) {\n const o = {};\n const keys = Object.keys(self);\n for (let i = 0; i < keys.length; i++) {\n o[keys[i]] = self[keys[i]];\n }\n return o;\n}\nfunction recordToString(self) {\n return \"{ \" + Object.entries(self).map(([k, v]) => k + \" = \" + toString(v)).join(\"\\n \") + \" }\";\n}\nfunction recordGetHashCode(self) {\n const hashes = Object.values(self).map((v) => structuralHash(v));\n return combineHashCodes(hashes);\n}\nfunction recordEquals(self, other) {\n if (self === other) {\n return true;\n }\n else if (!sameConstructor(self, other)) {\n return false;\n }\n else {\n const thisNames = Object.keys(self);\n for (let i = 0; i < thisNames.length; i++) {\n if (!equals(self[thisNames[i]], other[thisNames[i]])) {\n return false;\n }\n }\n return true;\n }\n}\nfunction recordCompareTo(self, other) {\n if (self === other) {\n return 0;\n }\n else if (!sameConstructor(self, other)) {\n return -1;\n }\n else {\n const thisNames = Object.keys(self);\n for (let i = 0; i < thisNames.length; i++) {\n const result = compare(self[thisNames[i]], other[thisNames[i]]);\n if (result !== 0) {\n return result;\n }\n }\n return 0;\n }\n}\nexport class Record {\n toJSON() { return recordToJSON(this); }\n toString() { return recordToString(this); }\n GetHashCode() { return recordGetHashCode(this); }\n Equals(other) { return recordEquals(this, other); }\n CompareTo(other) { return recordCompareTo(this, other); }\n}\nexport class FSharpRef {\n constructor(contentsOrGetter, setter) {\n if (typeof setter === \"function\") {\n this.getter = contentsOrGetter;\n this.setter = setter;\n }\n else {\n this.getter = () => contentsOrGetter;\n this.setter = (v) => { contentsOrGetter = v; };\n }\n }\n get contents() {\n return this.getter();\n }\n set contents(v) {\n this.setter(v);\n }\n}\n// EXCEPTIONS\n// Exception is intentionally not derived from Error, for performance reasons (see #2160)\nexport class Exception {\n constructor(message) {\n this.message = message;\n }\n}\nexport function isException(x) {\n return x instanceof Exception || x instanceof Error;\n}\nexport function ensureErrorOrException(e) {\n return isException(e) ? e : new Error(String(e));\n}\nexport class FSharpException extends Exception {\n toJSON() { return recordToJSON(this); }\n toString() { return recordToString(this); }\n GetHashCode() { return recordGetHashCode(this); }\n Equals(other) { return recordEquals(this, other); }\n CompareTo(other) { return recordCompareTo(this, other); }\n}\nexport class MatchFailureException extends FSharpException {\n constructor(arg1, arg2, arg3) {\n super();\n this.arg1 = arg1;\n this.arg2 = arg2 | 0;\n this.arg3 = arg3 | 0;\n this.message = \"The match cases were incomplete\";\n }\n}\nexport class Attribute {\n}\n","// export type decimal = Decimal;\nexport var NumberStyles;\n(function (NumberStyles) {\n // None = 0x00000000,\n // AllowLeadingWhite = 0x00000001,\n // AllowTrailingWhite = 0x00000002,\n // AllowLeadingSign = 0x00000004,\n // AllowTrailingSign = 0x00000008,\n // AllowParentheses = 0x00000010,\n // AllowDecimalPoint = 0x00000020,\n // AllowThousands = 0x00000040,\n // AllowExponent = 0x00000080,\n // AllowCurrencySymbol = 0x00000100,\n NumberStyles[NumberStyles[\"AllowHexSpecifier\"] = 512] = \"AllowHexSpecifier\";\n // Integer = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign,\n // HexNumber = AllowLeadingWhite | AllowTrailingWhite | AllowHexSpecifier,\n // Number = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign |\n // AllowTrailingSign | AllowDecimalPoint | AllowThousands,\n // Float = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign |\n // AllowDecimalPoint | AllowExponent,\n // Currency = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign |\n // AllowParentheses | AllowDecimalPoint | AllowThousands | AllowCurrencySymbol,\n // Any = AllowLeadingWhite | AllowTrailingWhite | AllowLeadingSign | AllowTrailingSign |\n // AllowParentheses | AllowDecimalPoint | AllowThousands | AllowCurrencySymbol | AllowExponent,\n})(NumberStyles || (NumberStyles = {}));\nfunction validResponse(regexMatch, radix) {\n const [/*all*/ , sign, prefix, digits] = regexMatch;\n return {\n sign: sign || \"\",\n prefix: prefix || \"\",\n digits,\n radix,\n };\n}\nfunction getRange(unsigned, bitsize) {\n switch (bitsize) {\n case 8: return unsigned ? [0, 255] : [-128, 127];\n case 16: return unsigned ? [0, 65535] : [-32768, 32767];\n case 32: return unsigned ? [0, 4294967295] : [-2147483648, 2147483647];\n default: throw new Error(\"Invalid bit size.\");\n }\n}\nfunction getInvalidDigits(radix) {\n switch (radix) {\n case 2: return /[^0-1]/;\n case 8: return /[^0-7]/;\n case 10: return /[^0-9]/;\n case 16: return /[^0-9a-fA-F]/;\n default:\n throw new Error(\"Invalid Base.\");\n }\n}\nfunction getRadix(prefix, style) {\n if (style & NumberStyles.AllowHexSpecifier) {\n return 16;\n }\n else {\n switch (prefix) {\n case \"0b\":\n case \"0B\": return 2;\n case \"0o\":\n case \"0O\": return 8;\n case \"0x\":\n case \"0X\": return 16;\n default: return 10;\n }\n }\n}\nexport function isValid(str, style, radix) {\n const integerRegex = /^\\s*([\\+\\-])?(0[xXoObB])?([0-9a-fA-F]+)\\s*$/;\n const res = integerRegex.exec(str.replace(/_/g, \"\"));\n if (res != null) {\n const [/*all*/ , /*sign*/ , prefix, digits] = res;\n radix = radix || getRadix(prefix, style);\n const invalidDigits = getInvalidDigits(radix);\n if (!invalidDigits.test(digits)) {\n return validResponse(res, radix);\n }\n }\n return null;\n}\nexport function parse(str, style, unsigned, bitsize, radix) {\n const res = isValid(str, style, radix);\n if (res != null) {\n let v = Number.parseInt(res.sign + res.digits, res.radix);\n if (!Number.isNaN(v)) {\n const [umin, umax] = getRange(true, bitsize);\n if (!unsigned && res.radix !== 10 && v >= umin && v <= umax) {\n v = v << (32 - bitsize) >> (32 - bitsize);\n }\n const [min, max] = getRange(unsigned, bitsize);\n if (v >= min && v <= max) {\n return v;\n }\n }\n }\n throw new Error(\"Input string was not in a correct format.\");\n}\nexport function tryParse(str, style, unsigned, bitsize, defValue) {\n try {\n defValue.contents = parse(str, style, unsigned, bitsize);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nexport function op_UnaryNegation_Int8(x) {\n return x === -128 ? x : -x;\n}\nexport function op_UnaryNegation_Int16(x) {\n return x === -32768 ? x : -x;\n}\nexport function op_UnaryNegation_Int32(x) {\n return x === -2147483648 ? x : -x;\n}\nexport function divRem(x, y, out) {\n const div = ~~(x / y);\n const rem = x % y;\n if (out != null) {\n out.contents = rem;\n return div;\n }\n else {\n return [div, rem];\n }\n}\n","export const symbol = Symbol(\"numeric\");\nexport function isNumeric(x) {\n return typeof x === \"number\" || (x === null || x === void 0 ? void 0 : x[symbol]);\n}\nexport function compare(x, y) {\n if (typeof x === \"number\") {\n return x < y ? -1 : (x > y ? 1 : 0);\n }\n else {\n return x.CompareTo(y);\n }\n}\nexport function multiply(x, y) {\n if (typeof x === \"number\") {\n return x * y;\n }\n else {\n return x[symbol]().multiply(y);\n }\n}\nexport function toFixed(x, dp) {\n if (typeof x === \"number\") {\n return x.toFixed(dp);\n }\n else {\n return x[symbol]().toFixed(dp);\n }\n}\nexport function toPrecision(x, sd) {\n if (typeof x === \"number\") {\n return x.toPrecision(sd);\n }\n else {\n return x[symbol]().toPrecision(sd);\n }\n}\nexport function toExponential(x, dp) {\n if (typeof x === \"number\") {\n return x.toExponential(dp);\n }\n else {\n return x[symbol]().toExponential(dp);\n }\n}\nexport function toHex(x) {\n if (typeof x === \"number\") {\n return (Number(x) >>> 0).toString(16);\n }\n else {\n return x[symbol]().toHex();\n }\n}\n","// Adapted from: https://github.com/dcodeIO/long.js/blob/master/src/long.js\n// Apache License 2.0: https://github.com/dcodeIO/long.js/blob/master/LICENSE\n/* tslint:disable */\nimport { symbol } from \"../Numeric.js\";\n/**\n * wasm optimizations, to do native i64 multiplication and divide\n */\nvar wasm = null;\ntry {\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\n ])), {}).exports;\n}\ncatch (e) {\n // no wasm support :(\n}\n/**\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\n * See the from* functions below for more convenient ways of constructing Longs.\n * @exports Long\n * @class A Long class for representing a 64 bit two's-complement integer value.\n * @param {number} low The low (signed) 32 bits of the long\n * @param {number} high The high (signed) 32 bits of the long\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @constructor\n */\nexport function Long(low, high, unsigned) {\n /**\n * The low 32 bits as a signed value.\n * @type {number}\n */\n this.low = low | 0;\n /**\n * The high 32 bits as a signed value.\n * @type {number}\n */\n this.high = high | 0;\n /**\n * Whether unsigned or not.\n * @type {boolean}\n */\n this.unsigned = !!unsigned;\n}\nLong.prototype.GetHashCode = function () {\n let h1 = this.unsigned ? 1 : 0;\n h1 = ((h1 << 5) + h1) ^ this.high;\n h1 = ((h1 << 5) + h1) ^ this.low;\n return h1;\n};\nLong.prototype.Equals = function (x) { return equals(this, x); };\nLong.prototype.CompareTo = function (x) { return compare(this, x); };\nLong.prototype.toString = function (radix) { return toString(this, radix); };\nLong.prototype.toJSON = function () { return toString(this); };\nLong.prototype[symbol] = function () {\n const x = this;\n return {\n multiply: y => multiply(x, y),\n toPrecision: sd => String(x) + (0).toPrecision(sd).substr(1),\n toExponential: dp => String(x) + (0).toExponential(dp).substr(1),\n toFixed: dp => String(x) + (0).toFixed(dp).substr(1),\n toHex: () => toString(x.unsigned ? x : fromBytes(toBytes(x), true), 16),\n };\n};\n// The internal representation of a long is the two given signed, 32-bit values.\n// We use 32-bit pieces because these are the size of integers on which\n// Javascript performs bit-operations. For operations like addition and\n// multiplication, we split each number into 16 bit pieces, which can easily be\n// multiplied within Javascript's floating-point representation without overflow\n// or change in sign.\n//\n// In the algorithms below, we frequently reduce the negative case to the\n// positive case by negating the input(s) and then post-processing the result.\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n// a positive number, it overflows back into a negative). Not handling this\n// case would often result in infinite recursion.\n//\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\n// methods on which they depend.\n/**\n * An indicator used to reliably determine if an object is a Long or not.\n * @type {boolean}\n * @const\n * @private\n */\nLong.prototype.__isLong__;\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\n/**\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n * @inner\n */\nexport function isLong(obj) {\n return (obj && obj[\"__isLong__\"]) === true;\n}\n/**\n * Tests if the specified object is a Long.\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n */\n// Long.isLong = isLong;\n/**\n * A cache of the Long representations of small integer values.\n * @type {!Object}\n * @inner\n */\nvar INT_CACHE = {};\n/**\n * A cache of the Long representations of small unsigned integer values.\n * @type {!Object}\n * @inner\n */\nvar UINT_CACHE = {};\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nexport function fromInt(value, unsigned) {\n var obj, cachedObj, cache;\n if (unsigned) {\n value >>>= 0;\n if (cache = (0 <= value && value < 256)) {\n cachedObj = UINT_CACHE[value];\n if (cachedObj)\n return cachedObj;\n }\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\n if (cache)\n UINT_CACHE[value] = obj;\n return obj;\n }\n else {\n value |= 0;\n if (cache = (-128 <= value && value < 128)) {\n cachedObj = INT_CACHE[value];\n if (cachedObj)\n return cachedObj;\n }\n obj = fromBits(value, value < 0 ? -1 : 0, false);\n if (cache)\n INT_CACHE[value] = obj;\n return obj;\n }\n}\n/**\n * Returns a Long representing the given 32 bit integer value.\n * @function\n * @param {number} value The 32 bit integer in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\n// Long.fromInt = fromInt;\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nexport function fromNumber(value, unsigned) {\n if (isNaN(value))\n return unsigned ? UZERO : ZERO;\n if (unsigned) {\n if (value < 0)\n return UZERO;\n if (value >= TWO_PWR_64_DBL)\n return MAX_UNSIGNED_VALUE;\n }\n else {\n if (value <= -TWO_PWR_63_DBL)\n return MIN_VALUE;\n if (value + 1 >= TWO_PWR_63_DBL)\n return MAX_VALUE;\n }\n if (value < 0)\n return negate(fromNumber(-value, unsigned));\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\n}\n/**\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\n * @function\n * @param {number} value The number in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\n// Long.fromNumber = fromNumber;\n/**\n * @param {number} lowBits\n * @param {number} highBits\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nexport function fromBits(lowBits, highBits, unsigned) {\n return new Long(lowBits, highBits, unsigned);\n}\n/**\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\n * assumed to use 32 bits.\n * @function\n * @param {number} lowBits The low 32 bits\n * @param {number} highBits The high 32 bits\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\n// Long.fromBits = fromBits;\n/**\n * @function\n * @param {number} base\n * @param {number} exponent\n * @returns {number}\n * @inner\n */\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\n/**\n * @param {string} str\n * @param {(boolean|number)=} unsigned\n * @param {number=} radix\n * @returns {!Long}\n * @inner\n */\nexport function fromString(str, unsigned, radix) {\n if (str.length === 0)\n throw Error('empty string');\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\n return ZERO;\n if (typeof unsigned === 'number') {\n // For goog.math.long compatibility\n radix = unsigned,\n unsigned = false;\n }\n else {\n unsigned = !!unsigned;\n }\n radix = radix || 10;\n if (radix < 2 || 36 < radix)\n throw RangeError('radix');\n var p = str.indexOf('-');\n if (p > 0)\n throw Error('interior hyphen');\n else if (p === 0) {\n return negate(fromString(str.substring(1), unsigned, radix));\n }\n // Do several (8) digits each time through the loop, so as to\n // minimize the calls to the very expensive emulated div.\n var radixToPower = fromNumber(pow_dbl(radix, 8));\n var result = ZERO;\n for (var i = 0; i < str.length; i += 8) {\n var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix);\n if (size < 8) {\n var power = fromNumber(pow_dbl(radix, size));\n result = add(multiply(result, power), fromNumber(value));\n }\n else {\n result = multiply(result, radixToPower);\n result = add(result, fromNumber(value));\n }\n }\n result.unsigned = unsigned;\n return result;\n}\n/**\n * Returns a Long representation of the given string, written using the specified radix.\n * @function\n * @param {string} str The textual representation of the Long\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\n * @returns {!Long} The corresponding Long value\n */\n// Long.fromString = fromString;\n/**\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nexport function fromValue(val, unsigned) {\n if (typeof val === 'number')\n return fromNumber(val, unsigned);\n if (typeof val === 'string')\n return fromString(val, unsigned);\n // Throws for non-objects, converts non-instanceof Long:\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\n}\n/**\n * Converts the specified value to a Long using the appropriate from* function for its type.\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long}\n */\n// Long.fromValue = fromValue;\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\n// no runtime penalty for these.\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_16_DBL = 1 << 16;\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_24_DBL = 1 << 24;\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\n/**\n * @type {!Long}\n * @const\n * @inner\n */\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\n/**\n * @type {!Long}\n * @inner\n */\nexport var ZERO = fromInt(0);\n/**\n * Signed zero.\n * @type {!Long}\n */\n// Long.ZERO = ZERO;\n/**\n * @type {!Long}\n * @inner\n */\nexport var UZERO = fromInt(0, true);\n/**\n * Unsigned zero.\n * @type {!Long}\n */\n// Long.UZERO = UZERO;\n/**\n * @type {!Long}\n * @inner\n */\nexport var ONE = fromInt(1);\n/**\n * Signed one.\n * @type {!Long}\n */\n// Long.ONE = ONE;\n/**\n * @type {!Long}\n * @inner\n */\nexport var UONE = fromInt(1, true);\n/**\n * Unsigned one.\n * @type {!Long}\n */\n// Long.UONE = UONE;\n/**\n * @type {!Long}\n * @inner\n */\nexport var NEG_ONE = fromInt(-1);\n/**\n * Signed negative one.\n * @type {!Long}\n */\n// Long.NEG_ONE = NEG_ONE;\n/**\n * @type {!Long}\n * @inner\n */\nexport var MAX_VALUE = fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0, false);\n/**\n * Maximum signed value.\n * @type {!Long}\n */\n// Long.MAX_VALUE = MAX_VALUE;\n/**\n * @type {!Long}\n * @inner\n */\nexport var MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF | 0, 0xFFFFFFFF | 0, true);\n/**\n * Maximum unsigned value.\n * @type {!Long}\n */\n// Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\n/**\n * @type {!Long}\n * @inner\n */\nexport var MIN_VALUE = fromBits(0, 0x80000000 | 0, false);\n/**\n * Minimum signed value.\n * @type {!Long}\n */\n// Long.MIN_VALUE = MIN_VALUE;\n/**\n * @alias Long.prototype\n * @inner\n */\n// var LongPrototype = Long.prototype;\n/**\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\n * @this {!Long}\n * @returns {number}\n */\nexport function toInt($this) {\n return $this.unsigned ? $this.low >>> 0 : $this.low;\n}\n;\n/**\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\n * @this {!Long}\n * @returns {number}\n */\nexport function toNumber($this) {\n if ($this.unsigned)\n return (($this.high >>> 0) * TWO_PWR_32_DBL) + ($this.low >>> 0);\n return $this.high * TWO_PWR_32_DBL + ($this.low >>> 0);\n}\n;\n/**\n * Converts the Long to a string written in the specified radix.\n * @this {!Long}\n * @param {number=} radix Radix (2-36), defaults to 10\n * @returns {string}\n * @override\n * @throws {RangeError} If `radix` is out of range\n */\nexport function toString($this, radix) {\n radix = radix || 10;\n if (radix < 2 || 36 < radix)\n throw RangeError('radix');\n if (isZero($this))\n return '0';\n if (isNegative($this)) { // Unsigned Longs are never negative\n if (equals($this, MIN_VALUE)) {\n // We need to change the Long value before it can be negated, so we remove\n // the bottom-most digit in this base and then recurse to do the rest.\n var radixLong = fromNumber(radix), div = divide($this, radixLong), rem1 = subtract(multiply(div, radixLong), $this);\n return toString(div, radix) + toInt(rem1).toString(radix);\n }\n else\n return '-' + toString(negate($this), radix);\n }\n // Do several (6) digits each time through the loop, so as to\n // minimize the calls to the very expensive emulated div.\n var radixToPower = fromNumber(pow_dbl(radix, 6), $this.unsigned), rem = $this;\n var result = '';\n while (true) {\n var remDiv = divide(rem, radixToPower), intval = toInt(subtract(rem, multiply(remDiv, radixToPower))) >>> 0, digits = intval.toString(radix);\n rem = remDiv;\n if (isZero(rem))\n return digits + result;\n else {\n while (digits.length < 6)\n digits = '0' + digits;\n result = '' + digits + result;\n }\n }\n}\n;\n/**\n * Gets the high 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed high bits\n */\nexport function getHighBits($this) {\n return $this.high;\n}\n;\n/**\n * Gets the high 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned high bits\n */\nexport function getHighBitsUnsigned($this) {\n return $this.high >>> 0;\n}\n;\n/**\n * Gets the low 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed low bits\n */\nexport function getLowBits($this) {\n return $this.low;\n}\n;\n/**\n * Gets the low 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned low bits\n */\nexport function getLowBitsUnsigned($this) {\n return $this.low >>> 0;\n}\n;\n/**\n * Gets the number of bits needed to represent the absolute value of this Long.\n * @this {!Long}\n * @returns {number}\n */\nexport function getNumBitsAbs($this) {\n if (isNegative($this)) // Unsigned Longs are never negative\n return equals($this, MIN_VALUE) ? 64 : getNumBitsAbs(negate($this));\n var val = $this.high != 0 ? $this.high : $this.low;\n for (var bit = 31; bit > 0; bit--)\n if ((val & (1 << bit)) != 0)\n break;\n return $this.high != 0 ? bit + 33 : bit + 1;\n}\n;\n/**\n * Tests if this Long's value equals zero.\n * @this {!Long}\n * @returns {boolean}\n */\nexport function isZero($this) {\n return $this.high === 0 && $this.low === 0;\n}\n;\n/**\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\n * @returns {boolean}\n */\n// LongPrototype.eqz = LongPrototype.isZero;\n/**\n * Tests if this Long's value is negative.\n * @this {!Long}\n * @returns {boolean}\n */\nexport function isNegative($this) {\n return !$this.unsigned && $this.high < 0;\n}\n;\n/**\n * Tests if this Long's value is positive.\n * @this {!Long}\n * @returns {boolean}\n */\nexport function isPositive($this) {\n return $this.unsigned || $this.high >= 0;\n}\n;\n/**\n * Tests if this Long's value is odd.\n * @this {!Long}\n * @returns {boolean}\n */\nexport function isOdd($this) {\n return ($this.low & 1) === 1;\n}\n;\n/**\n * Tests if this Long's value is even.\n * @this {!Long}\n * @returns {boolean}\n */\nexport function isEven($this) {\n return ($this.low & 1) === 0;\n}\n;\n/**\n * Tests if this Long's value equals the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nexport function equals($this, other) {\n if (!isLong(other))\n other = fromValue(other);\n if ($this.unsigned !== other.unsigned && ($this.high >>> 31) === 1 && (other.high >>> 31) === 1)\n return false;\n return $this.high === other.high && $this.low === other.low;\n}\n;\n/**\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.eq = LongPrototype.equals;\n/**\n * Tests if this Long's value differs from the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nexport function notEquals($this, other) {\n return !equals($this, /* validates */ other);\n}\n;\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.neq = LongPrototype.notEquals;\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.ne = LongPrototype.notEquals;\n/**\n * Tests if this Long's value is less than the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nexport function lessThan($this, other) {\n return compare($this, /* validates */ other) < 0;\n}\n;\n/**\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.lt = LongPrototype.lessThan;\n/**\n * Tests if this Long's value is less than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nexport function lessThanOrEqual($this, other) {\n return compare($this, /* validates */ other) <= 0;\n}\n;\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.lte = LongPrototype.lessThanOrEqual;\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.le = LongPrototype.lessThanOrEqual;\n/**\n * Tests if this Long's value is greater than the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nexport function greaterThan($this, other) {\n return compare($this, /* validates */ other) > 0;\n}\n;\n/**\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.gt = LongPrototype.greaterThan;\n/**\n * Tests if this Long's value is greater than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nexport function greaterThanOrEqual($this, other) {\n return compare($this, /* validates */ other) >= 0;\n}\n;\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.gte = LongPrototype.greaterThanOrEqual;\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\n// LongPrototype.ge = LongPrototype.greaterThanOrEqual;\n/**\n * Compares this Long's value with the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n * if the given one is greater\n */\nexport function compare($this, other) {\n if (!isLong(other))\n other = fromValue(other);\n if (equals($this, other))\n return 0;\n var thisNeg = isNegative($this), otherNeg = isNegative(other);\n if (thisNeg && !otherNeg)\n return -1;\n if (!thisNeg && otherNeg)\n return 1;\n // At this point the sign bits are the same\n if (!$this.unsigned)\n return isNegative(subtract($this, other)) ? -1 : 1;\n // Both are positive if at least one is unsigned\n return (other.high >>> 0) > ($this.high >>> 0) || (other.high === $this.high && (other.low >>> 0) > ($this.low >>> 0)) ? -1 : 1;\n}\n;\n/**\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n * if the given one is greater\n */\n// LongPrototype.comp = LongPrototype.compare;\n/**\n * Negates this Long's value.\n * @this {!Long}\n * @returns {!Long} Negated Long\n */\nexport function negate($this) {\n if (!$this.unsigned && equals($this, MIN_VALUE))\n return MIN_VALUE;\n return add(not($this), ONE);\n}\n;\n/**\n * Negates this Long's value. This is an alias of {@link Long#negate}.\n * @function\n * @returns {!Long} Negated Long\n */\n// LongPrototype.neg = LongPrototype.negate;\n/**\n * Returns the sum of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} addend Addend\n * @returns {!Long} Sum\n */\nexport function add($this, addend) {\n if (!isLong(addend))\n addend = fromValue(addend);\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n var a48 = $this.high >>> 16;\n var a32 = $this.high & 0xFFFF;\n var a16 = $this.low >>> 16;\n var a00 = $this.low & 0xFFFF;\n var b48 = addend.high >>> 16;\n var b32 = addend.high & 0xFFFF;\n var b16 = addend.low >>> 16;\n var b00 = addend.low & 0xFFFF;\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n c00 += a00 + b00;\n c16 += c00 >>> 16;\n c00 &= 0xFFFF;\n c16 += a16 + b16;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c32 += a32 + b32;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c48 += a48 + b48;\n c48 &= 0xFFFF;\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, $this.unsigned);\n}\n;\n/**\n * Returns the difference of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nexport function subtract($this, subtrahend) {\n if (!isLong(subtrahend))\n subtrahend = fromValue(subtrahend);\n return add($this, negate(subtrahend));\n}\n;\n/**\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\n * @function\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\n// LongPrototype.sub = LongPrototype.subtract;\n/**\n * Returns the product of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nexport function multiply($this, multiplier) {\n if (isZero($this))\n return $this.unsigned ? UZERO : ZERO;\n if (!isLong(multiplier))\n multiplier = fromValue(multiplier);\n // use wasm support if present\n if (wasm) {\n var low = wasm.mul($this.low, $this.high, multiplier.low, multiplier.high);\n return fromBits(low, wasm.get_high(), $this.unsigned);\n }\n if (isZero(multiplier))\n return $this.unsigned ? UZERO : ZERO;\n if (equals($this, MIN_VALUE))\n return isOdd(multiplier) ? MIN_VALUE : ZERO;\n if (equals(multiplier, MIN_VALUE))\n return isOdd($this) ? MIN_VALUE : ZERO;\n if (isNegative($this)) {\n if (isNegative(multiplier))\n return multiply(negate($this), negate(multiplier));\n else\n return negate(multiply(negate($this), multiplier));\n }\n else if (isNegative(multiplier))\n return negate(multiply($this, negate(multiplier)));\n // If both longs are small, use float multiplication\n if (lessThan($this, TWO_PWR_24) && lessThan(multiplier, TWO_PWR_24))\n return fromNumber(toNumber($this) * toNumber(multiplier), $this.unsigned);\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n // We can skip products that would overflow.\n var a48 = $this.high >>> 16;\n var a32 = $this.high & 0xFFFF;\n var a16 = $this.low >>> 16;\n var a00 = $this.low & 0xFFFF;\n var b48 = multiplier.high >>> 16;\n var b32 = multiplier.high & 0xFFFF;\n var b16 = multiplier.low >>> 16;\n var b00 = multiplier.low & 0xFFFF;\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n c00 += a00 * b00;\n c16 += c00 >>> 16;\n c00 &= 0xFFFF;\n c16 += a16 * b00;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c16 += a00 * b16;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c32 += a32 * b00;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c32 += a16 * b16;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c32 += a00 * b32;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n c48 &= 0xFFFF;\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, $this.unsigned);\n}\n;\n/**\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\n * @function\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\n// LongPrototype.mul = LongPrototype.multiply;\n/**\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\n * unsigned if this Long is unsigned.\n * @this {!Long}\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nexport function divide($this, divisor) {\n if (!isLong(divisor))\n divisor = fromValue(divisor);\n if (isZero(divisor))\n throw Error('division by zero');\n // use wasm support if present\n if (wasm) {\n // guard against signed division overflow: the largest\n // negative number / -1 would be 1 larger than the largest\n // positive number, due to two's complement.\n if (!$this.unsigned &&\n $this.high === -0x80000000 &&\n divisor.low === -1 && divisor.high === -1) {\n // be consistent with non-wasm code path\n return $this;\n }\n var low = ($this.unsigned ? wasm.div_u : wasm.div_s)($this.low, $this.high, divisor.low, divisor.high);\n return fromBits(low, wasm.get_high(), $this.unsigned);\n }\n if (isZero($this))\n return $this.unsigned ? UZERO : ZERO;\n var approx, rem, res;\n if (!$this.unsigned) {\n // This section is only relevant for signed longs and is derived from the\n // closure library as a whole.\n if (equals($this, MIN_VALUE)) {\n if (equals(divisor, ONE) || equals(divisor, NEG_ONE))\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\n else if (equals(divisor, MIN_VALUE))\n return ONE;\n else {\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n var halfThis = shiftRight($this, 1);\n approx = shiftLeft(divide(halfThis, divisor), 1);\n if (equals(approx, ZERO)) {\n return isNegative(divisor) ? ONE : NEG_ONE;\n }\n else {\n rem = subtract($this, multiply(divisor, approx));\n res = add(approx, divide(rem, divisor));\n return res;\n }\n }\n }\n else if (equals(divisor, MIN_VALUE))\n return $this.unsigned ? UZERO : ZERO;\n if (isNegative($this)) {\n if (isNegative(divisor))\n return divide(negate($this), negate(divisor));\n return negate(divide(negate($this), divisor));\n }\n else if (isNegative(divisor))\n return negate(divide($this, negate(divisor)));\n res = ZERO;\n }\n else {\n // The algorithm below has not been made for unsigned longs. It's therefore\n // required to take special care of the MSB prior to running it.\n if (!divisor.unsigned)\n divisor = toUnsigned(divisor);\n if (greaterThan(divisor, $this))\n return UZERO;\n if (greaterThan(divisor, shiftRightUnsigned($this, 1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\n return UONE;\n res = UZERO;\n }\n // Repeat the following until the remainder is less than other: find a\n // floating-point that approximates remainder / other *from below*, add this\n // into the result, and subtract it from the remainder. It is critical that\n // the approximate value is less than or equal to the real value so that the\n // remainder never becomes negative.\n rem = $this;\n while (greaterThanOrEqual(rem, divisor)) {\n // Approximate the result of division. This may be a little greater or\n // smaller than the actual value.\n approx = Math.max(1, Math.floor(toNumber(rem) / toNumber(divisor)));\n // We will tweak the approximate result by changing it in the 48-th digit or\n // the smallest non-fractional digit, whichever is larger.\n var log2 = Math.ceil(Math.log(approx) / Math.LN2), delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48), \n // Decrease the approximation until it is smaller than the remainder. Note\n // that if it is too large, the product overflows and is negative.\n approxRes = fromNumber(approx), approxRem = multiply(approxRes, divisor);\n while (isNegative(approxRem) || greaterThan(approxRem, rem)) {\n approx -= delta;\n approxRes = fromNumber(approx, $this.unsigned);\n approxRem = multiply(approxRes, divisor);\n }\n // We know the answer can't be zero... and actually, zero would cause\n // infinite recursion since we would make no progress.\n if (isZero(approxRes))\n approxRes = ONE;\n res = add(res, approxRes);\n rem = subtract(rem, approxRem);\n }\n return res;\n}\n;\n/**\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\n// LongPrototype.div = LongPrototype.divide;\n/**\n * Returns this Long modulo the specified.\n * @this {!Long}\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nexport function modulo($this, divisor) {\n if (!isLong(divisor))\n divisor = fromValue(divisor);\n // use wasm support if present\n if (wasm) {\n var low = ($this.unsigned ? wasm.rem_u : wasm.rem_s)($this.low, $this.high, divisor.low, divisor.high);\n return fromBits(low, wasm.get_high(), $this.unsigned);\n }\n return subtract($this, multiply(divide($this, divisor), divisor));\n}\n;\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\n// LongPrototype.mod = LongPrototype.modulo;\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\n// LongPrototype.rem = LongPrototype.modulo;\n/**\n * Returns the bitwise NOT of this Long.\n * @this {!Long}\n * @returns {!Long}\n */\nexport function not($this) {\n return fromBits(~$this.low, ~$this.high, $this.unsigned);\n}\n;\n/**\n * Returns the bitwise AND of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nexport function and($this, other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits($this.low & other.low, $this.high & other.high, $this.unsigned);\n}\n;\n/**\n * Returns the bitwise OR of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nexport function or($this, other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits($this.low | other.low, $this.high | other.high, $this.unsigned);\n}\n;\n/**\n * Returns the bitwise XOR of this Long and the given one.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nexport function xor($this, other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits($this.low ^ other.low, $this.high ^ other.high, $this.unsigned);\n}\n;\n/**\n * Returns this Long with bits shifted to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nexport function shiftLeft($this, numBits) {\n if (isLong(numBits))\n numBits = toInt(numBits);\n if ((numBits &= 63) === 0)\n return $this;\n else if (numBits < 32)\n return fromBits($this.low << numBits, ($this.high << numBits) | ($this.low >>> (32 - numBits)), $this.unsigned);\n else\n return fromBits(0, $this.low << (numBits - 32), $this.unsigned);\n}\n;\n/**\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n// LongPrototype.shl = LongPrototype.shiftLeft;\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nexport function shiftRight($this, numBits) {\n if (isLong(numBits))\n numBits = toInt(numBits);\n if ((numBits &= 63) === 0)\n return $this;\n else if (numBits < 32)\n return fromBits(($this.low >>> numBits) | ($this.high << (32 - numBits)), $this.high >> numBits, $this.unsigned);\n else\n return fromBits($this.high >> (numBits - 32), $this.high >= 0 ? 0 : -1, $this.unsigned);\n}\n;\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n// LongPrototype.shr = LongPrototype.shiftRight;\n/**\n * Returns this Long with bits logically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nexport function shiftRightUnsigned($this, numBits) {\n if (isLong(numBits))\n numBits = toInt(numBits);\n numBits &= 63;\n if (numBits === 0)\n return $this;\n else {\n var high = $this.high;\n if (numBits < 32) {\n var low = $this.low;\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, $this.unsigned);\n }\n else if (numBits === 32)\n return fromBits(high, 0, $this.unsigned);\n else\n return fromBits(high >>> (numBits - 32), 0, $this.unsigned);\n }\n}\n;\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n// LongPrototype.shru = LongPrototype.shiftRightUnsigned;\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n// LongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\n/**\n * Returns this Long with bits rotated to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nexport const rotateLeft = function rotateLeft(numBits) {\n var b;\n if (isLong(numBits))\n numBits = numBits.toInt();\n if ((numBits &= 63) === 0)\n return this;\n if (numBits === 32)\n return fromBits(this.high, this.low, this.unsigned);\n if (numBits < 32) {\n b = (32 - numBits);\n return fromBits(((this.low << numBits) | (this.high >>> b)), ((this.high << numBits) | (this.low >>> b)), this.unsigned);\n }\n numBits -= 32;\n b = (32 - numBits);\n return fromBits(((this.high << numBits) | (this.low >>> b)), ((this.low << numBits) | (this.high >>> b)), this.unsigned);\n};\n/**\n * Returns this Long with bits rotated to the left by the given amount. This is an alias of {@link Long#rotateLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\n// LongPrototype.rotl = LongPrototype.rotateLeft;\n/**\n * Returns this Long with bits rotated to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nexport const rotateRight = function rotateRight(numBits) {\n var b;\n if (isLong(numBits))\n numBits = numBits.toInt();\n if ((numBits &= 63) === 0)\n return this;\n if (numBits === 32)\n return fromBits(this.high, this.low, this.unsigned);\n if (numBits < 32) {\n b = (32 - numBits);\n return fromBits(((this.high << b) | (this.low >>> numBits)), ((this.low << b) | (this.high >>> numBits)), this.unsigned);\n }\n numBits -= 32;\n b = (32 - numBits);\n return fromBits(((this.low << b) | (this.high >>> numBits)), ((this.high << b) | (this.low >>> numBits)), this.unsigned);\n};\n/**\n * Returns this Long with bits rotated to the right by the given amount. This is an alias of {@link Long#rotateRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\n// LongPrototype.rotr = LongPrototype.rotateRight;\n/**\n * Converts this Long to signed.\n * @this {!Long}\n * @returns {!Long} Signed long\n */\nexport function toSigned($this) {\n if (!$this.unsigned)\n return $this;\n return fromBits($this.low, $this.high, false);\n}\n;\n/**\n * Converts this Long to unsigned.\n * @this {!Long}\n * @returns {!Long} Unsigned long\n */\nexport function toUnsigned($this) {\n if ($this.unsigned)\n return $this;\n return fromBits($this.low, $this.high, true);\n}\n;\n/**\n * Converts this Long to its byte representation.\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @this {!Long}\n * @returns {!Array.} Byte representation\n */\nexport function toBytes($this, le) {\n return le ? toBytesLE($this) : toBytesBE($this);\n}\n;\n/**\n * Converts this Long to its little endian byte representation.\n * @this {!Long}\n * @returns {!Array.} Little endian byte representation\n */\nexport function toBytesLE($this) {\n var hi = $this.high, lo = $this.low;\n return [\n lo & 0xff,\n lo >>> 8 & 0xff,\n lo >>> 16 & 0xff,\n lo >>> 24,\n hi & 0xff,\n hi >>> 8 & 0xff,\n hi >>> 16 & 0xff,\n hi >>> 24\n ];\n}\n;\n/**\n * Converts this Long to its big endian byte representation.\n * @this {!Long}\n * @returns {!Array.} Big endian byte representation\n */\nexport function toBytesBE($this) {\n var hi = $this.high, lo = $this.low;\n return [\n hi >>> 24,\n hi >>> 16 & 0xff,\n hi >>> 8 & 0xff,\n hi & 0xff,\n lo >>> 24,\n lo >>> 16 & 0xff,\n lo >>> 8 & 0xff,\n lo & 0xff\n ];\n}\n;\n/**\n * Creates a Long from its byte representation.\n * @param {!Array.} bytes Byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @returns {Long} The corresponding Long value\n */\nexport function fromBytes(bytes, unsigned, le) {\n return le ? fromBytesLE(bytes, unsigned) : fromBytesBE(bytes, unsigned);\n}\n;\n/**\n * Creates a Long from its little endian byte representation.\n * @param {!Array.} bytes Little endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nexport function fromBytesLE(bytes, unsigned) {\n return new Long(bytes[0] |\n bytes[1] << 8 |\n bytes[2] << 16 |\n bytes[3] << 24, bytes[4] |\n bytes[5] << 8 |\n bytes[6] << 16 |\n bytes[7] << 24, unsigned);\n}\n;\n/**\n * Creates a Long from its big endian byte representation.\n * @param {!Array.} bytes Big endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nexport function fromBytesBE(bytes, unsigned) {\n return new Long(bytes[4] << 24 |\n bytes[5] << 16 |\n bytes[6] << 8 |\n bytes[7], bytes[0] << 24 |\n bytes[1] << 16 |\n bytes[2] << 8 |\n bytes[3], unsigned);\n}\n;\n","import { isValid } from \"./Int32.js\";\nimport * as LongLib from \"./lib/long.js\";\nexport default LongLib.Long;\nexport const get_Zero = LongLib.ZERO;\nexport const get_One = LongLib.ONE;\nexport const op_Addition = LongLib.add;\nexport const op_Subtraction = LongLib.subtract;\nexport const op_Multiply = LongLib.multiply;\nexport const op_Division = LongLib.divide;\nexport const op_Modulus = LongLib.modulo;\nexport const op_UnaryNegation = LongLib.negate;\nexport const op_LeftShift = LongLib.shiftLeft;\nexport const op_RightShift = LongLib.shiftRight;\nexport const op_RightShiftUnsigned = LongLib.shiftRightUnsigned;\nexport const op_BitwiseAnd = LongLib.and;\nexport const op_BitwiseOr = LongLib.or;\nexport const op_ExclusiveOr = LongLib.xor;\nexport const op_LogicalNot = LongLib.not;\nexport const op_LessThan = LongLib.lessThan;\nexport const op_LessThanOrEqual = LongLib.lessThanOrEqual;\nexport const op_GreaterThan = LongLib.greaterThan;\nexport const op_GreaterThanOrEqual = LongLib.greaterThanOrEqual;\nexport const op_Equality = LongLib.equals;\nexport const op_Inequality = LongLib.notEquals;\nexport const equals = LongLib.equals;\nexport const compare = LongLib.compare;\nexport const fromInt = LongLib.fromInt;\nexport const fromBits = LongLib.fromBits;\nexport const fromBytes = LongLib.fromBytes;\nexport const fromNumber = LongLib.fromNumber;\nexport const fromString = LongLib.fromString;\nexport const fromValue = LongLib.fromValue;\nexport const toInt = LongLib.toInt;\nexport const toBytes = LongLib.toBytes;\nexport const toNumber = LongLib.toNumber;\nexport const toString = LongLib.toString;\nexport const getLowBits = LongLib.getLowBits;\nexport const getHighBits = LongLib.getHighBits;\nexport const getLowBitsUnsigned = LongLib.getLowBitsUnsigned;\nexport const getHighBitsUnsigned = LongLib.getHighBitsUnsigned;\nfunction getMaxValue(unsigned, radix, isNegative) {\n switch (radix) {\n case 2: return unsigned ?\n \"1111111111111111111111111111111111111111111111111111111111111111\" :\n (isNegative ? \"1000000000000000000000000000000000000000000000000000000000000000\"\n : \"111111111111111111111111111111111111111111111111111111111111111\");\n case 8: return unsigned ?\n \"1777777777777777777777\" :\n (isNegative ? \"1000000000000000000000\" : \"777777777777777777777\");\n case 10: return unsigned ?\n \"18446744073709551615\" :\n (isNegative ? \"9223372036854775808\" : \"9223372036854775807\");\n case 16: return unsigned ?\n \"FFFFFFFFFFFFFFFF\" :\n (isNegative ? \"8000000000000000\" : \"7FFFFFFFFFFFFFFF\");\n default: throw new Error(\"Invalid radix.\");\n }\n}\nexport function abs(x) {\n if (!x.unsigned && LongLib.isNegative(x)) {\n return op_UnaryNegation(x);\n }\n else {\n return x;\n }\n}\nexport function fromInteger(value, unsigned, kind) {\n let x = value;\n let xh = 0;\n switch (kind) {\n case 0:\n x = value << 24 >> 24;\n xh = x;\n break;\n case 4:\n x = value << 24 >>> 24;\n break;\n case 1:\n x = value << 16 >> 16;\n xh = x;\n break;\n case 5:\n x = value << 16 >>> 16;\n break;\n case 2:\n x = value >> 0;\n xh = x;\n break;\n case 6:\n x = value >>> 0;\n break;\n }\n return LongLib.fromBits(x, xh >> 31, unsigned);\n}\nexport function parse(str, style, unsigned, _bitsize, radix) {\n const res = isValid(str, style, radix);\n if (res != null) {\n const lessOrEqual = (x, y) => {\n const len = Math.max(x.length, y.length);\n return x.padStart(len, \"0\") <= y.padStart(len, \"0\");\n };\n const isNegative = res.sign === \"-\";\n const maxValue = getMaxValue(unsigned || res.radix !== 10, res.radix, isNegative);\n if (lessOrEqual(res.digits.toUpperCase(), maxValue)) {\n str = isNegative ? res.sign + res.digits : res.digits;\n return LongLib.fromString(str, unsigned, res.radix);\n }\n }\n throw new Error(\"Input string was not in a correct format.\");\n}\nexport function tryParse(str, style, unsigned, bitsize, defValue) {\n try {\n defValue.contents = parse(str, style, unsigned, bitsize);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nexport function unixEpochMillisecondsToTicks(ms, offset) {\n return op_Multiply(op_Addition(op_Addition(LongLib.fromNumber(ms), 62135596800000), offset), 10000);\n}\nexport function ticksToUnixEpochMilliseconds(ticks) {\n return LongLib.toNumber(op_Subtraction(op_Division(ticks, 10000), 62135596800000));\n}\n// export function makeRangeStepFunction(step: Long, last: Long, unsigned: boolean) {\n// const stepComparedWithZero = LongLib.compare(step, unsigned ? LongLib.UZERO : LongLib.ZERO);\n// if (stepComparedWithZero === 0) {\n// throw new Error(\"The step of a range cannot be zero\");\n// }\n// const stepGreaterThanZero = stepComparedWithZero > 0;\n// return (x: Long) => {\n// const comparedWithLast = LongLib.compare(x, last);\n// if ((stepGreaterThanZero && comparedWithLast <= 0)\n// || (!stepGreaterThanZero && comparedWithLast >= 0)) {\n// return [x, op_Addition(x, step)];\n// } else {\n// return undefined;\n// }\n// };\n// }\nexport function divRem(x, y, out) {\n const div = op_Division(x, y);\n const rem = op_Modulus(x, y);\n if (out != null) {\n out.contents = rem;\n return div;\n }\n else {\n return [div, rem];\n }\n}\n","/**\n * DateTimeOffset functions.\n *\n * Note: Date instances are always DateObjects in local\n * timezone (because JS dates are all kinds of messed up).\n * A local date returns UTC epoc when `.getTime()` is called.\n *\n * Basically; invariant: date.getTime() always return UTC time.\n */\nimport { fromValue, ticksToUnixEpochMilliseconds, unixEpochMillisecondsToTicks } from \"./Long.js\";\nimport { compareDates, dateOffset, padWithZeros } from \"./Util.js\";\nexport function dateOffsetToString(offset) {\n const isMinus = offset < 0;\n offset = Math.abs(offset);\n const hours = ~~(offset / 3600000);\n const minutes = (offset % 3600000) / 60000;\n return (isMinus ? \"-\" : \"+\") +\n padWithZeros(hours, 2) + \":\" +\n padWithZeros(minutes, 2);\n}\nexport function dateToHalfUTCString(date, half) {\n const str = date.toISOString();\n return half === \"first\"\n ? str.substring(0, str.indexOf(\"T\"))\n : str.substring(str.indexOf(\"T\") + 1, str.length - 1);\n}\nfunction dateToISOString(d, utc) {\n if (utc) {\n return d.toISOString();\n }\n else {\n // JS Date is always local\n const printOffset = d.kind == null ? true : d.kind === 2 /* Local */;\n return padWithZeros(d.getFullYear(), 4) + \"-\" +\n padWithZeros(d.getMonth() + 1, 2) + \"-\" +\n padWithZeros(d.getDate(), 2) + \"T\" +\n padWithZeros(d.getHours(), 2) + \":\" +\n padWithZeros(d.getMinutes(), 2) + \":\" +\n padWithZeros(d.getSeconds(), 2) + \".\" +\n padWithZeros(d.getMilliseconds(), 3) +\n (printOffset ? dateOffsetToString(d.getTimezoneOffset() * -60000) : \"\");\n }\n}\nfunction dateToISOStringWithOffset(dateWithOffset, offset) {\n const str = dateWithOffset.toISOString();\n return str.substring(0, str.length - 1) + dateOffsetToString(offset);\n}\nfunction dateToStringWithCustomFormat(date, format, utc) {\n return format.replace(/(\\w)\\1*/g, (match) => {\n let rep = Number.NaN;\n switch (match.substring(0, 1)) {\n case \"y\":\n const y = utc ? date.getUTCFullYear() : date.getFullYear();\n rep = match.length < 4 ? y % 100 : y;\n break;\n case \"M\":\n rep = (utc ? date.getUTCMonth() : date.getMonth()) + 1;\n break;\n case \"d\":\n rep = utc ? date.getUTCDate() : date.getDate();\n break;\n case \"H\":\n rep = utc ? date.getUTCHours() : date.getHours();\n break;\n case \"h\":\n const h = utc ? date.getUTCHours() : date.getHours();\n rep = h > 12 ? h % 12 : h;\n break;\n case \"m\":\n rep = utc ? date.getUTCMinutes() : date.getMinutes();\n break;\n case \"s\":\n rep = utc ? date.getUTCSeconds() : date.getSeconds();\n break;\n case \"f\":\n rep = utc ? date.getUTCMilliseconds() : date.getMilliseconds();\n break;\n }\n if (Number.isNaN(rep)) {\n return match;\n }\n else {\n return (rep < 10 && match.length > 1) ? \"0\" + rep : \"\" + rep;\n }\n });\n}\nfunction dateToStringWithOffset(date, format) {\n var _a, _b, _c;\n const d = new Date(date.getTime() + ((_a = date.offset) !== null && _a !== void 0 ? _a : 0));\n if (typeof format !== \"string\") {\n return d.toISOString().replace(/\\.\\d+/, \"\").replace(/[A-Z]|\\.\\d+/g, \" \") + dateOffsetToString(((_b = date.offset) !== null && _b !== void 0 ? _b : 0));\n }\n else if (format.length === 1) {\n switch (format) {\n case \"D\":\n case \"d\": return dateToHalfUTCString(d, \"first\");\n case \"T\":\n case \"t\": return dateToHalfUTCString(d, \"second\");\n case \"O\":\n case \"o\": return dateToISOStringWithOffset(d, ((_c = date.offset) !== null && _c !== void 0 ? _c : 0));\n default: throw new Error(\"Unrecognized Date print format\");\n }\n }\n else {\n return dateToStringWithCustomFormat(d, format, true);\n }\n}\nfunction dateToStringWithKind(date, format) {\n const utc = date.kind === 1 /* UTC */;\n if (typeof format !== \"string\") {\n return utc ? date.toUTCString() : date.toLocaleString();\n }\n else if (format.length === 1) {\n switch (format) {\n case \"D\":\n case \"d\":\n return utc ? dateToHalfUTCString(date, \"first\") : date.toLocaleDateString();\n case \"T\":\n case \"t\":\n return utc ? dateToHalfUTCString(date, \"second\") : date.toLocaleTimeString();\n case \"O\":\n case \"o\":\n return dateToISOString(date, utc);\n default:\n throw new Error(\"Unrecognized Date print format\");\n }\n }\n else {\n return dateToStringWithCustomFormat(date, format, utc);\n }\n}\nexport function toString(date, format, _provider) {\n return date.offset != null\n ? dateToStringWithOffset(date, format)\n : dateToStringWithKind(date, format);\n}\nexport function DateTime(value, kind) {\n const d = new Date(value);\n d.kind = (kind == null ? 0 /* Unspecified */ : kind) | 0;\n return d;\n}\nexport function fromTicks(ticks, kind) {\n ticks = fromValue(ticks);\n kind = kind != null ? kind : 2 /* Local */; // better default than Unspecified\n let date = DateTime(ticksToUnixEpochMilliseconds(ticks), kind);\n // Ticks are local to offset (in this case, either UTC or Local/Unknown).\n // If kind is anything but UTC, that means that the tick number was not\n // in utc, thus getTime() cannot return UTC, and needs to be shifted.\n if (kind !== 1 /* UTC */) {\n date = DateTime(date.getTime() - dateOffset(date), kind);\n }\n return date;\n}\nexport function fromDateTimeOffset(date, kind) {\n var _a;\n switch (kind) {\n case 1 /* UTC */: return DateTime(date.getTime(), 1 /* UTC */);\n case 2 /* Local */: return DateTime(date.getTime(), 2 /* Local */);\n default:\n const d = DateTime(date.getTime() + ((_a = date.offset) !== null && _a !== void 0 ? _a : 0), kind);\n return DateTime(d.getTime() - dateOffset(d), kind);\n }\n}\nexport function getTicks(date) {\n return unixEpochMillisecondsToTicks(date.getTime(), dateOffset(date));\n}\nexport function minValue() {\n // This is \"0001-01-01T00:00:00.000Z\", actual JS min value is -8640000000000000\n return DateTime(-62135596800000, 0 /* Unspecified */);\n}\nexport function maxValue() {\n // This is \"9999-12-31T23:59:59.999Z\", actual JS max value is 8640000000000000\n return DateTime(253402300799999, 0 /* Unspecified */);\n}\nexport function parseRaw(input) {\n function fail() {\n throw new Error(`The string is not a valid Date: ${input}`);\n }\n if (input == null || input.trim() === \"\") {\n fail();\n }\n // ISO dates without TZ are parsed as UTC. Adding time without TZ keeps them local.\n if (input.length === 10 && input[4] === \"-\" && input[7] === \"-\") {\n input += \"T00:00:00\";\n }\n let date = new Date(input);\n let offset = null;\n if (isNaN(date.getTime())) {\n // Try to check strings JS Date cannot parse (see #1045, #1422)\n // tslint:disable-next-line:max-line-length\n const m = /^\\s*(\\d+[^\\w\\s:]\\d+[^\\w\\s:]\\d+)?\\s*(\\d+:\\d+(?::\\d+(?:\\.\\d+)?)?)?\\s*([AaPp][Mm])?\\s*(Z|[+-]([01]?\\d):?([0-5]?\\d)?)?\\s*$/.exec(input);\n if (m != null) {\n let baseDate;\n let timeInSeconds = 0;\n if (m[2] != null) {\n const timeParts = m[2].split(\":\");\n timeInSeconds =\n parseInt(timeParts[0], 10) * 3600 +\n parseInt(timeParts[1] || \"0\", 10) * 60 +\n parseFloat(timeParts[2] || \"0\");\n if (m[3] != null && m[3].toUpperCase() === \"PM\") {\n timeInSeconds += 720;\n }\n }\n if (m[4] != null) { // There's an offset, parse as UTC\n if (m[1] != null) {\n baseDate = new Date(m[1] + \" UTC\");\n }\n else {\n const d = new Date();\n baseDate = new Date(d.getUTCFullYear() + \"/\" + (d.getUTCMonth() + 1) + \"/\" + d.getUTCDate());\n }\n if (m[4] === \"Z\") {\n offset = \"Z\";\n }\n else {\n let offsetInMinutes = parseInt(m[5], 10) * 60 + parseInt(m[6] || \"0\", 10);\n if (m[4][0] === \"-\") {\n offsetInMinutes *= -1;\n }\n offset = offsetInMinutes;\n timeInSeconds -= offsetInMinutes * 60;\n }\n }\n else {\n if (m[1] != null) {\n baseDate = new Date(m[1]);\n }\n else {\n const d = new Date();\n baseDate = new Date(d.getFullYear() + \"/\" + (d.getMonth() + 1) + \"/\" + d.getDate());\n }\n }\n date = new Date(baseDate.getTime() + timeInSeconds * 1000);\n // correct for daylight savings time\n date = new Date(date.getTime() + (date.getTimezoneOffset() - baseDate.getTimezoneOffset()) * 60000);\n }\n else {\n fail();\n }\n // Check again the date is valid after transformations, see #2229\n if (isNaN(date.getTime())) {\n fail();\n }\n }\n return [date, offset];\n}\nexport function parse(str, detectUTC = false) {\n const [date, offset] = parseRaw(str);\n // .NET always parses DateTime as Local if there's offset info (even \"Z\")\n // Newtonsoft.Json uses UTC if the offset is \"Z\"\n const kind = offset != null\n ? (detectUTC && offset === \"Z\" ? 1 /* UTC */ : 2 /* Local */)\n : 0 /* Unspecified */;\n return DateTime(date.getTime(), kind);\n}\nexport function tryParse(v, defValue) {\n try {\n defValue.contents = parse(v);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\nexport function create(year, month, day, h = 0, m = 0, s = 0, ms = 0, kind) {\n const dateValue = kind === 1 /* UTC */\n ? Date.UTC(year, month - 1, day, h, m, s, ms)\n : new Date(year, month - 1, day, h, m, s, ms).getTime();\n if (isNaN(dateValue)) {\n throw new Error(\"The parameters describe an unrepresentable Date.\");\n }\n const date = DateTime(dateValue, kind);\n if (year <= 99) {\n date.setFullYear(year, month - 1, day);\n }\n return date;\n}\nexport function now() {\n return DateTime(Date.now(), 2 /* Local */);\n}\nexport function utcNow() {\n return DateTime(Date.now(), 1 /* UTC */);\n}\nexport function today() {\n return date(now());\n}\nexport function isLeapYear(year) {\n return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n}\nexport function daysInMonth(year, month) {\n return month === 2\n ? (isLeapYear(year) ? 29 : 28)\n : (month >= 8 ? (month % 2 === 0 ? 31 : 30) : (month % 2 === 0 ? 30 : 31));\n}\nexport function toUniversalTime(date) {\n return date.kind === 1 /* UTC */ ? date : DateTime(date.getTime(), 1 /* UTC */);\n}\nexport function toLocalTime(date) {\n return date.kind === 2 /* Local */ ? date : DateTime(date.getTime(), 2 /* Local */);\n}\nexport function specifyKind(d, kind) {\n return create(year(d), month(d), day(d), hour(d), minute(d), second(d), millisecond(d), kind);\n}\nexport function timeOfDay(d) {\n return hour(d) * 3600000\n + minute(d) * 60000\n + second(d) * 1000\n + millisecond(d);\n}\nexport function date(d) {\n return create(year(d), month(d), day(d), 0, 0, 0, 0, d.kind);\n}\nexport function day(d) {\n return d.kind === 1 /* UTC */ ? d.getUTCDate() : d.getDate();\n}\nexport function hour(d) {\n return d.kind === 1 /* UTC */ ? d.getUTCHours() : d.getHours();\n}\nexport function millisecond(d) {\n return d.kind === 1 /* UTC */ ? d.getUTCMilliseconds() : d.getMilliseconds();\n}\nexport function minute(d) {\n return d.kind === 1 /* UTC */ ? d.getUTCMinutes() : d.getMinutes();\n}\nexport function month(d) {\n return (d.kind === 1 /* UTC */ ? d.getUTCMonth() : d.getMonth()) + 1;\n}\nexport function second(d) {\n return d.kind === 1 /* UTC */ ? d.getUTCSeconds() : d.getSeconds();\n}\nexport function year(d) {\n return d.kind === 1 /* UTC */ ? d.getUTCFullYear() : d.getFullYear();\n}\nexport function dayOfWeek(d) {\n return d.kind === 1 /* UTC */ ? d.getUTCDay() : d.getDay();\n}\nexport function dayOfYear(d) {\n const _year = year(d);\n const _month = month(d);\n let _day = day(d);\n for (let i = 1; i < _month; i++) {\n _day += daysInMonth(_year, i);\n }\n return _day;\n}\nexport function add(d, ts) {\n const newDate = DateTime(d.getTime() + ts, d.kind);\n if (d.kind === 2 /* Local */) {\n const oldTzOffset = d.getTimezoneOffset();\n const newTzOffset = newDate.getTimezoneOffset();\n return oldTzOffset !== newTzOffset\n ? DateTime(newDate.getTime() + (newTzOffset - oldTzOffset) * 60000, d.kind)\n : newDate;\n }\n else {\n return newDate;\n }\n}\nexport function addDays(d, v) {\n return add(d, v * 86400000);\n}\nexport function addHours(d, v) {\n return add(d, v * 3600000);\n}\nexport function addMinutes(d, v) {\n return add(d, v * 60000);\n}\nexport function addSeconds(d, v) {\n return add(d, v * 1000);\n}\nexport function addMilliseconds(d, v) {\n return add(d, v);\n}\nexport function addYears(d, v) {\n const newMonth = month(d);\n const newYear = year(d) + v;\n const _daysInMonth = daysInMonth(newYear, newMonth);\n const newDay = Math.min(_daysInMonth, day(d));\n return create(newYear, newMonth, newDay, hour(d), minute(d), second(d), millisecond(d), d.kind);\n}\nexport function addMonths(d, v) {\n let newMonth = month(d) + v;\n let newMonth_ = 0;\n let yearOffset = 0;\n if (newMonth > 12) {\n newMonth_ = newMonth % 12;\n yearOffset = Math.floor(newMonth / 12);\n newMonth = newMonth_;\n }\n else if (newMonth < 1) {\n newMonth_ = 12 + newMonth % 12;\n yearOffset = Math.floor(newMonth / 12) + (newMonth_ === 12 ? -1 : 0);\n newMonth = newMonth_;\n }\n const newYear = year(d) + yearOffset;\n const _daysInMonth = daysInMonth(newYear, newMonth);\n const newDay = Math.min(_daysInMonth, day(d));\n return create(newYear, newMonth, newDay, hour(d), minute(d), second(d), millisecond(d), d.kind);\n}\nexport function subtract(d, that) {\n return typeof that === \"number\"\n ? add(d, -that)\n : d.getTime() - that.getTime();\n}\nexport function toLongDateString(d) {\n return d.toDateString();\n}\nexport function toShortDateString(d) {\n return d.toLocaleDateString();\n}\nexport function toLongTimeString(d) {\n return d.toLocaleTimeString();\n}\nexport function toShortTimeString(d) {\n return d.toLocaleTimeString().replace(/:\\d\\d(?!:)/, \"\");\n}\nexport function equals(d1, d2) {\n return d1.getTime() === d2.getTime();\n}\nexport const compare = compareDates;\nexport const compareTo = compareDates;\nexport function op_Addition(x, y) {\n return add(x, y);\n}\nexport function op_Subtraction(x, y) {\n return subtract(x, y);\n}\nexport function isDaylightSavingTime(x) {\n const jan = new Date(x.getFullYear(), 0, 1);\n const jul = new Date(x.getFullYear(), 6, 1);\n return isDST(jan.getTimezoneOffset(), jul.getTimezoneOffset(), x.getTimezoneOffset());\n}\nfunction isDST(janOffset, julOffset, tOffset) {\n return Math.min(janOffset, julOffset) === tOffset;\n}\nexport default DateTime;\n","export function create(pattern, options = 0) {\n // Supported RegexOptions\n // * IgnoreCase: 0x0001\n // * Multiline: 0x0002\n // * Compiled: 0x0008 (ignored)\n // * Singleline: 0x0010\n // * ECMAScript: 0x0100 (ignored)\n if ((options & ~(1 ^ 2 ^ 8 ^ 16 ^ 256)) !== 0) {\n throw new Error(\"RegexOptions only supports: IgnoreCase, Multiline, Compiled, Singleline and ECMAScript\");\n }\n // Set always global and unicode flags for compatibility with dotnet, see #2925\n let flags = \"gu\";\n flags += options & 1 ? \"i\" : \"\"; // 0x0001 RegexOptions.IgnoreCase\n flags += options & 2 ? \"m\" : \"\";\n flags += options & 16 ? \"s\" : \"\";\n return new RegExp(pattern, flags);\n}\n// From http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\nexport function escape(str) {\n return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n}\nexport function unescape(str) {\n return str.replace(/\\\\([\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|])/g, \"$1\");\n}\nexport function isMatch(reg, input, startAt = 0) {\n reg.lastIndex = startAt;\n return reg.test(input);\n}\nexport function match(reg, input, startAt = 0) {\n reg.lastIndex = startAt;\n return reg.exec(input);\n}\nexport function matches(reg, input, startAt = 0) {\n if (input == null) {\n throw new Error(\"Input cannot ve null\");\n }\n if (!reg.global) {\n throw new Error(\"Non-global RegExp\"); // Prevent infinite loop\n }\n reg.lastIndex = startAt;\n const matches = [];\n let m;\n let lastMatchIndex = -1;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = reg.exec(input)) != null) {\n // It can happen even global regex get stuck, see #2845\n if (m.index === lastMatchIndex) {\n reg.lastIndex++;\n }\n else {\n lastMatchIndex = m.index;\n matches.push(m);\n }\n }\n return matches;\n}\nexport function options(reg) {\n let options = 256; // ECMAScript\n options |= reg.ignoreCase ? 1 : 0;\n options |= reg.multiline ? 2 : 0;\n return options;\n}\nexport function replace(reg, input, replacement, limit, offset = 0) {\n function replacer() {\n let res = arguments[0];\n if (limit) {\n limit--;\n const match = [];\n const len = arguments.length;\n // arguments: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_function_as_a_parameter\n // * match: matched substring\n // * p1, p2, ...: nth capture group string\n // * offset: offset of matched substring\n // * string: whole string examined\n // * groups: named capturing groups\n // ONLY if regex contains a named capture group AND browser supports named groups\n // -> last element can be groups OR input string\n // -> check if last element is string\n const withGroups = typeof arguments[len - 1] !== \"string\";\n let pLast = withGroups ? len - 3 : len - 2;\n for (let i = 0; i < pLast; i++) {\n match.push(arguments[i]);\n }\n match.index = arguments[pLast++];\n match.input = arguments[pLast++];\n if (withGroups) {\n match.groups = arguments[pLast];\n }\n res = replacement(match);\n }\n return res;\n }\n if (typeof reg === \"string\") {\n const tmp = reg;\n reg = create(input, limit !== null && limit !== void 0 ? limit : 0);\n input = tmp;\n limit = undefined;\n }\n if (typeof replacement === \"function\") {\n limit = limit == null ? -1 : limit;\n return input.substring(0, offset) + input.substring(offset).replace(reg, replacer);\n }\n else {\n replacement =\n replacement\n // $0 doesn't work with JS regex, see #1155\n .replace(/\\$0/g, (_s) => \"$&\")\n // named groups in replacement are `${name}` in .Net, but `$` in JS (in regex: groups are `(?...)` in both)\n .replace(/\\${([^}]+)}/g, \"\\$<$1>\");\n if (limit != null) {\n let m;\n const sub1 = input.substring(offset);\n const _matches = matches(reg, sub1);\n const sub2 = matches.length > limit ? (m = _matches[limit - 1], sub1.substring(0, m.index + m[0].length)) : sub1;\n return input.substring(0, offset) + sub2.replace(reg, replacement)\n + input.substring(offset + sub2.length);\n }\n else {\n return input.replace(reg, replacement);\n }\n }\n}\nexport function split(reg, input, limit, offset = 0) {\n if (typeof reg === \"string\") {\n const tmp = reg;\n reg = create(input, limit !== null && limit !== void 0 ? limit : 0);\n input = tmp;\n limit = undefined;\n }\n input = input.substring(offset);\n return input.split(reg, limit);\n}\n","import { toString as dateToString } from \"./Date.js\";\nimport { compare as numericCompare, isNumeric, multiply, toExponential, toFixed, toHex, toPrecision } from \"./Numeric.js\";\nimport { escape } from \"./RegExp.js\";\nimport { toString } from \"./Types.js\";\nconst fsFormatRegExp = /(^|[^%])%([0+\\- ]*)(\\*|\\d+)?(?:\\.(\\d+))?(\\w)/g;\nconst interpolateRegExp = /(?:(^|[^%])%([0+\\- ]*)(\\d+)?(?:\\.(\\d+))?(\\w))?%P\\(\\)/g;\nconst formatRegExp = /\\{(\\d+)(,-?\\d+)?(?:\\:([a-zA-Z])(\\d{0,2})|\\:(.+?))?\\}/g;\nfunction isLessThan(x, y) {\n return numericCompare(x, y) < 0;\n}\nfunction cmp(x, y, ic) {\n function isIgnoreCase(i) {\n return i === true ||\n i === 1 /* CurrentCultureIgnoreCase */ ||\n i === 3 /* InvariantCultureIgnoreCase */ ||\n i === 5 /* OrdinalIgnoreCase */;\n }\n function isOrdinal(i) {\n return i === 4 /* Ordinal */ ||\n i === 5 /* OrdinalIgnoreCase */;\n }\n if (x == null) {\n return y == null ? 0 : -1;\n }\n if (y == null) {\n return 1;\n } // everything is bigger than null\n if (isOrdinal(ic)) {\n if (isIgnoreCase(ic)) {\n x = x.toLowerCase();\n y = y.toLowerCase();\n }\n return (x === y) ? 0 : (x < y ? -1 : 1);\n }\n else {\n if (isIgnoreCase(ic)) {\n x = x.toLocaleLowerCase();\n y = y.toLocaleLowerCase();\n }\n return x.localeCompare(y);\n }\n}\nexport function compare(...args) {\n switch (args.length) {\n case 2: return cmp(args[0], args[1], false);\n case 3: return cmp(args[0], args[1], args[2]);\n case 4: return cmp(args[0], args[1], args[2] === true);\n case 5: return cmp(args[0].substr(args[1], args[4]), args[2].substr(args[3], args[4]), false);\n case 6: return cmp(args[0].substr(args[1], args[4]), args[2].substr(args[3], args[4]), args[5]);\n case 7: return cmp(args[0].substr(args[1], args[4]), args[2].substr(args[3], args[4]), args[5] === true);\n default: throw new Error(\"String.compare: Unsupported number of parameters\");\n }\n}\nexport function compareOrdinal(x, y) {\n return cmp(x, y, 4 /* Ordinal */);\n}\nexport function compareTo(x, y) {\n return cmp(x, y, 0 /* CurrentCulture */);\n}\nexport function startsWith(str, pattern, ic) {\n if (str.length >= pattern.length) {\n return cmp(str.substr(0, pattern.length), pattern, ic) === 0;\n }\n return false;\n}\nexport function indexOfAny(str, anyOf, ...args) {\n if (str == null || str === \"\") {\n return -1;\n }\n const startIndex = (args.length > 0) ? args[0] : 0;\n if (startIndex < 0) {\n throw new Error(\"Start index cannot be negative\");\n }\n const length = (args.length > 1) ? args[1] : str.length - startIndex;\n if (length < 0) {\n throw new Error(\"Length cannot be negative\");\n }\n if (length > str.length - startIndex) {\n throw new Error(\"Invalid startIndex and length\");\n }\n str = str.substr(startIndex, length);\n for (const c of anyOf) {\n const index = str.indexOf(c);\n if (index > -1) {\n return index + startIndex;\n }\n }\n return -1;\n}\nexport function printf(input) {\n return {\n input,\n cont: fsFormat(input),\n };\n}\nexport function interpolate(str, values) {\n let valIdx = 0;\n let strIdx = 0;\n let result = \"\";\n interpolateRegExp.lastIndex = 0;\n let match = interpolateRegExp.exec(str);\n while (match) {\n // The first group corresponds to the no-escape char (^|[^%]), the actual pattern starts in the next char\n // Note: we don't use negative lookbehind because some browsers don't support it yet\n const matchIndex = match.index + (match[1] || \"\").length;\n result += str.substring(strIdx, matchIndex).replace(/%%/g, \"%\");\n const [, , flags, padLength, precision, format] = match;\n // Save interpolateRegExp.lastIndex before running formatReplacement because the values\n // may also involve interpolation and make use of interpolateRegExp (see #3078)\n strIdx = interpolateRegExp.lastIndex;\n result += formatReplacement(values[valIdx++], flags, padLength, precision, format);\n // Move interpolateRegExp.lastIndex one char behind to make sure we match the no-escape char next time\n interpolateRegExp.lastIndex = strIdx - 1;\n match = interpolateRegExp.exec(str);\n }\n result += str.substring(strIdx).replace(/%%/g, \"%\");\n return result;\n}\nfunction continuePrint(cont, arg) {\n return typeof arg === \"string\" ? cont(arg) : arg.cont(cont);\n}\nexport function toConsole(arg) {\n // Don't remove the lambda here, see #1357\n return continuePrint((x) => console.log(x), arg);\n}\nexport function toConsoleError(arg) {\n return continuePrint((x) => console.error(x), arg);\n}\nexport function toText(arg) {\n return continuePrint((x) => x, arg);\n}\nexport function toFail(arg) {\n return continuePrint((x) => {\n throw new Error(x);\n }, arg);\n}\nfunction formatReplacement(rep, flags, padLength, precision, format) {\n let sign = \"\";\n flags = flags || \"\";\n format = format || \"\";\n if (isNumeric(rep)) {\n if (format.toLowerCase() !== \"x\") {\n if (isLessThan(rep, 0)) {\n rep = multiply(rep, -1);\n sign = \"-\";\n }\n else {\n if (flags.indexOf(\" \") >= 0) {\n sign = \" \";\n }\n else if (flags.indexOf(\"+\") >= 0) {\n sign = \"+\";\n }\n }\n }\n precision = precision == null ? null : parseInt(precision, 10);\n switch (format) {\n case \"f\":\n case \"F\":\n precision = precision != null ? precision : 6;\n rep = toFixed(rep, precision);\n break;\n case \"g\":\n case \"G\":\n rep = precision != null ? toPrecision(rep, precision) : toPrecision(rep);\n break;\n case \"e\":\n case \"E\":\n rep = precision != null ? toExponential(rep, precision) : toExponential(rep);\n break;\n case \"x\":\n rep = toHex(rep);\n break;\n case \"X\":\n rep = toHex(rep).toUpperCase();\n break;\n default: // AOid\n rep = String(rep);\n break;\n }\n }\n else if (rep instanceof Date) {\n rep = dateToString(rep);\n }\n else {\n rep = toString(rep);\n }\n padLength = typeof padLength === \"number\" ? padLength : parseInt(padLength, 10);\n if (!isNaN(padLength)) {\n const zeroFlag = flags.indexOf(\"0\") >= 0; // Use '0' for left padding\n const minusFlag = flags.indexOf(\"-\") >= 0; // Right padding\n const ch = minusFlag || !zeroFlag ? \" \" : \"0\";\n if (ch === \"0\") {\n rep = pad(rep, padLength - sign.length, ch, minusFlag);\n rep = sign + rep;\n }\n else {\n rep = pad(sign + rep, padLength, ch, minusFlag);\n }\n }\n else {\n rep = sign + rep;\n }\n return rep;\n}\nfunction createPrinter(cont, _strParts, _matches, _result = \"\", padArg = -1) {\n return (...args) => {\n // Make copies of the values passed by reference because the function can be used multiple times\n let result = _result;\n const strParts = _strParts.slice();\n const matches = _matches.slice();\n for (const arg of args) {\n const [, , flags, _padLength, precision, format] = matches[0];\n let padLength = _padLength;\n if (padArg >= 0) {\n padLength = padArg;\n padArg = -1;\n }\n else if (padLength === \"*\") {\n if (arg < 0) {\n throw new Error(\"Non-negative number required\");\n }\n padArg = arg;\n continue;\n }\n result += strParts[0];\n result += formatReplacement(arg, flags, padLength, precision, format);\n strParts.splice(0, 1);\n matches.splice(0, 1);\n }\n if (matches.length === 0) {\n result += strParts[0];\n return cont(result);\n }\n else {\n return createPrinter(cont, strParts, matches, result, padArg);\n }\n };\n}\nexport function fsFormat(str) {\n return (cont) => {\n fsFormatRegExp.lastIndex = 0;\n const strParts = [];\n const matches = [];\n let strIdx = 0;\n let match = fsFormatRegExp.exec(str);\n while (match) {\n // The first group corresponds to the no-escape char (^|[^%]), the actual pattern starts in the next char\n // Note: we don't use negative lookbehind because some browsers don't support it yet\n const matchIndex = match.index + (match[1] || \"\").length;\n strParts.push(str.substring(strIdx, matchIndex).replace(/%%/g, \"%\"));\n matches.push(match);\n strIdx = fsFormatRegExp.lastIndex;\n // Likewise we need to move fsFormatRegExp.lastIndex one char behind to make sure we match the no-escape char next time\n fsFormatRegExp.lastIndex -= 1;\n match = fsFormatRegExp.exec(str);\n }\n if (strParts.length === 0) {\n return cont(str.replace(/%%/g, \"%\"));\n }\n else {\n strParts.push(str.substring(strIdx).replace(/%%/g, \"%\"));\n return createPrinter(cont, strParts, matches);\n }\n };\n}\nexport function format(str, ...args) {\n if (typeof str === \"object\" && args.length > 0) {\n // Called with culture info\n str = args[0];\n args.shift();\n }\n return str.replace(formatRegExp, (_, idx, padLength, format, precision, pattern) => {\n if (idx < 0 || idx >= args.length) {\n throw new Error(\"Index must be greater or equal to zero and less than the arguments' length.\");\n }\n let rep = args[idx];\n if (isNumeric(rep)) {\n precision = precision == null ? null : parseInt(precision, 10);\n switch (format) {\n case \"f\":\n case \"F\":\n precision = precision != null ? precision : 2;\n rep = toFixed(rep, precision);\n break;\n case \"g\":\n case \"G\":\n rep = precision != null ? toPrecision(rep, precision) : toPrecision(rep);\n break;\n case \"e\":\n case \"E\":\n rep = precision != null ? toExponential(rep, precision) : toExponential(rep);\n break;\n case \"p\":\n case \"P\":\n precision = precision != null ? precision : 2;\n rep = toFixed(multiply(rep, 100), precision) + \" %\";\n break;\n case \"d\":\n case \"D\":\n rep = precision != null ? padLeft(String(rep), precision, \"0\") : String(rep);\n break;\n case \"x\":\n case \"X\":\n rep = precision != null ? padLeft(toHex(rep), precision, \"0\") : toHex(rep);\n if (format === \"X\") {\n rep = rep.toUpperCase();\n }\n break;\n default:\n if (pattern) {\n let sign = \"\";\n rep = pattern.replace(/([0#,]+)(\\.[0#]+)?/, (_, intPart, decimalPart) => {\n if (isLessThan(rep, 0)) {\n rep = multiply(rep, -1);\n sign = \"-\";\n }\n decimalPart = decimalPart == null ? \"\" : decimalPart.substring(1);\n rep = toFixed(rep, Math.max(decimalPart.length, 0));\n let [repInt, repDecimal] = rep.split(\".\");\n repDecimal || (repDecimal = \"\");\n const leftZeroes = intPart.replace(/,/g, \"\").replace(/^#+/, \"\").length;\n repInt = padLeft(repInt, leftZeroes, \"0\");\n const rightZeros = decimalPart.replace(/#+$/, \"\").length;\n if (rightZeros > repDecimal.length) {\n repDecimal = padRight(repDecimal, rightZeros, \"0\");\n }\n else if (rightZeros < repDecimal.length) {\n repDecimal = repDecimal.substring(0, rightZeros) + repDecimal.substring(rightZeros).replace(/0+$/, \"\");\n }\n // Thousands separator\n if (intPart.indexOf(\",\") > 0) {\n const i = repInt.length % 3;\n const thousandGroups = Math.floor(repInt.length / 3);\n let thousands = i > 0 ? repInt.substr(0, i) + (thousandGroups > 0 ? \",\" : \"\") : \"\";\n for (let j = 0; j < thousandGroups; j++) {\n thousands += repInt.substr(i + j * 3, 3) + (j < thousandGroups - 1 ? \",\" : \"\");\n }\n repInt = thousands;\n }\n return repDecimal.length > 0 ? repInt + \".\" + repDecimal : repInt;\n });\n rep = sign + rep;\n }\n }\n }\n else if (rep instanceof Date) {\n rep = dateToString(rep, pattern || format);\n }\n else {\n rep = toString(rep);\n }\n padLength = parseInt((padLength || \" \").substring(1), 10);\n if (!isNaN(padLength)) {\n rep = pad(String(rep), Math.abs(padLength), \" \", padLength < 0);\n }\n return rep;\n });\n}\nexport function endsWith(str, search) {\n const idx = str.lastIndexOf(search);\n return idx >= 0 && idx === str.length - search.length;\n}\nexport function initialize(n, f) {\n if (n < 0) {\n throw new Error(\"String length must be non-negative\");\n }\n const xs = new Array(n);\n for (let i = 0; i < n; i++) {\n xs[i] = f(i);\n }\n return xs.join(\"\");\n}\nexport function insert(str, startIndex, value) {\n if (startIndex < 0 || startIndex > str.length) {\n throw new Error(\"startIndex is negative or greater than the length of this instance.\");\n }\n return str.substring(0, startIndex) + value + str.substring(startIndex);\n}\nexport function isNullOrEmpty(str) {\n return typeof str !== \"string\" || str.length === 0;\n}\nexport function isNullOrWhiteSpace(str) {\n return typeof str !== \"string\" || /^\\s*$/.test(str);\n}\nexport function concat(...xs) {\n return xs.map((x) => String(x)).join(\"\");\n}\nexport function join(delimiter, xs) {\n if (Array.isArray(xs)) {\n return xs.join(delimiter);\n }\n else {\n return Array.from(xs).join(delimiter);\n }\n}\nexport function joinWithIndices(delimiter, xs, startIndex, count) {\n const endIndexPlusOne = startIndex + count;\n if (endIndexPlusOne > xs.length) {\n throw new Error(\"Index and count must refer to a location within the buffer.\");\n }\n return xs.slice(startIndex, endIndexPlusOne).join(delimiter);\n}\nfunction notSupported(name) {\n throw new Error(\"The environment doesn't support '\" + name + \"', please use a polyfill.\");\n}\nexport function toBase64String(inArray) {\n let str = \"\";\n for (let i = 0; i < inArray.length; i++) {\n str += String.fromCharCode(inArray[i]);\n }\n return typeof btoa === \"function\" ? btoa(str) : notSupported(\"btoa\");\n}\nexport function fromBase64String(b64Encoded) {\n const binary = typeof atob === \"function\" ? atob(b64Encoded) : notSupported(\"atob\");\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\nfunction pad(str, len, ch, isRight) {\n ch = ch || \" \";\n len = len - str.length;\n for (let i = 0; i < len; i++) {\n str = isRight ? str + ch : ch + str;\n }\n return str;\n}\nexport function padLeft(str, len, ch) {\n return pad(str, len, ch);\n}\nexport function padRight(str, len, ch) {\n return pad(str, len, ch, true);\n}\nexport function remove(str, startIndex, count) {\n if (startIndex >= str.length) {\n throw new Error(\"startIndex must be less than length of string\");\n }\n if (typeof count === \"number\" && (startIndex + count) > str.length) {\n throw new Error(\"Index and count must refer to a location within the string.\");\n }\n return str.slice(0, startIndex) + (typeof count === \"number\" ? str.substr(startIndex + count) : \"\");\n}\nexport function replace(str, search, replace) {\n return str.replace(new RegExp(escape(search), \"g\"), replace);\n}\nexport function replicate(n, x) {\n return initialize(n, () => x);\n}\nexport function getCharAtIndex(input, index) {\n if (index < 0 || index >= input.length) {\n throw new Error(\"Index was outside the bounds of the array.\");\n }\n return input[index];\n}\nexport function split(str, splitters, count, options) {\n count = typeof count === \"number\" ? count : undefined;\n options = typeof options === \"number\" ? options : 0;\n if (count && count < 0) {\n throw new Error(\"Count cannot be less than zero\");\n }\n if (count === 0) {\n return [];\n }\n const removeEmpty = (options & 1) === 1;\n const trim = (options & 2) === 2;\n splitters = splitters || [];\n splitters = splitters.filter(x => x).map(escape);\n splitters = splitters.length > 0 ? splitters : [\"\\\\s\"];\n const splits = [];\n const reg = new RegExp(splitters.join(\"|\"), \"g\");\n let findSplits = true;\n let i = 0;\n do {\n const match = reg.exec(str);\n if (match === null) {\n const candidate = trim ? str.substring(i).trim() : str.substring(i);\n if (!removeEmpty || candidate.length > 0) {\n splits.push(candidate);\n }\n findSplits = false;\n }\n else {\n const candidate = trim ? str.substring(i, match.index).trim() : str.substring(i, match.index);\n if (!removeEmpty || candidate.length > 0) {\n if (count != null && splits.length + 1 === count) {\n splits.push(trim ? str.substring(i).trim() : str.substring(i));\n findSplits = false;\n }\n else {\n splits.push(candidate);\n }\n }\n i = reg.lastIndex;\n }\n } while (findSplits);\n return splits;\n}\nexport function trim(str, ...chars) {\n if (chars.length === 0) {\n return str.trim();\n }\n const pattern = \"[\" + escape(chars.join(\"\")) + \"]+\";\n return str.replace(new RegExp(\"^\" + pattern), \"\").replace(new RegExp(pattern + \"$\"), \"\");\n}\nexport function trimStart(str, ...chars) {\n return chars.length === 0\n ? str.trimStart()\n : str.replace(new RegExp(\"^[\" + escape(chars.join(\"\")) + \"]+\"), \"\");\n}\nexport function trimEnd(str, ...chars) {\n return chars.length === 0\n ? str.trimEnd()\n : str.replace(new RegExp(\"[\" + escape(chars.join(\"\")) + \"]+$\"), \"\");\n}\nexport function filter(pred, x) {\n return x.split(\"\").filter((c) => pred(c)).join(\"\");\n}\nexport function substring(str, startIndex, length) {\n if ((startIndex + (length || 0) > str.length)) {\n throw new Error(\"Invalid startIndex and/or length\");\n }\n return length != null ? str.substr(startIndex, length) : str.substr(startIndex);\n}\nexport function fmt(strs, ...args) {\n return ({ strs, args });\n}\nexport function fmtWith(fmts) {\n return (strs, ...args) => ({ strs, args, fmts });\n}\nexport function getFormat(s) {\n return s.fmts\n ? s.strs.reduce((acc, newPart, index) => acc + `{${String(index - 1) + s.fmts[index - 1]}}` + newPart)\n : s.strs.reduce((acc, newPart, index) => acc + `{${index - 1}}` + newPart);\n}\n","\nexport const SR_indexOutOfBounds = \"The index was outside the range of elements in the collection.\";\n\nexport const SR_inputWasEmpty = \"Collection was empty.\";\n\nexport const SR_inputMustBeNonNegative = \"The input must be non-negative.\";\n\nexport const SR_inputSequenceEmpty = \"The input sequence was empty.\";\n\nexport const SR_inputSequenceTooLong = \"The input sequence contains more than one element.\";\n\nexport const SR_keyNotFoundAlt = \"An index satisfying the predicate was not found in the collection.\";\n\nexport const SR_differentLengths = \"The collections had different lengths.\";\n\nexport const SR_notEnoughElements = \"The input sequence has an insufficient number of elements.\";\n\n","import { value as value_2, map as map_1, defaultArg, some } from \"./Option.js\";\nimport { min as min_1, disposeSafe, getEnumerator, comparePrimitives, max as max_1 } from \"./Util.js\";\nimport { SR_indexOutOfBounds } from \"./Global.js\";\n\nexport function Helpers_allocateArrayFromCons(cons, len) {\n if ((typeof cons) === \"function\") {\n return new cons(len);\n }\n else {\n return new Array(len);\n }\n}\n\nfunction indexNotFound() {\n throw (new Error(\"An index satisfying the predicate was not found in the collection.\"));\n}\n\nfunction differentLengths() {\n throw (new Error(\"Arrays had different lengths\"));\n}\n\nexport function append(array1, array2, cons) {\n const len1 = array1.length | 0;\n const len2 = array2.length | 0;\n const newArray = Helpers_allocateArrayFromCons(cons, len1 + len2);\n for (let i = 0; i <= (len1 - 1); i++) {\n newArray[i] = array1[i];\n }\n for (let i_1 = 0; i_1 <= (len2 - 1); i_1++) {\n newArray[i_1 + len1] = array2[i_1];\n }\n return newArray;\n}\n\nexport function filter(predicate, array) {\n return array.filter(predicate);\n}\n\nexport function fill(target, targetIndex, count, value) {\n const start = targetIndex | 0;\n return target.fill(value, start, (start + count));\n}\n\nexport function getSubArray(array, start, count) {\n const start_1 = start | 0;\n return array.slice(start_1, (start_1 + count));\n}\n\nexport function last(array) {\n if (array.length === 0) {\n throw (new Error(\"The input array was empty\\\\nParameter name: array\"));\n }\n return array[array.length - 1];\n}\n\nexport function tryLast(array) {\n if (array.length === 0) {\n return void 0;\n }\n else {\n return some(array[array.length - 1]);\n }\n}\n\nexport function mapIndexed(f, source, cons) {\n const len = source.length | 0;\n const target = Helpers_allocateArrayFromCons(cons, len);\n for (let i = 0; i <= (len - 1); i++) {\n target[i] = f(i, source[i]);\n }\n return target;\n}\n\nexport function map(f, source, cons) {\n const len = source.length | 0;\n const target = Helpers_allocateArrayFromCons(cons, len);\n for (let i = 0; i <= (len - 1); i++) {\n target[i] = f(source[i]);\n }\n return target;\n}\n\nexport function mapIndexed2(f, source1, source2, cons) {\n if (source1.length !== source2.length) {\n throw (new Error(\"Arrays had different lengths\"));\n }\n const result = Helpers_allocateArrayFromCons(cons, source1.length);\n for (let i = 0; i <= (source1.length - 1); i++) {\n result[i] = f(i, source1[i], source2[i]);\n }\n return result;\n}\n\nexport function map2(f, source1, source2, cons) {\n if (source1.length !== source2.length) {\n throw (new Error(\"Arrays had different lengths\"));\n }\n const result = Helpers_allocateArrayFromCons(cons, source1.length);\n for (let i = 0; i <= (source1.length - 1); i++) {\n result[i] = f(source1[i], source2[i]);\n }\n return result;\n}\n\nexport function mapIndexed3(f, source1, source2, source3, cons) {\n if ((source1.length !== source2.length) ? true : (source2.length !== source3.length)) {\n throw (new Error(\"Arrays had different lengths\"));\n }\n const result = Helpers_allocateArrayFromCons(cons, source1.length);\n for (let i = 0; i <= (source1.length - 1); i++) {\n result[i] = f(i, source1[i], source2[i], source3[i]);\n }\n return result;\n}\n\nexport function map3(f, source1, source2, source3, cons) {\n if ((source1.length !== source2.length) ? true : (source2.length !== source3.length)) {\n throw (new Error(\"Arrays had different lengths\"));\n }\n const result = Helpers_allocateArrayFromCons(cons, source1.length);\n for (let i = 0; i <= (source1.length - 1); i++) {\n result[i] = f(source1[i], source2[i], source3[i]);\n }\n return result;\n}\n\nexport function mapFold(mapping, state, array, cons) {\n const matchValue = array.length | 0;\n if (matchValue === 0) {\n return [[], state];\n }\n else {\n let acc = state;\n const res = Helpers_allocateArrayFromCons(cons, matchValue);\n for (let i = 0; i <= (array.length - 1); i++) {\n const patternInput = mapping(acc, array[i]);\n res[i] = patternInput[0];\n acc = patternInput[1];\n }\n return [res, acc];\n }\n}\n\nexport function mapFoldBack(mapping, array, state, cons) {\n const matchValue = array.length | 0;\n if (matchValue === 0) {\n return [[], state];\n }\n else {\n let acc = state;\n const res = Helpers_allocateArrayFromCons(cons, matchValue);\n for (let i = array.length - 1; i >= 0; i--) {\n const patternInput = mapping(array[i], acc);\n res[i] = patternInput[0];\n acc = patternInput[1];\n }\n return [res, acc];\n }\n}\n\nexport function indexed(source) {\n const len = source.length | 0;\n const target = new Array(len);\n for (let i = 0; i <= (len - 1); i++) {\n target[i] = [i, source[i]];\n }\n return target;\n}\n\nexport function truncate(count, array) {\n const count_1 = max_1(comparePrimitives, 0, count) | 0;\n const start = 0;\n return array.slice(start, (start + count_1));\n}\n\nexport function concat(arrays, cons) {\n const arrays_1 = Array.isArray(arrays) ? arrays : (Array.from(arrays));\n const matchValue = arrays_1.length | 0;\n switch (matchValue) {\n case 0: {\n return Helpers_allocateArrayFromCons(cons, 0);\n }\n case 1: {\n return arrays_1[0];\n }\n default: {\n let totalIdx = 0;\n let totalLength = 0;\n for (let idx = 0; idx <= (arrays_1.length - 1); idx++) {\n const arr_1 = arrays_1[idx];\n totalLength = ((totalLength + arr_1.length) | 0);\n }\n const result = Helpers_allocateArrayFromCons(cons, totalLength);\n for (let idx_1 = 0; idx_1 <= (arrays_1.length - 1); idx_1++) {\n const arr_2 = arrays_1[idx_1];\n for (let j = 0; j <= (arr_2.length - 1); j++) {\n result[totalIdx] = arr_2[j];\n totalIdx = ((totalIdx + 1) | 0);\n }\n }\n return result;\n }\n }\n}\n\nexport function collect(mapping, array, cons) {\n return concat(map(mapping, array, null), cons);\n}\n\nexport function where(predicate, array) {\n return array.filter(predicate);\n}\n\nexport function indexOf(array, item_1, start, count, eq) {\n const start_1 = defaultArg(start, 0) | 0;\n const end$0027 = defaultArg(map_1((c) => (start_1 + c), count), array.length) | 0;\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (i >= end$0027) {\n return -1;\n }\n else if (eq.Equals(item_1, array[i])) {\n return i | 0;\n }\n else {\n i_mut = (i + 1);\n continue loop;\n }\n break;\n }\n };\n return loop(start_1) | 0;\n}\n\nexport function contains(value, array, eq) {\n return indexOf(array, value, void 0, void 0, eq) >= 0;\n}\n\nexport function empty(cons) {\n return Helpers_allocateArrayFromCons(cons, 0);\n}\n\nexport function singleton(value, cons) {\n const ar = Helpers_allocateArrayFromCons(cons, 1);\n ar[0] = value;\n return ar;\n}\n\nexport function initialize(count, initializer, cons) {\n if (count < 0) {\n throw (new Error(\"The input must be non-negative\\\\nParameter name: count\"));\n }\n const result = Helpers_allocateArrayFromCons(cons, count);\n for (let i = 0; i <= (count - 1); i++) {\n result[i] = initializer(i);\n }\n return result;\n}\n\nexport function pairwise(array) {\n if (array.length < 2) {\n return [];\n }\n else {\n const count = (array.length - 1) | 0;\n const result = new Array(count);\n for (let i = 0; i <= (count - 1); i++) {\n result[i] = [array[i], array[i + 1]];\n }\n return result;\n }\n}\n\nexport function replicate(count, initial, cons) {\n if (count < 0) {\n throw (new Error(\"The input must be non-negative\\\\nParameter name: count\"));\n }\n const result = Helpers_allocateArrayFromCons(cons, count);\n for (let i = 0; i <= (result.length - 1); i++) {\n result[i] = initial;\n }\n return result;\n}\n\nexport function copy(array) {\n return array.slice();\n}\n\nexport function reverse(array) {\n const array_2 = array.slice();\n return array_2.reverse();\n}\n\nexport function scan(folder, state, array, cons) {\n const res = Helpers_allocateArrayFromCons(cons, array.length + 1);\n res[0] = state;\n for (let i = 0; i <= (array.length - 1); i++) {\n res[i + 1] = folder(res[i], array[i]);\n }\n return res;\n}\n\nexport function scanBack(folder, array, state, cons) {\n const res = Helpers_allocateArrayFromCons(cons, array.length + 1);\n res[array.length] = state;\n for (let i = array.length - 1; i >= 0; i--) {\n res[i] = folder(array[i], res[i + 1]);\n }\n return res;\n}\n\nexport function skip(count, array, cons) {\n if (count > array.length) {\n throw (new Error(\"count is greater than array length\\\\nParameter name: count\"));\n }\n if (count === array.length) {\n return Helpers_allocateArrayFromCons(cons, 0);\n }\n else {\n const count_1 = ((count < 0) ? 0 : count) | 0;\n return array.slice(count_1);\n }\n}\n\nexport function skipWhile(predicate, array, cons) {\n let count = 0;\n while ((count < array.length) && predicate(array[count])) {\n count = ((count + 1) | 0);\n }\n if (count === array.length) {\n return Helpers_allocateArrayFromCons(cons, 0);\n }\n else {\n const count_1 = count | 0;\n return array.slice(count_1);\n }\n}\n\nexport function take(count, array, cons) {\n if (count < 0) {\n throw (new Error(\"The input must be non-negative\\\\nParameter name: count\"));\n }\n if (count > array.length) {\n throw (new Error(\"count is greater than array length\\\\nParameter name: count\"));\n }\n if (count === 0) {\n return Helpers_allocateArrayFromCons(cons, 0);\n }\n else {\n const start = 0;\n return array.slice(start, (start + count));\n }\n}\n\nexport function takeWhile(predicate, array, cons) {\n let count = 0;\n while ((count < array.length) && predicate(array[count])) {\n count = ((count + 1) | 0);\n }\n if (count === 0) {\n return Helpers_allocateArrayFromCons(cons, 0);\n }\n else {\n const start = 0;\n const count_1 = count | 0;\n return array.slice(start, (start + count_1));\n }\n}\n\nexport function addInPlace(x, array) {\n array.push(x);\n}\n\nexport function addRangeInPlace(range, array) {\n const enumerator = getEnumerator(range);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n addInPlace(enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), array);\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n}\n\nexport function insertRangeInPlace(index, range, array) {\n let index_1;\n let i = index;\n const enumerator = getEnumerator(range);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const x = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n (index_1 = (i | 0), array.splice(index_1, 0, x));\n i = ((i + 1) | 0);\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n}\n\nexport function removeInPlace(item_1, array, eq) {\n const i = indexOf(array, item_1, void 0, void 0, eq) | 0;\n if (i > -1) {\n array.splice(i, 1);\n return true;\n }\n else {\n return false;\n }\n}\n\nexport function removeAllInPlace(predicate, array) {\n const countRemoveAll = (count) => {\n const i = (array.findIndex(predicate)) | 0;\n if (i > -1) {\n array.splice(i, 1);\n return (countRemoveAll(count) + 1) | 0;\n }\n else {\n return count | 0;\n }\n };\n return countRemoveAll(0) | 0;\n}\n\nexport function copyTo(source, sourceIndex, target, targetIndex, count) {\n const diff = (targetIndex - sourceIndex) | 0;\n for (let i = sourceIndex; i <= ((sourceIndex + count) - 1); i++) {\n target[i + diff] = source[i];\n }\n}\n\nexport function copyToTypedArray(source, sourceIndex, target, targetIndex, count) {\n try {\n target.set(source.subarray(sourceIndex, sourceIndex + count), targetIndex);\n }\n catch (matchValue) {\n copyTo(source, sourceIndex, target, targetIndex, count);\n }\n}\n\nexport function partition(f, source, cons) {\n const len = source.length | 0;\n const res1 = Helpers_allocateArrayFromCons(cons, len);\n const res2 = Helpers_allocateArrayFromCons(cons, len);\n let iTrue = 0;\n let iFalse = 0;\n for (let i = 0; i <= (len - 1); i++) {\n if (f(source[i])) {\n res1[iTrue] = source[i];\n iTrue = ((iTrue + 1) | 0);\n }\n else {\n res2[iFalse] = source[i];\n iFalse = ((iFalse + 1) | 0);\n }\n }\n return [truncate(iTrue, res1), truncate(iFalse, res2)];\n}\n\nexport function find(predicate, array) {\n const matchValue = array.find(predicate);\n if (matchValue == null) {\n return indexNotFound();\n }\n else {\n return value_2(matchValue);\n }\n}\n\nexport function tryFind(predicate, array) {\n return array.find(predicate);\n}\n\nexport function findIndex(predicate, array) {\n const matchValue = (array.findIndex(predicate)) | 0;\n if (matchValue > -1) {\n return matchValue | 0;\n }\n else {\n return indexNotFound() | 0;\n }\n}\n\nexport function tryFindIndex(predicate, array) {\n const matchValue = (array.findIndex(predicate)) | 0;\n if (matchValue > -1) {\n return matchValue;\n }\n else {\n return void 0;\n }\n}\n\nexport function pick(chooser, array) {\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (i >= array.length) {\n return indexNotFound();\n }\n else {\n const matchValue = chooser(array[i]);\n if (matchValue != null) {\n return value_2(matchValue);\n }\n else {\n i_mut = (i + 1);\n continue loop;\n }\n }\n break;\n }\n };\n return loop(0);\n}\n\nexport function tryPick(chooser, array) {\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (i >= array.length) {\n return void 0;\n }\n else {\n const matchValue = chooser(array[i]);\n if (matchValue == null) {\n i_mut = (i + 1);\n continue loop;\n }\n else {\n return matchValue;\n }\n }\n break;\n }\n };\n return loop(0);\n}\n\nexport function findBack(predicate, array) {\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (i < 0) {\n return indexNotFound();\n }\n else if (predicate(array[i])) {\n return array[i];\n }\n else {\n i_mut = (i - 1);\n continue loop;\n }\n break;\n }\n };\n return loop(array.length - 1);\n}\n\nexport function tryFindBack(predicate, array) {\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (i < 0) {\n return void 0;\n }\n else if (predicate(array[i])) {\n return some(array[i]);\n }\n else {\n i_mut = (i - 1);\n continue loop;\n }\n break;\n }\n };\n return loop(array.length - 1);\n}\n\nexport function findLastIndex(predicate, array) {\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (i < 0) {\n return -1;\n }\n else if (predicate(array[i])) {\n return i | 0;\n }\n else {\n i_mut = (i - 1);\n continue loop;\n }\n break;\n }\n };\n return loop(array.length - 1) | 0;\n}\n\nexport function findIndexBack(predicate, array) {\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (i < 0) {\n return indexNotFound() | 0;\n }\n else if (predicate(array[i])) {\n return i | 0;\n }\n else {\n i_mut = (i - 1);\n continue loop;\n }\n break;\n }\n };\n return loop(array.length - 1) | 0;\n}\n\nexport function tryFindIndexBack(predicate, array) {\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (i < 0) {\n return void 0;\n }\n else if (predicate(array[i])) {\n return i;\n }\n else {\n i_mut = (i - 1);\n continue loop;\n }\n break;\n }\n };\n return loop(array.length - 1);\n}\n\nexport function choose(chooser, array, cons) {\n const res = [];\n for (let i = 0; i <= (array.length - 1); i++) {\n const matchValue = chooser(array[i]);\n if (matchValue != null) {\n const y = value_2(matchValue);\n res.push(y);\n }\n }\n if ((typeof cons) === \"function\") {\n return map((x) => x, res, cons);\n }\n else {\n return res;\n }\n}\n\nexport function foldIndexed(folder, state, array) {\n return array.reduce(((delegateArg, delegateArg_1, delegateArg_2) => folder(delegateArg_2, delegateArg, delegateArg_1)), state);\n}\n\nexport function fold(folder, state, array) {\n return array.reduce((folder), state);\n}\n\nexport function iterate(action, array) {\n for (let i = 0; i <= (array.length - 1); i++) {\n action(array[i]);\n }\n}\n\nexport function iterateIndexed(action, array) {\n for (let i = 0; i <= (array.length - 1); i++) {\n action(i, array[i]);\n }\n}\n\nexport function iterate2(action, array1, array2) {\n if (array1.length !== array2.length) {\n differentLengths();\n }\n for (let i = 0; i <= (array1.length - 1); i++) {\n action(array1[i], array2[i]);\n }\n}\n\nexport function iterateIndexed2(action, array1, array2) {\n if (array1.length !== array2.length) {\n differentLengths();\n }\n for (let i = 0; i <= (array1.length - 1); i++) {\n action(i, array1[i], array2[i]);\n }\n}\n\nexport function isEmpty(array) {\n return array.length === 0;\n}\n\nexport function forAll(predicate, array) {\n return array.every(predicate);\n}\n\nexport function permute(f, array) {\n const size = array.length | 0;\n const res = array.slice();\n const checkFlags = new Array(size);\n iterateIndexed((i, x) => {\n const j = f(i) | 0;\n if ((j < 0) ? true : (j >= size)) {\n throw (new Error(\"Not a valid permutation\"));\n }\n res[j] = x;\n checkFlags[j] = 1;\n }, array);\n if (!(checkFlags.every((y) => (1 === y)))) {\n throw (new Error(\"Not a valid permutation\"));\n }\n return res;\n}\n\nexport function setSlice(target, lower, upper, source) {\n const lower_1 = defaultArg(lower, 0) | 0;\n const upper_1 = defaultArg(upper, -1) | 0;\n const length = (((upper_1 >= 0) ? upper_1 : (target.length - 1)) - lower_1) | 0;\n for (let i = 0; i <= length; i++) {\n target[i + lower_1] = source[i];\n }\n}\n\nexport function sortInPlaceBy(projection, xs, comparer) {\n xs.sort((x, y) => comparer.Compare(projection(x), projection(y)));\n}\n\nexport function sortInPlace(xs, comparer) {\n xs.sort((x, y) => comparer.Compare(x, y));\n}\n\nexport function sort(xs, comparer) {\n const xs_1 = xs.slice();\n xs_1.sort((x, y) => comparer.Compare(x, y));\n return xs_1;\n}\n\nexport function sortBy(projection, xs, comparer) {\n const xs_1 = xs.slice();\n xs_1.sort((x, y) => comparer.Compare(projection(x), projection(y)));\n return xs_1;\n}\n\nexport function sortDescending(xs, comparer) {\n const xs_1 = xs.slice();\n xs_1.sort((x, y) => (comparer.Compare(x, y) * -1));\n return xs_1;\n}\n\nexport function sortByDescending(projection, xs, comparer) {\n const xs_1 = xs.slice();\n xs_1.sort((x, y) => (comparer.Compare(projection(x), projection(y)) * -1));\n return xs_1;\n}\n\nexport function sortWith(comparer, xs) {\n const comparer_1 = comparer;\n const xs_1 = xs.slice();\n xs_1.sort(comparer_1);\n return xs_1;\n}\n\nexport function allPairs(xs, ys) {\n const len1 = xs.length | 0;\n const len2 = ys.length | 0;\n const res = new Array(len1 * len2);\n for (let i = 0; i <= (xs.length - 1); i++) {\n for (let j = 0; j <= (ys.length - 1); j++) {\n res[(i * len2) + j] = [xs[i], ys[j]];\n }\n }\n return res;\n}\n\nexport function unfold(generator, state) {\n const res = [];\n const loop = (state_1_mut) => {\n loop:\n while (true) {\n const state_1 = state_1_mut;\n const matchValue = generator(state_1);\n if (matchValue != null) {\n const x = matchValue[0];\n const s = matchValue[1];\n res.push(x);\n state_1_mut = s;\n continue loop;\n }\n break;\n }\n };\n loop(state);\n return res;\n}\n\nexport function unzip(array) {\n const len = array.length | 0;\n const res1 = new Array(len);\n const res2 = new Array(len);\n iterateIndexed((i, tupledArg) => {\n res1[i] = tupledArg[0];\n res2[i] = tupledArg[1];\n }, array);\n return [res1, res2];\n}\n\nexport function unzip3(array) {\n const len = array.length | 0;\n const res1 = new Array(len);\n const res2 = new Array(len);\n const res3 = new Array(len);\n iterateIndexed((i, tupledArg) => {\n res1[i] = tupledArg[0];\n res2[i] = tupledArg[1];\n res3[i] = tupledArg[2];\n }, array);\n return [res1, res2, res3];\n}\n\nexport function zip(array1, array2) {\n if (array1.length !== array2.length) {\n differentLengths();\n }\n const result = new Array(array1.length);\n for (let i = 0; i <= (array1.length - 1); i++) {\n result[i] = [array1[i], array2[i]];\n }\n return result;\n}\n\nexport function zip3(array1, array2, array3) {\n if ((array1.length !== array2.length) ? true : (array2.length !== array3.length)) {\n differentLengths();\n }\n const result = new Array(array1.length);\n for (let i = 0; i <= (array1.length - 1); i++) {\n result[i] = [array1[i], array2[i], array3[i]];\n }\n return result;\n}\n\nexport function chunkBySize(chunkSize, array) {\n if (chunkSize < 1) {\n throw (new Error(\"The input must be positive.\\\\nParameter name: size\"));\n }\n if (array.length === 0) {\n return [[]];\n }\n else {\n const result = [];\n for (let x = 0; x <= ((~(~Math.ceil(array.length / chunkSize))) - 1); x++) {\n let slice;\n const start_1 = (x * chunkSize) | 0;\n slice = (array.slice(start_1, (start_1 + chunkSize)));\n result.push(slice);\n }\n return result;\n }\n}\n\nexport function splitAt(index, array) {\n let start;\n if ((index < 0) ? true : (index > array.length)) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return [(start = 0, array.slice(start, (start + index))), array.slice(index)];\n}\n\nexport function compareWith(comparer, source1, source2) {\n if (source1 == null) {\n if (source2 == null) {\n return 0;\n }\n else {\n return -1;\n }\n }\n else if (source2 == null) {\n return 1;\n }\n else {\n const len1 = source1.length | 0;\n const len2 = source2.length | 0;\n const len = ((len1 < len2) ? len1 : len2) | 0;\n let i = 0;\n let res = 0;\n while ((res === 0) && (i < len)) {\n res = (comparer(source1[i], source2[i]) | 0);\n i = ((i + 1) | 0);\n }\n if (res !== 0) {\n return res | 0;\n }\n else if (len1 > len2) {\n return 1;\n }\n else if (len1 < len2) {\n return -1;\n }\n else {\n return 0;\n }\n }\n}\n\nexport function compareTo(comparer, source1, source2) {\n if (source1 == null) {\n if (source2 == null) {\n return 0;\n }\n else {\n return -1;\n }\n }\n else if (source2 == null) {\n return 1;\n }\n else {\n const len1 = source1.length | 0;\n const len2 = source2.length | 0;\n if (len1 > len2) {\n return 1;\n }\n else if (len1 < len2) {\n return -1;\n }\n else {\n let i = 0;\n let res = 0;\n while ((res === 0) && (i < len1)) {\n res = (comparer(source1[i], source2[i]) | 0);\n i = ((i + 1) | 0);\n }\n return res | 0;\n }\n }\n}\n\nexport function equalsWith(equals, array1, array2) {\n if (array1 == null) {\n if (array2 == null) {\n return true;\n }\n else {\n return false;\n }\n }\n else if (array2 == null) {\n return false;\n }\n else {\n let i = 0;\n let result = true;\n const length1 = array1.length | 0;\n const length2 = array2.length | 0;\n if (length1 > length2) {\n return false;\n }\n else if (length1 < length2) {\n return false;\n }\n else {\n while ((i < length1) && result) {\n result = equals(array1[i], array2[i]);\n i = ((i + 1) | 0);\n }\n return result;\n }\n }\n}\n\nexport function exactlyOne(array) {\n if (array.length === 1) {\n return array[0];\n }\n else if (array.length === 0) {\n throw (new Error(\"The input sequence was empty\\\\nParameter name: array\"));\n }\n else {\n throw (new Error(\"Input array too long\\\\nParameter name: array\"));\n }\n}\n\nexport function tryExactlyOne(array) {\n if (array.length === 1) {\n return some(array[0]);\n }\n else {\n return void 0;\n }\n}\n\nexport function head(array) {\n if (array.length === 0) {\n throw (new Error(\"The input array was empty\\\\nParameter name: array\"));\n }\n else {\n return array[0];\n }\n}\n\nexport function tryHead(array) {\n if (array.length === 0) {\n return void 0;\n }\n else {\n return some(array[0]);\n }\n}\n\nexport function tail(array) {\n if (array.length === 0) {\n throw (new Error(\"Not enough elements\\\\nParameter name: array\"));\n }\n return array.slice(1);\n}\n\nexport function item(index, array) {\n return array[index];\n}\n\nexport function tryItem(index, array) {\n if ((index < 0) ? true : (index >= array.length)) {\n return void 0;\n }\n else {\n return some(array[index]);\n }\n}\n\nexport function foldBackIndexed(folder, array, state) {\n return array.reduceRight(((delegateArg, delegateArg_1, delegateArg_2) => folder(delegateArg_2, delegateArg_1, delegateArg)), state);\n}\n\nexport function foldBack(folder, array, state) {\n return array.reduceRight(((delegateArg, delegateArg_1) => folder(delegateArg_1, delegateArg)), state);\n}\n\nexport function foldIndexed2(folder, state, array1, array2) {\n let acc = state;\n if (array1.length !== array2.length) {\n throw (new Error(\"Arrays have different lengths\"));\n }\n for (let i = 0; i <= (array1.length - 1); i++) {\n acc = folder(i, acc, array1[i], array2[i]);\n }\n return acc;\n}\n\nexport function fold2(folder, state, array1, array2) {\n return foldIndexed2((_arg, acc, x, y) => folder(acc, x, y), state, array1, array2);\n}\n\nexport function foldBackIndexed2(folder, array1, array2, state) {\n let acc = state;\n if (array1.length !== array2.length) {\n differentLengths();\n }\n const size = array1.length | 0;\n for (let i = 1; i <= size; i++) {\n acc = folder(i - 1, array1[size - i], array2[size - i], acc);\n }\n return acc;\n}\n\nexport function foldBack2(f, array1, array2, state) {\n return foldBackIndexed2((_arg, x, y, acc) => f(x, y, acc), array1, array2, state);\n}\n\nexport function reduce(reduction, array) {\n if (array.length === 0) {\n throw (new Error(\"The input array was empty\"));\n }\n const reduction_1 = reduction;\n return array.reduce(reduction_1);\n}\n\nexport function reduceBack(reduction, array) {\n if (array.length === 0) {\n throw (new Error(\"The input array was empty\"));\n }\n const reduction_1 = reduction;\n return array.reduceRight(reduction_1);\n}\n\nexport function forAll2(predicate, array1, array2) {\n return fold2((acc, x, y) => (acc && predicate(x, y)), true, array1, array2);\n}\n\nexport function existsOffset(predicate_mut, array_mut, index_mut) {\n existsOffset:\n while (true) {\n const predicate = predicate_mut, array = array_mut, index = index_mut;\n if (index === array.length) {\n return false;\n }\n else if (predicate(array[index])) {\n return true;\n }\n else {\n predicate_mut = predicate;\n array_mut = array;\n index_mut = (index + 1);\n continue existsOffset;\n }\n break;\n }\n}\n\nexport function exists(predicate, array) {\n return existsOffset(predicate, array, 0);\n}\n\nexport function existsOffset2(predicate_mut, array1_mut, array2_mut, index_mut) {\n existsOffset2:\n while (true) {\n const predicate = predicate_mut, array1 = array1_mut, array2 = array2_mut, index = index_mut;\n if (index === array1.length) {\n return false;\n }\n else if (predicate(array1[index], array2[index])) {\n return true;\n }\n else {\n predicate_mut = predicate;\n array1_mut = array1;\n array2_mut = array2;\n index_mut = (index + 1);\n continue existsOffset2;\n }\n break;\n }\n}\n\nexport function exists2(predicate, array1, array2) {\n if (array1.length !== array2.length) {\n differentLengths();\n }\n return existsOffset2(predicate, array1, array2, 0);\n}\n\nexport function sum(array, adder) {\n let acc = adder.GetZero();\n for (let i = 0; i <= (array.length - 1); i++) {\n acc = adder.Add(acc, array[i]);\n }\n return acc;\n}\n\nexport function sumBy(projection, array, adder) {\n let acc = adder.GetZero();\n for (let i = 0; i <= (array.length - 1); i++) {\n acc = adder.Add(acc, projection(array[i]));\n }\n return acc;\n}\n\nexport function maxBy(projection, xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(projection(y), projection(x)) > 0) ? y : x), xs);\n}\n\nexport function max(xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(y, x) > 0) ? y : x), xs);\n}\n\nexport function minBy(projection, xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(projection(y), projection(x)) > 0) ? x : y), xs);\n}\n\nexport function min(xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(y, x) > 0) ? x : y), xs);\n}\n\nexport function average(array, averager) {\n if (array.length === 0) {\n throw (new Error(\"The input array was empty\\\\nParameter name: array\"));\n }\n let total = averager.GetZero();\n for (let i = 0; i <= (array.length - 1); i++) {\n total = averager.Add(total, array[i]);\n }\n return averager.DivideByInt(total, array.length);\n}\n\nexport function averageBy(projection, array, averager) {\n if (array.length === 0) {\n throw (new Error(\"The input array was empty\\\\nParameter name: array\"));\n }\n let total = averager.GetZero();\n for (let i = 0; i <= (array.length - 1); i++) {\n total = averager.Add(total, projection(array[i]));\n }\n return averager.DivideByInt(total, array.length);\n}\n\nexport function windowed(windowSize, source) {\n if (windowSize <= 0) {\n throw (new Error(\"windowSize must be positive\"));\n }\n let res;\n const len = max_1(comparePrimitives, 0, (source.length - windowSize) + 1) | 0;\n res = (new Array(len));\n for (let i = windowSize; i <= source.length; i++) {\n res[i - windowSize] = source.slice(i - windowSize, (i - 1) + 1);\n }\n return res;\n}\n\nexport function splitInto(chunks, array) {\n if (chunks < 1) {\n throw (new Error(\"The input must be positive.\\\\nParameter name: chunks\"));\n }\n if (array.length === 0) {\n return [[]];\n }\n else {\n const result = [];\n const chunks_1 = min_1(comparePrimitives, chunks, array.length) | 0;\n const minChunkSize = (~(~(array.length / chunks_1))) | 0;\n const chunksWithExtraItem = (array.length % chunks_1) | 0;\n for (let i = 0; i <= (chunks_1 - 1); i++) {\n const chunkSize = ((i < chunksWithExtraItem) ? (minChunkSize + 1) : minChunkSize) | 0;\n let slice;\n const start_1 = ((i * minChunkSize) + min_1(comparePrimitives, chunksWithExtraItem, i)) | 0;\n slice = (array.slice(start_1, (start_1 + chunkSize)));\n result.push(slice);\n }\n return result;\n }\n}\n\nexport function transpose(arrays, cons) {\n const arrays_1 = Array.isArray(arrays) ? arrays : (Array.from(arrays));\n const len = arrays_1.length | 0;\n if (len === 0) {\n return new Array(0);\n }\n else {\n const firstArray = arrays_1[0];\n const lenInner = firstArray.length | 0;\n if (!forAll((a) => (a.length === lenInner), arrays_1)) {\n differentLengths();\n }\n const result = new Array(lenInner);\n for (let i = 0; i <= (lenInner - 1); i++) {\n result[i] = Helpers_allocateArrayFromCons(cons, len);\n for (let j = 0; j <= (len - 1); j++) {\n result[i][j] = arrays_1[j][i];\n }\n }\n return result;\n }\n}\n\nexport function insertAt(index, y, xs) {\n const len = xs.length | 0;\n if ((index < 0) ? true : (index > len)) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n const target = new xs.constructor(len + 1);\n for (let i = 0; i <= (index - 1); i++) {\n target[i] = xs[i];\n }\n target[index] = y;\n for (let i_1 = index; i_1 <= (len - 1); i_1++) {\n target[i_1 + 1] = xs[i_1];\n }\n return target;\n}\n\nexport function insertManyAt(index, ys, xs) {\n const len = xs.length | 0;\n if ((index < 0) ? true : (index > len)) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n const ys_1 = Array.from(ys);\n const len2 = ys_1.length | 0;\n const target = new xs.constructor(len + len2);\n for (let i = 0; i <= (index - 1); i++) {\n target[i] = xs[i];\n }\n for (let i_1 = 0; i_1 <= (len2 - 1); i_1++) {\n target[index + i_1] = ys_1[i_1];\n }\n for (let i_2 = index; i_2 <= (len - 1); i_2++) {\n target[i_2 + len2] = xs[i_2];\n }\n return target;\n}\n\nexport function removeAt(index, xs) {\n if ((index < 0) ? true : (index >= xs.length)) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n let i = -1;\n return filter((_arg) => {\n i = ((i + 1) | 0);\n return i !== index;\n }, xs);\n}\n\nexport function removeManyAt(index, count, xs) {\n let i = -1;\n let status = -1;\n const ys = filter((_arg) => {\n i = ((i + 1) | 0);\n if (i === index) {\n status = 0;\n return false;\n }\n else if (i > index) {\n if (i < (index + count)) {\n return false;\n }\n else {\n status = 1;\n return true;\n }\n }\n else {\n return true;\n }\n }, xs);\n const status_1 = (((status === 0) && ((i + 1) === (index + count))) ? 1 : status) | 0;\n if (status_1 < 1) {\n const arg = (status_1 < 0) ? \"index\" : \"count\";\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + arg));\n }\n return ys;\n}\n\nexport function updateAt(index, y, xs) {\n const len = xs.length | 0;\n if ((index < 0) ? true : (index >= len)) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n const target = new xs.constructor(len);\n for (let i = 0; i <= (len - 1); i++) {\n target[i] = ((i === index) ? y : xs[i]);\n }\n return target;\n}\n\n","import { join } from \"./String.js\";\nimport { uncurry, disposeSafe, isArrayLike, getEnumerator, toIterator, compare, structuralHash, equals } from \"./Util.js\";\nimport { Record } from \"./Types.js\";\nimport { class_type, record_type, option_type } from \"./Reflection.js\";\nimport { SR_inputSequenceTooLong, SR_inputSequenceEmpty, SR_inputMustBeNonNegative, SR_notEnoughElements, SR_differentLengths, SR_keyNotFoundAlt, SR_indexOutOfBounds, SR_inputWasEmpty } from \"./Global.js\";\nimport { defaultArg, value as value_1, some } from \"./Option.js\";\nimport { transpose as transpose_1, splitInto as splitInto_1, windowed as windowed_1, pairwise as pairwise_1, chunkBySize as chunkBySize_1, map as map_1, permute as permute_1, tryFindIndexBack as tryFindIndexBack_1, tryFindBack as tryFindBack_1, scanBack as scanBack_1, foldBack2 as foldBack2_1, foldBack as foldBack_1, fill } from \"./Array.js\";\n\nexport class FSharpList extends Record {\n constructor(head, tail) {\n super();\n this.head = head;\n this.tail = tail;\n }\n toString() {\n const xs = this;\n return (\"[\" + join(\"; \", xs)) + \"]\";\n }\n Equals(other) {\n const xs = this;\n if (xs === other) {\n return true;\n }\n else {\n const loop = (xs_1_mut, ys_1_mut) => {\n loop:\n while (true) {\n const xs_1 = xs_1_mut, ys_1 = ys_1_mut;\n const matchValue = [xs_1.tail, ys_1.tail];\n if (matchValue[0] != null) {\n if (matchValue[1] != null) {\n const xt = matchValue[0];\n const yt = matchValue[1];\n if (equals(xs_1.head, ys_1.head)) {\n xs_1_mut = xt;\n ys_1_mut = yt;\n continue loop;\n }\n else {\n return false;\n }\n }\n else {\n return false;\n }\n }\n else if (matchValue[1] != null) {\n return false;\n }\n else {\n return true;\n }\n break;\n }\n };\n return loop(xs, other);\n }\n }\n GetHashCode() {\n const xs = this;\n const loop = (i_mut, h_mut, xs_1_mut) => {\n loop:\n while (true) {\n const i = i_mut, h = h_mut, xs_1 = xs_1_mut;\n const matchValue = xs_1.tail;\n if (matchValue != null) {\n const t = matchValue;\n if (i > 18) {\n return h | 0;\n }\n else {\n i_mut = (i + 1);\n h_mut = (((h << 1) + structuralHash(xs_1.head)) + (631 * i));\n xs_1_mut = t;\n continue loop;\n }\n }\n else {\n return h | 0;\n }\n break;\n }\n };\n return loop(0, 0, xs) | 0;\n }\n toJSON(_key) {\n const this$ = this;\n return Array.from(this$);\n }\n CompareTo(other) {\n const xs = this;\n const loop = (xs_1_mut, ys_1_mut) => {\n loop:\n while (true) {\n const xs_1 = xs_1_mut, ys_1 = ys_1_mut;\n const matchValue = [xs_1.tail, ys_1.tail];\n if (matchValue[0] != null) {\n if (matchValue[1] != null) {\n const xt = matchValue[0];\n const yt = matchValue[1];\n const c = compare(xs_1.head, ys_1.head) | 0;\n if (c === 0) {\n xs_1_mut = xt;\n ys_1_mut = yt;\n continue loop;\n }\n else {\n return c | 0;\n }\n }\n else {\n return 1;\n }\n }\n else if (matchValue[1] != null) {\n return -1;\n }\n else {\n return 0;\n }\n break;\n }\n };\n return loop(xs, other) | 0;\n }\n GetEnumerator() {\n const xs = this;\n return ListEnumerator$1_$ctor_3002E699(xs);\n }\n [Symbol.iterator]() {\n return toIterator(this.GetEnumerator());\n }\n [\"System.Collections.IEnumerable.GetEnumerator\"]() {\n const xs = this;\n return getEnumerator(xs);\n }\n}\n\nexport function FSharpList$reflection(gen0) {\n return record_type(\"ListModule.FSharpList\", [gen0], FSharpList, () => [[\"head\", gen0], [\"tail\", option_type(FSharpList$reflection(gen0))]]);\n}\n\nexport class ListEnumerator$1 {\n constructor(xs) {\n this.xs = xs;\n this.it = this.xs;\n this.current = null;\n }\n [\"System.Collections.Generic.IEnumerator`1.get_Current\"]() {\n const __ = this;\n return __.current;\n }\n [\"System.Collections.IEnumerator.get_Current\"]() {\n const __ = this;\n return __.current;\n }\n [\"System.Collections.IEnumerator.MoveNext\"]() {\n const __ = this;\n const matchValue = __.it.tail;\n if (matchValue != null) {\n const t = matchValue;\n __.current = __.it.head;\n __.it = t;\n return true;\n }\n else {\n return false;\n }\n }\n [\"System.Collections.IEnumerator.Reset\"]() {\n const __ = this;\n __.it = __.xs;\n __.current = null;\n }\n Dispose() {\n }\n}\n\nexport function ListEnumerator$1$reflection(gen0) {\n return class_type(\"ListModule.ListEnumerator`1\", [gen0], ListEnumerator$1);\n}\n\nexport function ListEnumerator$1_$ctor_3002E699(xs) {\n return new ListEnumerator$1(xs);\n}\n\nexport function FSharpList_get_Empty() {\n return new FSharpList(null, void 0);\n}\n\nexport function FSharpList_Cons_305B8EAC(x, xs) {\n return new FSharpList(x, xs);\n}\n\nexport function FSharpList__get_IsEmpty(xs) {\n return xs.tail == null;\n}\n\nexport function FSharpList__get_Length(xs) {\n const loop = (i_mut, xs_1_mut) => {\n loop:\n while (true) {\n const i = i_mut, xs_1 = xs_1_mut;\n const matchValue = xs_1.tail;\n if (matchValue != null) {\n i_mut = (i + 1);\n xs_1_mut = matchValue;\n continue loop;\n }\n else {\n return i | 0;\n }\n break;\n }\n };\n return loop(0, xs) | 0;\n}\n\nexport function FSharpList__get_Head(xs) {\n const matchValue = xs.tail;\n if (matchValue != null) {\n return xs.head;\n }\n else {\n throw (new Error((SR_inputWasEmpty + \"\\\\nParameter name: \") + \"list\"));\n }\n}\n\nexport function FSharpList__get_Tail(xs) {\n const matchValue = xs.tail;\n if (matchValue != null) {\n return matchValue;\n }\n else {\n throw (new Error((SR_inputWasEmpty + \"\\\\nParameter name: \") + \"list\"));\n }\n}\n\nexport function FSharpList__get_Item_Z524259A4(xs, index) {\n const loop = (i_mut, xs_1_mut) => {\n loop:\n while (true) {\n const i = i_mut, xs_1 = xs_1_mut;\n const matchValue = xs_1.tail;\n if (matchValue != null) {\n if (i === index) {\n return xs_1.head;\n }\n else {\n i_mut = (i + 1);\n xs_1_mut = matchValue;\n continue loop;\n }\n }\n else {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n break;\n }\n };\n return loop(0, xs);\n}\n\nexport function empty() {\n return FSharpList_get_Empty();\n}\n\nexport function cons(x, xs) {\n return FSharpList_Cons_305B8EAC(x, xs);\n}\n\nexport function singleton(x) {\n return FSharpList_Cons_305B8EAC(x, FSharpList_get_Empty());\n}\n\nexport function isEmpty(xs) {\n return FSharpList__get_IsEmpty(xs);\n}\n\nexport function length(xs) {\n return FSharpList__get_Length(xs);\n}\n\nexport function head(xs) {\n return FSharpList__get_Head(xs);\n}\n\nexport function tryHead(xs) {\n if (FSharpList__get_IsEmpty(xs)) {\n return void 0;\n }\n else {\n return some(FSharpList__get_Head(xs));\n }\n}\n\nexport function tail(xs) {\n return FSharpList__get_Tail(xs);\n}\n\nexport function tryLast(xs_mut) {\n tryLast:\n while (true) {\n const xs = xs_mut;\n if (FSharpList__get_IsEmpty(xs)) {\n return void 0;\n }\n else {\n const t = FSharpList__get_Tail(xs);\n if (FSharpList__get_IsEmpty(t)) {\n return some(FSharpList__get_Head(xs));\n }\n else {\n xs_mut = t;\n continue tryLast;\n }\n }\n break;\n }\n}\n\nexport function last(xs) {\n const matchValue = tryLast(xs);\n if (matchValue == null) {\n throw (new Error(SR_inputWasEmpty));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function compareWith(comparer, xs, ys) {\n const loop = (xs_1_mut, ys_1_mut) => {\n loop:\n while (true) {\n const xs_1 = xs_1_mut, ys_1 = ys_1_mut;\n const matchValue = [FSharpList__get_IsEmpty(xs_1), FSharpList__get_IsEmpty(ys_1)];\n if (matchValue[0]) {\n if (matchValue[1]) {\n return 0;\n }\n else {\n return -1;\n }\n }\n else if (matchValue[1]) {\n return 1;\n }\n else {\n const c = comparer(FSharpList__get_Head(xs_1), FSharpList__get_Head(ys_1)) | 0;\n if (c === 0) {\n xs_1_mut = FSharpList__get_Tail(xs_1);\n ys_1_mut = FSharpList__get_Tail(ys_1);\n continue loop;\n }\n else {\n return c | 0;\n }\n }\n break;\n }\n };\n return loop(xs, ys) | 0;\n}\n\nexport function toArray(xs) {\n const len = FSharpList__get_Length(xs) | 0;\n const res = fill(new Array(len), 0, len, null);\n const loop = (i_mut, xs_1_mut) => {\n loop:\n while (true) {\n const i = i_mut, xs_1 = xs_1_mut;\n if (!FSharpList__get_IsEmpty(xs_1)) {\n res[i] = FSharpList__get_Head(xs_1);\n i_mut = (i + 1);\n xs_1_mut = FSharpList__get_Tail(xs_1);\n continue loop;\n }\n break;\n }\n };\n loop(0, xs);\n return res;\n}\n\nexport function fold(folder, state, xs) {\n let acc = state;\n let xs_1 = xs;\n while (!FSharpList__get_IsEmpty(xs_1)) {\n acc = folder(acc, FSharpList__get_Head(xs_1));\n xs_1 = FSharpList__get_Tail(xs_1);\n }\n return acc;\n}\n\nexport function reverse(xs) {\n return fold((acc, x) => FSharpList_Cons_305B8EAC(x, acc), FSharpList_get_Empty(), xs);\n}\n\nexport function foldBack(folder, xs, state) {\n return foldBack_1(folder, toArray(xs), state);\n}\n\nexport function foldIndexed(folder, state, xs) {\n const loop = (i_mut, acc_mut, xs_1_mut) => {\n loop:\n while (true) {\n const i = i_mut, acc = acc_mut, xs_1 = xs_1_mut;\n if (FSharpList__get_IsEmpty(xs_1)) {\n return acc;\n }\n else {\n i_mut = (i + 1);\n acc_mut = folder(i, acc, FSharpList__get_Head(xs_1));\n xs_1_mut = FSharpList__get_Tail(xs_1);\n continue loop;\n }\n break;\n }\n };\n return loop(0, state, xs);\n}\n\nexport function fold2(folder, state, xs, ys) {\n let acc = state;\n let xs_1 = xs;\n let ys_1 = ys;\n while ((!FSharpList__get_IsEmpty(xs_1)) && (!FSharpList__get_IsEmpty(ys_1))) {\n acc = folder(acc, FSharpList__get_Head(xs_1), FSharpList__get_Head(ys_1));\n xs_1 = FSharpList__get_Tail(xs_1);\n ys_1 = FSharpList__get_Tail(ys_1);\n }\n return acc;\n}\n\nexport function foldBack2(folder, xs, ys, state) {\n return foldBack2_1(folder, toArray(xs), toArray(ys), state);\n}\n\nexport function unfold(gen, state) {\n const loop = (acc_mut, node_mut) => {\n let t;\n loop:\n while (true) {\n const acc = acc_mut, node = node_mut;\n const matchValue = gen(acc);\n if (matchValue != null) {\n acc_mut = matchValue[1];\n node_mut = ((t = (new FSharpList(matchValue[0], void 0)), (node.tail = t, t)));\n continue loop;\n }\n else {\n return node;\n }\n break;\n }\n };\n const root = FSharpList_get_Empty();\n const node_1 = loop(state, root);\n const t_2 = FSharpList_get_Empty();\n node_1.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function iterate(action, xs) {\n fold((unitVar, x) => {\n action(x);\n }, void 0, xs);\n}\n\nexport function iterate2(action, xs, ys) {\n fold2((unitVar, x, y) => {\n action(x, y);\n }, void 0, xs, ys);\n}\n\nexport function iterateIndexed(action, xs) {\n fold((i, x) => {\n action(i, x);\n return (i + 1) | 0;\n }, 0, xs);\n}\n\nexport function iterateIndexed2(action, xs, ys) {\n fold2((i, x, y) => {\n action(i, x, y);\n return (i + 1) | 0;\n }, 0, xs, ys);\n}\n\nexport function toSeq(xs) {\n return xs;\n}\n\nexport function ofArrayWithTail(xs, tail_1) {\n let res = tail_1;\n for (let i = xs.length - 1; i >= 0; i--) {\n res = FSharpList_Cons_305B8EAC(xs[i], res);\n }\n return res;\n}\n\nexport function ofArray(xs) {\n return ofArrayWithTail(xs, FSharpList_get_Empty());\n}\n\nexport function ofSeq(xs) {\n let xs_3, t;\n if (isArrayLike(xs)) {\n return ofArray(xs);\n }\n else if (xs instanceof FSharpList) {\n return xs;\n }\n else {\n const root = FSharpList_get_Empty();\n let node = root;\n const enumerator = getEnumerator(xs);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const x = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n node = ((xs_3 = node, (t = (new FSharpList(x, void 0)), (xs_3.tail = t, t))));\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n const xs_5 = node;\n const t_2 = FSharpList_get_Empty();\n xs_5.tail = t_2;\n return FSharpList__get_Tail(root);\n }\n}\n\nexport function concat(lists) {\n const root = FSharpList_get_Empty();\n let node = root;\n const action = (xs) => {\n node = fold((acc, x) => {\n const t = new FSharpList(x, void 0);\n acc.tail = t;\n return t;\n }, node, xs);\n };\n if (isArrayLike(lists)) {\n lists.forEach(action);\n }\n else if (lists instanceof FSharpList) {\n iterate(action, lists);\n }\n else {\n const enumerator = getEnumerator(lists);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n action(enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n }\n const xs_6 = node;\n const t_2 = FSharpList_get_Empty();\n xs_6.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function scan(folder, state, xs) {\n let xs_4, t_2;\n const root = FSharpList_get_Empty();\n let node;\n const t = new FSharpList(state, void 0);\n root.tail = t;\n node = t;\n let acc = state;\n let xs_3 = xs;\n while (!FSharpList__get_IsEmpty(xs_3)) {\n acc = folder(acc, FSharpList__get_Head(xs_3));\n node = ((xs_4 = node, (t_2 = (new FSharpList(acc, void 0)), (xs_4.tail = t_2, t_2))));\n xs_3 = FSharpList__get_Tail(xs_3);\n }\n const xs_6 = node;\n const t_4 = FSharpList_get_Empty();\n xs_6.tail = t_4;\n return FSharpList__get_Tail(root);\n}\n\nexport function scanBack(folder, xs, state) {\n return ofArray(scanBack_1(folder, toArray(xs), state));\n}\n\nexport function append(xs, ys) {\n return fold((acc, x) => FSharpList_Cons_305B8EAC(x, acc), ys, reverse(xs));\n}\n\nexport function collect(mapping, xs) {\n let xs_1, t;\n const root = FSharpList_get_Empty();\n let node = root;\n let ys = xs;\n while (!FSharpList__get_IsEmpty(ys)) {\n let zs = mapping(FSharpList__get_Head(ys));\n while (!FSharpList__get_IsEmpty(zs)) {\n node = ((xs_1 = node, (t = (new FSharpList(FSharpList__get_Head(zs), void 0)), (xs_1.tail = t, t))));\n zs = FSharpList__get_Tail(zs);\n }\n ys = FSharpList__get_Tail(ys);\n }\n const xs_3 = node;\n const t_2 = FSharpList_get_Empty();\n xs_3.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function mapIndexed(mapping, xs) {\n const root = FSharpList_get_Empty();\n const node = foldIndexed((i, acc, x) => {\n const t = new FSharpList(mapping(i, x), void 0);\n acc.tail = t;\n return t;\n }, root, xs);\n const t_2 = FSharpList_get_Empty();\n node.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function map(mapping, xs) {\n const root = FSharpList_get_Empty();\n const node = fold((acc, x) => {\n const t = new FSharpList(mapping(x), void 0);\n acc.tail = t;\n return t;\n }, root, xs);\n const t_2 = FSharpList_get_Empty();\n node.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function indexed(xs) {\n return mapIndexed((i, x) => [i, x], xs);\n}\n\nexport function map2(mapping, xs, ys) {\n const root = FSharpList_get_Empty();\n const node = fold2((acc, x, y) => {\n const t = new FSharpList(mapping(x, y), void 0);\n acc.tail = t;\n return t;\n }, root, xs, ys);\n const t_2 = FSharpList_get_Empty();\n node.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function mapIndexed2(mapping, xs, ys) {\n const loop = (i_mut, acc_mut, xs_1_mut, ys_1_mut) => {\n let t;\n loop:\n while (true) {\n const i = i_mut, acc = acc_mut, xs_1 = xs_1_mut, ys_1 = ys_1_mut;\n if (FSharpList__get_IsEmpty(xs_1) ? true : FSharpList__get_IsEmpty(ys_1)) {\n return acc;\n }\n else {\n i_mut = (i + 1);\n acc_mut = ((t = (new FSharpList(mapping(i, FSharpList__get_Head(xs_1), FSharpList__get_Head(ys_1)), void 0)), (acc.tail = t, t)));\n xs_1_mut = FSharpList__get_Tail(xs_1);\n ys_1_mut = FSharpList__get_Tail(ys_1);\n continue loop;\n }\n break;\n }\n };\n const root = FSharpList_get_Empty();\n const node_1 = loop(0, root, xs, ys);\n const t_2 = FSharpList_get_Empty();\n node_1.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function map3(mapping, xs, ys, zs) {\n const loop = (acc_mut, xs_1_mut, ys_1_mut, zs_1_mut) => {\n let t;\n loop:\n while (true) {\n const acc = acc_mut, xs_1 = xs_1_mut, ys_1 = ys_1_mut, zs_1 = zs_1_mut;\n if ((FSharpList__get_IsEmpty(xs_1) ? true : FSharpList__get_IsEmpty(ys_1)) ? true : FSharpList__get_IsEmpty(zs_1)) {\n return acc;\n }\n else {\n acc_mut = ((t = (new FSharpList(mapping(FSharpList__get_Head(xs_1), FSharpList__get_Head(ys_1), FSharpList__get_Head(zs_1)), void 0)), (acc.tail = t, t)));\n xs_1_mut = FSharpList__get_Tail(xs_1);\n ys_1_mut = FSharpList__get_Tail(ys_1);\n zs_1_mut = FSharpList__get_Tail(zs_1);\n continue loop;\n }\n break;\n }\n };\n const root = FSharpList_get_Empty();\n const node_1 = loop(root, xs, ys, zs);\n const t_2 = FSharpList_get_Empty();\n node_1.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function mapFold(mapping, state, xs) {\n const root = FSharpList_get_Empty();\n const patternInput_1 = fold((tupledArg, x) => {\n let t;\n const patternInput = mapping(tupledArg[1], x);\n return [(t = (new FSharpList(patternInput[0], void 0)), (tupledArg[0].tail = t, t)), patternInput[1]];\n }, [root, state], xs);\n const t_2 = FSharpList_get_Empty();\n patternInput_1[0].tail = t_2;\n return [FSharpList__get_Tail(root), patternInput_1[1]];\n}\n\nexport function mapFoldBack(mapping, xs, state) {\n return mapFold((acc, x) => mapping(x, acc), state, reverse(xs));\n}\n\nexport function tryPick(f, xs) {\n const loop = (xs_1_mut) => {\n loop:\n while (true) {\n const xs_1 = xs_1_mut;\n if (FSharpList__get_IsEmpty(xs_1)) {\n return void 0;\n }\n else {\n const matchValue = f(FSharpList__get_Head(xs_1));\n if (matchValue == null) {\n xs_1_mut = FSharpList__get_Tail(xs_1);\n continue loop;\n }\n else {\n return matchValue;\n }\n }\n break;\n }\n };\n return loop(xs);\n}\n\nexport function pick(f, xs) {\n const matchValue = tryPick(f, xs);\n if (matchValue == null) {\n throw (new Error(SR_keyNotFoundAlt));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function tryFind(f, xs) {\n return tryPick((x) => (f(x) ? some(x) : (void 0)), xs);\n}\n\nexport function find(f, xs) {\n const matchValue = tryFind(f, xs);\n if (matchValue == null) {\n throw (new Error(SR_keyNotFoundAlt));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function tryFindBack(f, xs) {\n return tryFindBack_1(f, toArray(xs));\n}\n\nexport function findBack(f, xs) {\n const matchValue = tryFindBack(f, xs);\n if (matchValue == null) {\n throw (new Error(SR_keyNotFoundAlt));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function tryFindIndex(f, xs) {\n const loop = (i_mut, xs_1_mut) => {\n loop:\n while (true) {\n const i = i_mut, xs_1 = xs_1_mut;\n if (FSharpList__get_IsEmpty(xs_1)) {\n return void 0;\n }\n else if (f(FSharpList__get_Head(xs_1))) {\n return i;\n }\n else {\n i_mut = (i + 1);\n xs_1_mut = FSharpList__get_Tail(xs_1);\n continue loop;\n }\n break;\n }\n };\n return loop(0, xs);\n}\n\nexport function findIndex(f, xs) {\n const matchValue = tryFindIndex(f, xs);\n if (matchValue == null) {\n throw (new Error(SR_keyNotFoundAlt));\n }\n else {\n return matchValue | 0;\n }\n}\n\nexport function tryFindIndexBack(f, xs) {\n return tryFindIndexBack_1(f, toArray(xs));\n}\n\nexport function findIndexBack(f, xs) {\n const matchValue = tryFindIndexBack(f, xs);\n if (matchValue == null) {\n throw (new Error(SR_keyNotFoundAlt));\n }\n else {\n return matchValue | 0;\n }\n}\n\nexport function tryItem(n, xs) {\n const loop = (i_mut, xs_1_mut) => {\n loop:\n while (true) {\n const i = i_mut, xs_1 = xs_1_mut;\n if (FSharpList__get_IsEmpty(xs_1)) {\n return void 0;\n }\n else if (i === n) {\n return some(FSharpList__get_Head(xs_1));\n }\n else {\n i_mut = (i + 1);\n xs_1_mut = FSharpList__get_Tail(xs_1);\n continue loop;\n }\n break;\n }\n };\n return loop(0, xs);\n}\n\nexport function item(n, xs) {\n return FSharpList__get_Item_Z524259A4(xs, n);\n}\n\nexport function filter(f, xs) {\n const root = FSharpList_get_Empty();\n const node = fold((acc, x) => {\n if (f(x)) {\n const t = new FSharpList(x, void 0);\n acc.tail = t;\n return t;\n }\n else {\n return acc;\n }\n }, root, xs);\n const t_2 = FSharpList_get_Empty();\n node.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function partition(f, xs) {\n const patternInput = [FSharpList_get_Empty(), FSharpList_get_Empty()];\n const root2 = patternInput[1];\n const root1 = patternInput[0];\n const patternInput_1 = fold(uncurry(2, (tupledArg) => {\n const lacc = tupledArg[0];\n const racc = tupledArg[1];\n return (x) => {\n let t, t_2;\n return f(x) ? [(t = (new FSharpList(x, void 0)), (lacc.tail = t, t)), racc] : [lacc, (t_2 = (new FSharpList(x, void 0)), (racc.tail = t_2, t_2))];\n };\n }), [root1, root2], xs);\n const t_4 = FSharpList_get_Empty();\n patternInput_1[0].tail = t_4;\n const t_5 = FSharpList_get_Empty();\n patternInput_1[1].tail = t_5;\n return [FSharpList__get_Tail(root1), FSharpList__get_Tail(root2)];\n}\n\nexport function choose(f, xs) {\n const root = FSharpList_get_Empty();\n const node = fold((acc, x) => {\n const matchValue = f(x);\n if (matchValue == null) {\n return acc;\n }\n else {\n const t = new FSharpList(value_1(matchValue), void 0);\n acc.tail = t;\n return t;\n }\n }, root, xs);\n const t_2 = FSharpList_get_Empty();\n node.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function contains(value, xs, eq) {\n return tryFindIndex((v) => eq.Equals(value, v), xs) != null;\n}\n\nexport function initialize(n, f) {\n let xs, t;\n const root = FSharpList_get_Empty();\n let node = root;\n for (let i = 0; i <= (n - 1); i++) {\n node = ((xs = node, (t = (new FSharpList(f(i), void 0)), (xs.tail = t, t))));\n }\n const xs_2 = node;\n const t_2 = FSharpList_get_Empty();\n xs_2.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function replicate(n, x) {\n return initialize(n, (_arg) => x);\n}\n\nexport function reduce(f, xs) {\n if (FSharpList__get_IsEmpty(xs)) {\n throw (new Error(SR_inputWasEmpty));\n }\n else {\n return fold(f, head(xs), tail(xs));\n }\n}\n\nexport function reduceBack(f, xs) {\n if (FSharpList__get_IsEmpty(xs)) {\n throw (new Error(SR_inputWasEmpty));\n }\n else {\n return foldBack(f, tail(xs), head(xs));\n }\n}\n\nexport function forAll(f, xs) {\n return fold((acc, x) => (acc && f(x)), true, xs);\n}\n\nexport function forAll2(f, xs, ys) {\n return fold2((acc, x, y) => (acc && f(x, y)), true, xs, ys);\n}\n\nexport function exists(f, xs) {\n return tryFindIndex(f, xs) != null;\n}\n\nexport function exists2(f_mut, xs_mut, ys_mut) {\n exists2:\n while (true) {\n const f = f_mut, xs = xs_mut, ys = ys_mut;\n const matchValue = [FSharpList__get_IsEmpty(xs), FSharpList__get_IsEmpty(ys)];\n let pattern_matching_result;\n if (matchValue[0]) {\n if (matchValue[1]) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 2;\n }\n }\n else if (matchValue[1]) {\n pattern_matching_result = 2;\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n return false;\n }\n case 1: {\n if (f(FSharpList__get_Head(xs), FSharpList__get_Head(ys))) {\n return true;\n }\n else {\n f_mut = f;\n xs_mut = FSharpList__get_Tail(xs);\n ys_mut = FSharpList__get_Tail(ys);\n continue exists2;\n }\n }\n case 2: {\n throw (new Error((SR_differentLengths + \"\\\\nParameter name: \") + \"list2\"));\n }\n }\n break;\n }\n}\n\nexport function unzip(xs) {\n return foldBack((tupledArg, tupledArg_1) => [FSharpList_Cons_305B8EAC(tupledArg[0], tupledArg_1[0]), FSharpList_Cons_305B8EAC(tupledArg[1], tupledArg_1[1])], xs, [FSharpList_get_Empty(), FSharpList_get_Empty()]);\n}\n\nexport function unzip3(xs) {\n return foldBack((tupledArg, tupledArg_1) => [FSharpList_Cons_305B8EAC(tupledArg[0], tupledArg_1[0]), FSharpList_Cons_305B8EAC(tupledArg[1], tupledArg_1[1]), FSharpList_Cons_305B8EAC(tupledArg[2], tupledArg_1[2])], xs, [FSharpList_get_Empty(), FSharpList_get_Empty(), FSharpList_get_Empty()]);\n}\n\nexport function zip(xs, ys) {\n return map2((x, y) => [x, y], xs, ys);\n}\n\nexport function zip3(xs, ys, zs) {\n return map3((x, y, z) => [x, y, z], xs, ys, zs);\n}\n\nexport function sortWith(comparer, xs) {\n const arr = toArray(xs);\n arr.sort(comparer);\n return ofArray(arr);\n}\n\nexport function sort(xs, comparer) {\n return sortWith((x, y) => comparer.Compare(x, y), xs);\n}\n\nexport function sortBy(projection, xs, comparer) {\n return sortWith((x, y) => comparer.Compare(projection(x), projection(y)), xs);\n}\n\nexport function sortDescending(xs, comparer) {\n return sortWith((x, y) => (comparer.Compare(x, y) * -1), xs);\n}\n\nexport function sortByDescending(projection, xs, comparer) {\n return sortWith((x, y) => (comparer.Compare(projection(x), projection(y)) * -1), xs);\n}\n\nexport function sum(xs, adder) {\n return fold((acc, x) => adder.Add(acc, x), adder.GetZero(), xs);\n}\n\nexport function sumBy(f, xs, adder) {\n return fold((acc, x) => adder.Add(acc, f(x)), adder.GetZero(), xs);\n}\n\nexport function maxBy(projection, xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(projection(y), projection(x)) > 0) ? y : x), xs);\n}\n\nexport function max(xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(y, x) > 0) ? y : x), xs);\n}\n\nexport function minBy(projection, xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(projection(y), projection(x)) > 0) ? x : y), xs);\n}\n\nexport function min(xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(y, x) > 0) ? x : y), xs);\n}\n\nexport function average(xs, averager) {\n let count = 0;\n const total = fold((acc, x) => {\n count = ((count + 1) | 0);\n return averager.Add(acc, x);\n }, averager.GetZero(), xs);\n return averager.DivideByInt(total, count);\n}\n\nexport function averageBy(f, xs, averager) {\n let count = 0;\n const total = fold((acc, x) => {\n count = ((count + 1) | 0);\n return averager.Add(acc, f(x));\n }, averager.GetZero(), xs);\n return averager.DivideByInt(total, count);\n}\n\nexport function permute(f, xs) {\n return ofArray(permute_1(f, toArray(xs)));\n}\n\nexport function chunkBySize(chunkSize, xs) {\n return ofArray(map_1(ofArray, chunkBySize_1(chunkSize, toArray(xs))));\n}\n\nexport function allPairs(xs, ys) {\n const root = FSharpList_get_Empty();\n let node = root;\n iterate((x) => {\n iterate((y) => {\n let xs_1, t;\n node = ((xs_1 = node, (t = (new FSharpList([x, y], void 0)), (xs_1.tail = t, t))));\n }, ys);\n }, xs);\n const xs_3 = node;\n const t_2 = FSharpList_get_Empty();\n xs_3.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function skip(count_mut, xs_mut) {\n skip:\n while (true) {\n const count = count_mut, xs = xs_mut;\n if (count <= 0) {\n return xs;\n }\n else if (FSharpList__get_IsEmpty(xs)) {\n throw (new Error((SR_notEnoughElements + \"\\\\nParameter name: \") + \"list\"));\n }\n else {\n count_mut = (count - 1);\n xs_mut = FSharpList__get_Tail(xs);\n continue skip;\n }\n break;\n }\n}\n\nexport function skipWhile(predicate_mut, xs_mut) {\n skipWhile:\n while (true) {\n const predicate = predicate_mut, xs = xs_mut;\n if (FSharpList__get_IsEmpty(xs)) {\n return xs;\n }\n else if (!predicate(FSharpList__get_Head(xs))) {\n return xs;\n }\n else {\n predicate_mut = predicate;\n xs_mut = FSharpList__get_Tail(xs);\n continue skipWhile;\n }\n break;\n }\n}\n\nexport function take(count, xs) {\n if (count < 0) {\n throw (new Error((SR_inputMustBeNonNegative + \"\\\\nParameter name: \") + \"count\"));\n }\n const loop = (i_mut, acc_mut, xs_1_mut) => {\n let t;\n loop:\n while (true) {\n const i = i_mut, acc = acc_mut, xs_1 = xs_1_mut;\n if (i <= 0) {\n return acc;\n }\n else if (FSharpList__get_IsEmpty(xs_1)) {\n throw (new Error((SR_notEnoughElements + \"\\\\nParameter name: \") + \"list\"));\n }\n else {\n i_mut = (i - 1);\n acc_mut = ((t = (new FSharpList(FSharpList__get_Head(xs_1), void 0)), (acc.tail = t, t)));\n xs_1_mut = FSharpList__get_Tail(xs_1);\n continue loop;\n }\n break;\n }\n };\n const root = FSharpList_get_Empty();\n const node = loop(count, root, xs);\n const t_2 = FSharpList_get_Empty();\n node.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function takeWhile(predicate, xs) {\n const loop = (acc_mut, xs_1_mut) => {\n let t;\n loop:\n while (true) {\n const acc = acc_mut, xs_1 = xs_1_mut;\n if (FSharpList__get_IsEmpty(xs_1)) {\n return acc;\n }\n else if (!predicate(FSharpList__get_Head(xs_1))) {\n return acc;\n }\n else {\n acc_mut = ((t = (new FSharpList(FSharpList__get_Head(xs_1), void 0)), (acc.tail = t, t)));\n xs_1_mut = FSharpList__get_Tail(xs_1);\n continue loop;\n }\n break;\n }\n };\n const root = FSharpList_get_Empty();\n const node = loop(root, xs);\n const t_2 = FSharpList_get_Empty();\n node.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function truncate(count, xs) {\n const loop = (i_mut, acc_mut, xs_1_mut) => {\n let t;\n loop:\n while (true) {\n const i = i_mut, acc = acc_mut, xs_1 = xs_1_mut;\n if (i <= 0) {\n return acc;\n }\n else if (FSharpList__get_IsEmpty(xs_1)) {\n return acc;\n }\n else {\n i_mut = (i - 1);\n acc_mut = ((t = (new FSharpList(FSharpList__get_Head(xs_1), void 0)), (acc.tail = t, t)));\n xs_1_mut = FSharpList__get_Tail(xs_1);\n continue loop;\n }\n break;\n }\n };\n const root = FSharpList_get_Empty();\n const node = loop(count, root, xs);\n const t_2 = FSharpList_get_Empty();\n node.tail = t_2;\n return FSharpList__get_Tail(root);\n}\n\nexport function getSlice(startIndex, endIndex, xs) {\n const len = length(xs) | 0;\n const startIndex_1 = defaultArg(startIndex, 0) | 0;\n const endIndex_1 = defaultArg(endIndex, len - 1) | 0;\n if (startIndex_1 < 0) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"startIndex\"));\n }\n else if (endIndex_1 >= len) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"endIndex\"));\n }\n else if (endIndex_1 < startIndex_1) {\n return FSharpList_get_Empty();\n }\n else {\n return take((endIndex_1 - startIndex_1) + 1, skip(startIndex_1, xs));\n }\n}\n\nexport function splitAt(index, xs) {\n if (index < 0) {\n throw (new Error((SR_inputMustBeNonNegative + \"\\\\nParameter name: \") + \"index\"));\n }\n if (index > FSharpList__get_Length(xs)) {\n throw (new Error((SR_notEnoughElements + \"\\\\nParameter name: \") + \"index\"));\n }\n return [take(index, xs), skip(index, xs)];\n}\n\nexport function exactlyOne(xs) {\n if (FSharpList__get_IsEmpty(xs)) {\n throw (new Error((SR_inputSequenceEmpty + \"\\\\nParameter name: \") + \"list\"));\n }\n else if (FSharpList__get_IsEmpty(FSharpList__get_Tail(xs))) {\n return FSharpList__get_Head(xs);\n }\n else {\n throw (new Error((SR_inputSequenceTooLong + \"\\\\nParameter name: \") + \"list\"));\n }\n}\n\nexport function tryExactlyOne(xs) {\n if ((!FSharpList__get_IsEmpty(xs)) && FSharpList__get_IsEmpty(FSharpList__get_Tail(xs))) {\n return some(FSharpList__get_Head(xs));\n }\n else {\n return void 0;\n }\n}\n\nexport function where(predicate, xs) {\n return filter(predicate, xs);\n}\n\nexport function pairwise(xs) {\n return ofArray(pairwise_1(toArray(xs)));\n}\n\nexport function windowed(windowSize, xs) {\n return ofArray(map_1(ofArray, windowed_1(windowSize, toArray(xs))));\n}\n\nexport function splitInto(chunks, xs) {\n return ofArray(map_1(ofArray, splitInto_1(chunks, toArray(xs))));\n}\n\nexport function transpose(lists) {\n return ofArray(map_1(ofArray, transpose_1(map_1(toArray, Array.from(lists)))));\n}\n\nexport function insertAt(index, y, xs) {\n let i = -1;\n let isDone = false;\n const result = fold((acc, x) => {\n i = ((i + 1) | 0);\n if (i === index) {\n isDone = true;\n return FSharpList_Cons_305B8EAC(x, FSharpList_Cons_305B8EAC(y, acc));\n }\n else {\n return FSharpList_Cons_305B8EAC(x, acc);\n }\n }, FSharpList_get_Empty(), xs);\n return reverse(isDone ? result : (((i + 1) === index) ? FSharpList_Cons_305B8EAC(y, result) : (() => {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n })()));\n}\n\nexport function insertManyAt(index, ys, xs) {\n let i = -1;\n let isDone = false;\n const ys_1 = ofSeq(ys);\n const result = fold((acc, x) => {\n i = ((i + 1) | 0);\n if (i === index) {\n isDone = true;\n return FSharpList_Cons_305B8EAC(x, append(ys_1, acc));\n }\n else {\n return FSharpList_Cons_305B8EAC(x, acc);\n }\n }, FSharpList_get_Empty(), xs);\n return reverse(isDone ? result : (((i + 1) === index) ? append(ys_1, result) : (() => {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n })()));\n}\n\nexport function removeAt(index, xs) {\n let i = -1;\n let isDone = false;\n const ys = filter((_arg) => {\n i = ((i + 1) | 0);\n if (i === index) {\n isDone = true;\n return false;\n }\n else {\n return true;\n }\n }, xs);\n if (!isDone) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return ys;\n}\n\nexport function removeManyAt(index, count, xs) {\n let i = -1;\n let status = -1;\n const ys = filter((_arg) => {\n i = ((i + 1) | 0);\n if (i === index) {\n status = 0;\n return false;\n }\n else if (i > index) {\n if (i < (index + count)) {\n return false;\n }\n else {\n status = 1;\n return true;\n }\n }\n else {\n return true;\n }\n }, xs);\n const status_1 = (((status === 0) && ((i + 1) === (index + count))) ? 1 : status) | 0;\n if (status_1 < 1) {\n const arg = (status_1 < 0) ? \"index\" : \"count\";\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + arg));\n }\n return ys;\n}\n\nexport function updateAt(index, y, xs) {\n let isDone = false;\n const ys = mapIndexed((i, x) => {\n if (i === index) {\n isDone = true;\n return y;\n }\n else {\n return x;\n }\n }, xs);\n if (!isDone) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return ys;\n}\n\n","import { ensureErrorOrException } from './Types.js';\nexport class CancellationToken {\n constructor(cancelled = false) {\n this._id = 0;\n this._cancelled = cancelled;\n this._listeners = new Map();\n }\n get isCancelled() {\n return this._cancelled;\n }\n cancel() {\n if (!this._cancelled) {\n this._cancelled = true;\n for (const [, listener] of this._listeners) {\n listener();\n }\n }\n }\n addListener(f) {\n const id = this._id;\n this._listeners.set(this._id++, f);\n return id;\n }\n removeListener(id) {\n return this._listeners.delete(id);\n }\n register(f, state) {\n const $ = this;\n const id = this.addListener(state == null ? f : () => f(state));\n return { Dispose() { $.removeListener(id); } };\n }\n Dispose() {\n // Implement IDisposable for compatibility but do nothing\n // According to docs, calling Dispose does not trigger cancellation\n // https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtokensource.dispose?view=net-6.0\n }\n}\nexport class OperationCanceledError extends Error {\n constructor() {\n super(\"The operation was canceled\");\n Object.setPrototypeOf(this, OperationCanceledError.prototype);\n }\n}\nexport class Trampoline {\n constructor() {\n this.callCount = 0;\n }\n static get maxTrampolineCallCount() {\n return 2000;\n }\n incrementAndCheck() {\n return this.callCount++ > Trampoline.maxTrampolineCallCount;\n }\n hijack(f) {\n this.callCount = 0;\n setTimeout(f, 0);\n }\n}\nexport function protectedCont(f) {\n return (ctx) => {\n if (ctx.cancelToken.isCancelled) {\n ctx.onCancel(new OperationCanceledError());\n }\n else if (ctx.trampoline.incrementAndCheck()) {\n ctx.trampoline.hijack(() => {\n try {\n f(ctx);\n }\n catch (err) {\n ctx.onError(ensureErrorOrException(err));\n }\n });\n }\n else {\n try {\n f(ctx);\n }\n catch (err) {\n ctx.onError(ensureErrorOrException(err));\n }\n }\n };\n}\nexport function protectedBind(computation, binder) {\n return protectedCont((ctx) => {\n computation({\n onSuccess: (x) => {\n try {\n binder(x)(ctx);\n }\n catch (err) {\n ctx.onError(ensureErrorOrException(err));\n }\n },\n onError: ctx.onError,\n onCancel: ctx.onCancel,\n cancelToken: ctx.cancelToken,\n trampoline: ctx.trampoline,\n });\n });\n}\nexport function protectedReturn(value) {\n return protectedCont((ctx) => ctx.onSuccess(value));\n}\nexport class AsyncBuilder {\n Bind(computation, binder) {\n return protectedBind(computation, binder);\n }\n Combine(computation1, computation2) {\n return this.Bind(computation1, () => computation2);\n }\n Delay(generator) {\n return protectedCont((ctx) => generator()(ctx));\n }\n For(sequence, body) {\n const iter = sequence[Symbol.iterator]();\n let cur = iter.next();\n return this.While(() => !cur.done, this.Delay(() => {\n const res = body(cur.value);\n cur = iter.next();\n return res;\n }));\n }\n Return(value) {\n return protectedReturn(value);\n }\n ReturnFrom(computation) {\n return computation;\n }\n TryFinally(computation, compensation) {\n return protectedCont((ctx) => {\n computation({\n onSuccess: (x) => {\n compensation();\n ctx.onSuccess(x);\n },\n onError: (x) => {\n compensation();\n ctx.onError(x);\n },\n onCancel: (x) => {\n compensation();\n ctx.onCancel(x);\n },\n cancelToken: ctx.cancelToken,\n trampoline: ctx.trampoline,\n });\n });\n }\n TryWith(computation, catchHandler) {\n return protectedCont((ctx) => {\n computation({\n onSuccess: ctx.onSuccess,\n onCancel: ctx.onCancel,\n cancelToken: ctx.cancelToken,\n trampoline: ctx.trampoline,\n onError: (ex) => {\n try {\n catchHandler(ex)(ctx);\n }\n catch (err) {\n ctx.onError(ensureErrorOrException(err));\n }\n },\n });\n });\n }\n Using(resource, binder) {\n return this.TryFinally(binder(resource), () => resource.Dispose());\n }\n While(guard, computation) {\n if (guard()) {\n return this.Bind(computation, () => this.While(guard, computation));\n }\n else {\n return this.Return(void 0);\n }\n }\n Zero() {\n return protectedCont((ctx) => ctx.onSuccess(void 0));\n }\n}\nexport const singleton = new AsyncBuilder();\n","import { Union } from \"./Types.js\";\nimport { union_type } from \"./Reflection.js\";\nimport { some } from \"./Option.js\";\n\nexport class FSharpResult$2 extends Union {\n constructor(tag, ...fields) {\n super();\n this.tag = (tag | 0);\n this.fields = fields;\n }\n cases() {\n return [\"Ok\", \"Error\"];\n }\n}\n\nexport function FSharpResult$2$reflection(gen0, gen1) {\n return union_type(\"FSharp.Core.FSharpResult`2\", [gen0, gen1], FSharpResult$2, () => [[[\"ResultValue\", gen0]], [[\"ErrorValue\", gen1]]]);\n}\n\nexport function Result_Map(mapping, result) {\n if (result.tag === 0) {\n return new FSharpResult$2(0, mapping(result.fields[0]));\n }\n else {\n return new FSharpResult$2(1, result.fields[0]);\n }\n}\n\nexport function Result_MapError(mapping, result) {\n if (result.tag === 0) {\n return new FSharpResult$2(0, result.fields[0]);\n }\n else {\n return new FSharpResult$2(1, mapping(result.fields[0]));\n }\n}\n\nexport function Result_Bind(binder, result) {\n if (result.tag === 0) {\n return binder(result.fields[0]);\n }\n else {\n return new FSharpResult$2(1, result.fields[0]);\n }\n}\n\nexport class FSharpChoice$2 extends Union {\n constructor(tag, ...fields) {\n super();\n this.tag = (tag | 0);\n this.fields = fields;\n }\n cases() {\n return [\"Choice1Of2\", \"Choice2Of2\"];\n }\n}\n\nexport function FSharpChoice$2$reflection(gen0, gen1) {\n return union_type(\"FSharp.Core.FSharpChoice`2\", [gen0, gen1], FSharpChoice$2, () => [[[\"Item\", gen0]], [[\"Item\", gen1]]]);\n}\n\nexport class FSharpChoice$3 extends Union {\n constructor(tag, ...fields) {\n super();\n this.tag = (tag | 0);\n this.fields = fields;\n }\n cases() {\n return [\"Choice1Of3\", \"Choice2Of3\", \"Choice3Of3\"];\n }\n}\n\nexport function FSharpChoice$3$reflection(gen0, gen1, gen2) {\n return union_type(\"FSharp.Core.FSharpChoice`3\", [gen0, gen1, gen2], FSharpChoice$3, () => [[[\"Item\", gen0]], [[\"Item\", gen1]], [[\"Item\", gen2]]]);\n}\n\nexport class FSharpChoice$4 extends Union {\n constructor(tag, ...fields) {\n super();\n this.tag = (tag | 0);\n this.fields = fields;\n }\n cases() {\n return [\"Choice1Of4\", \"Choice2Of4\", \"Choice3Of4\", \"Choice4Of4\"];\n }\n}\n\nexport function FSharpChoice$4$reflection(gen0, gen1, gen2, gen3) {\n return union_type(\"FSharp.Core.FSharpChoice`4\", [gen0, gen1, gen2, gen3], FSharpChoice$4, () => [[[\"Item\", gen0]], [[\"Item\", gen1]], [[\"Item\", gen2]], [[\"Item\", gen3]]]);\n}\n\nexport class FSharpChoice$5 extends Union {\n constructor(tag, ...fields) {\n super();\n this.tag = (tag | 0);\n this.fields = fields;\n }\n cases() {\n return [\"Choice1Of5\", \"Choice2Of5\", \"Choice3Of5\", \"Choice4Of5\", \"Choice5Of5\"];\n }\n}\n\nexport function FSharpChoice$5$reflection(gen0, gen1, gen2, gen3, gen4) {\n return union_type(\"FSharp.Core.FSharpChoice`5\", [gen0, gen1, gen2, gen3, gen4], FSharpChoice$5, () => [[[\"Item\", gen0]], [[\"Item\", gen1]], [[\"Item\", gen2]], [[\"Item\", gen3]], [[\"Item\", gen4]]]);\n}\n\nexport class FSharpChoice$6 extends Union {\n constructor(tag, ...fields) {\n super();\n this.tag = (tag | 0);\n this.fields = fields;\n }\n cases() {\n return [\"Choice1Of6\", \"Choice2Of6\", \"Choice3Of6\", \"Choice4Of6\", \"Choice5Of6\", \"Choice6Of6\"];\n }\n}\n\nexport function FSharpChoice$6$reflection(gen0, gen1, gen2, gen3, gen4, gen5) {\n return union_type(\"FSharp.Core.FSharpChoice`6\", [gen0, gen1, gen2, gen3, gen4, gen5], FSharpChoice$6, () => [[[\"Item\", gen0]], [[\"Item\", gen1]], [[\"Item\", gen2]], [[\"Item\", gen3]], [[\"Item\", gen4]], [[\"Item\", gen5]]]);\n}\n\nexport class FSharpChoice$7 extends Union {\n constructor(tag, ...fields) {\n super();\n this.tag = (tag | 0);\n this.fields = fields;\n }\n cases() {\n return [\"Choice1Of7\", \"Choice2Of7\", \"Choice3Of7\", \"Choice4Of7\", \"Choice5Of7\", \"Choice6Of7\", \"Choice7Of7\"];\n }\n}\n\nexport function FSharpChoice$7$reflection(gen0, gen1, gen2, gen3, gen4, gen5, gen6) {\n return union_type(\"FSharp.Core.FSharpChoice`7\", [gen0, gen1, gen2, gen3, gen4, gen5, gen6], FSharpChoice$7, () => [[[\"Item\", gen0]], [[\"Item\", gen1]], [[\"Item\", gen2]], [[\"Item\", gen3]], [[\"Item\", gen4]], [[\"Item\", gen5]], [[\"Item\", gen6]]]);\n}\n\nexport function Choice_makeChoice1Of2(x) {\n return new FSharpChoice$2(0, x);\n}\n\nexport function Choice_makeChoice2Of2(x) {\n return new FSharpChoice$2(1, x);\n}\n\nexport function Choice_tryValueIfChoice1Of2(x) {\n if (x.tag === 0) {\n return some(x.fields[0]);\n }\n else {\n return void 0;\n }\n}\n\nexport function Choice_tryValueIfChoice2Of2(x) {\n if (x.tag === 1) {\n return some(x.fields[0]);\n }\n else {\n return void 0;\n }\n}\n\n","import { OperationCanceledError, Trampoline } from \"./AsyncBuilder.js\";\nimport { CancellationToken } from \"./AsyncBuilder.js\";\nimport { protectedCont } from \"./AsyncBuilder.js\";\nimport { protectedBind } from \"./AsyncBuilder.js\";\nimport { protectedReturn } from \"./AsyncBuilder.js\";\nimport { Choice_makeChoice1Of2, Choice_makeChoice2Of2 } from \"./Choice.js\";\nimport { TimeoutException } from \"./SystemException.js\";\n// Implemented just for type references\nexport class Async {\n}\nfunction emptyContinuation(_x) {\n // NOP\n}\n// see AsyncBuilder.Delay\nfunction delay(generator) {\n return protectedCont((ctx) => generator()(ctx));\n}\n// MakeAsync: body:(AsyncActivation<'T> -> AsyncReturn) -> Async<'T>\nexport function makeAsync(body) {\n return body;\n}\n// Invoke: computation: Async<'T> -> ctxt:AsyncActivation<'T> -> AsyncReturn\nexport function invoke(computation, ctx) {\n return computation(ctx);\n}\n// CallThenInvoke: ctxt:AsyncActivation<'T> -> result1:'U -> part2:('U -> Async<'T>) -> AsyncReturn\nexport function callThenInvoke(ctx, result1, part2) {\n return part2(result1)(ctx);\n}\n// Bind: ctxt:AsyncActivation<'T> -> part1:Async<'U> -> part2:('U -> Async<'T>) -> AsyncReturn\nexport function bind(ctx, part1, part2) {\n return protectedBind(part1, part2)(ctx);\n}\nexport function createCancellationToken(arg) {\n const token = new CancellationToken(typeof arg === \"boolean\" ? arg : false);\n if (typeof arg === \"number\") {\n setTimeout(() => { token.cancel(); }, arg);\n }\n return token;\n}\nexport function cancel(token) {\n token.cancel();\n}\nexport function cancelAfter(token, ms) {\n setTimeout(() => { token.cancel(); }, ms);\n}\nexport function isCancellationRequested(token) {\n return token != null && token.isCancelled;\n}\nexport function throwIfCancellationRequested(token) {\n if (token != null && token.isCancelled) {\n throw new Error(\"Operation is cancelled\");\n }\n}\nfunction throwAfter(millisecondsDueTime) {\n return protectedCont((ctx) => {\n let tokenId;\n const timeoutId = setTimeout(() => {\n ctx.cancelToken.removeListener(tokenId);\n ctx.onError(new TimeoutException());\n }, millisecondsDueTime);\n tokenId = ctx.cancelToken.addListener(() => {\n clearTimeout(timeoutId);\n ctx.onCancel(new OperationCanceledError());\n });\n });\n}\nexport function startChild(computation, ms) {\n if (ms) {\n const computationWithTimeout = protectedBind(parallel2(computation, throwAfter(ms)), xs => protectedReturn(xs[0]));\n return startChild(computationWithTimeout);\n }\n const promise = startAsPromise(computation);\n // JS Promises are hot, computation has already started\n // but we delay returning the result\n return protectedCont((ctx) => protectedReturn(awaitPromise(promise))(ctx));\n}\nexport function awaitPromise(p) {\n return fromContinuations((conts) => p.then(conts[0]).catch((err) => (err instanceof OperationCanceledError\n ? conts[2] : conts[1])(err)));\n}\nexport function cancellationToken() {\n return protectedCont((ctx) => ctx.onSuccess(ctx.cancelToken));\n}\nexport const defaultCancellationToken = new CancellationToken();\nexport function catchAsync(work) {\n return protectedCont((ctx) => {\n work({\n onSuccess: (x) => ctx.onSuccess(Choice_makeChoice1Of2(x)),\n onError: (ex) => ctx.onSuccess(Choice_makeChoice2Of2(ex)),\n onCancel: ctx.onCancel,\n cancelToken: ctx.cancelToken,\n trampoline: ctx.trampoline,\n });\n });\n}\nexport function fromContinuations(f) {\n return protectedCont((ctx) => f([ctx.onSuccess, ctx.onError, ctx.onCancel]));\n}\nexport function ignore(computation) {\n return protectedBind(computation, (_x) => protectedReturn(void 0));\n}\nexport function parallel(computations) {\n return delay(() => awaitPromise(Promise.all(Array.from(computations, (w) => startAsPromise(w)))));\n}\nfunction parallel2(a, b) {\n return delay(() => awaitPromise(Promise.all([startAsPromise(a), startAsPromise(b)])));\n}\nexport function sequential(computations) {\n function _sequential(computations) {\n let pr = Promise.resolve([]);\n for (const c of computations) {\n pr = pr.then(results => startAsPromise(c).then(r => results.concat([r])));\n }\n return pr;\n }\n return delay(() => awaitPromise(_sequential(computations)));\n}\nexport function sleep(millisecondsDueTime) {\n return protectedCont((ctx) => {\n let tokenId;\n const timeoutId = setTimeout(() => {\n ctx.cancelToken.removeListener(tokenId);\n ctx.onSuccess(void 0);\n }, millisecondsDueTime);\n tokenId = ctx.cancelToken.addListener(() => {\n clearTimeout(timeoutId);\n ctx.onCancel(new OperationCanceledError());\n });\n });\n}\nexport function runSynchronously() {\n throw new Error(\"Asynchronous code cannot be run synchronously in JS\");\n}\nexport function start(computation, cancellationToken) {\n return startWithContinuations(computation, cancellationToken);\n}\nexport function startImmediate(computation, cancellationToken) {\n return start(computation, cancellationToken);\n}\nexport function startWithContinuations(computation, continuation, exceptionContinuation, cancellationContinuation, cancelToken) {\n if (typeof continuation !== \"function\") {\n cancelToken = continuation;\n continuation = undefined;\n }\n const trampoline = new Trampoline();\n computation({\n onSuccess: continuation ? continuation : emptyContinuation,\n onError: exceptionContinuation ? exceptionContinuation : emptyContinuation,\n onCancel: cancellationContinuation ? cancellationContinuation : emptyContinuation,\n cancelToken: cancelToken ? cancelToken : defaultCancellationToken,\n trampoline,\n });\n}\nexport function startAsPromise(computation, cancellationToken) {\n return new Promise((resolve, reject) => startWithContinuations(computation, resolve, reject, reject, cancellationToken ? cancellationToken : defaultCancellationToken));\n}\nexport default Async;\n","import { Observer } from \"./Observable.js\";\nimport { some, value } from \"./Option.js\";\nimport { Choice_tryValueIfChoice1Of2, Choice_tryValueIfChoice2Of2 } from \"./Choice.js\";\nexport class Event {\n constructor() {\n this.delegates = [];\n }\n Add(f) {\n this._addHandler(f);\n }\n get Publish() {\n return this;\n }\n Trigger(senderOrValue, valueOrUndefined) {\n let sender;\n let value;\n if (valueOrUndefined === undefined) {\n sender = null;\n value = senderOrValue;\n }\n else {\n sender = senderOrValue;\n value = valueOrUndefined;\n }\n this.delegates.forEach((f) => f.length === 1 ? f(value) : f(sender, value));\n }\n // IDelegateEvent methods\n AddHandler(handler) {\n this._addHandler(handler);\n }\n RemoveHandler(handler) {\n this._removeHandler(handler);\n }\n // IObservable methods\n Subscribe(arg) {\n const callback = typeof arg === \"function\"\n ? arg\n : arg.OnNext;\n this._addHandler(callback);\n return { Dispose: () => { this._removeHandler(callback); } };\n }\n _addHandler(f) {\n this.delegates.push(f);\n }\n _removeHandler(f) {\n const index = this.delegates.indexOf(f);\n if (index > -1) {\n this.delegates.splice(index, 1);\n }\n }\n}\nexport function add(callback, sourceEvent) {\n if (sourceEvent instanceof Event) {\n sourceEvent.Add(callback);\n }\n else {\n sourceEvent.Subscribe(new Observer(callback));\n }\n}\nexport function choose(chooser, sourceEvent) {\n const ev = new Event();\n add((t) => {\n const u = chooser(t);\n if (u != null) {\n ev.Trigger(value(u));\n }\n }, sourceEvent);\n return ev;\n}\nexport function filter(predicate, sourceEvent) {\n return choose((x) => predicate(x) ? some(x) : undefined, sourceEvent);\n}\nexport function map(mapping, sourceEvent) {\n const ev = new Event();\n add((t) => ev.Trigger(mapping(t)), sourceEvent);\n return ev;\n}\nexport function merge(event1, event2) {\n const ev = new Event();\n const fn = (x) => ev.Trigger(x);\n add(fn, event1);\n add(fn, event2);\n return ev;\n}\nexport function pairwise(sourceEvent) {\n const ev = new Event();\n let last;\n let haveLast = false;\n add((next) => {\n if (haveLast) {\n ev.Trigger([last, next]);\n }\n last = next;\n haveLast = true;\n }, sourceEvent);\n return ev;\n}\nexport function partition(predicate, sourceEvent) {\n return [filter(predicate, sourceEvent), filter((x) => !predicate(x), sourceEvent)];\n}\nexport function scan(collector, state, sourceEvent) {\n return map((t) => state = collector(state, t), sourceEvent);\n}\nexport function split(splitter, sourceEvent) {\n return [\n choose((v) => Choice_tryValueIfChoice1Of2(splitter(v)), sourceEvent),\n choose((v) => Choice_tryValueIfChoice2Of2(splitter(v)), sourceEvent),\n ];\n}\nexport function createEvent(addHandler, removeHandler) {\n return {\n AddHandler(h) { addHandler(h); },\n RemoveHandler(h) { removeHandler(h); },\n Subscribe(r) {\n const h = (_, args) => r.OnNext(args);\n addHandler(h);\n return {\n Dispose() { removeHandler(h); }\n };\n }\n };\n}\nexport default Event;\n","import { Choice_tryValueIfChoice1Of2, Choice_tryValueIfChoice2Of2 } from \"./Choice.js\";\nimport { value } from \"./Option.js\";\nexport class Observer {\n constructor(onNext, onError, onCompleted) {\n this.OnNext = onNext;\n this.OnError = onError || ((_e) => { return; });\n this.OnCompleted = onCompleted || (() => { return; });\n }\n}\nclass Observable {\n constructor(subscribe) {\n this.Subscribe = subscribe;\n }\n}\nexport function protect(f, succeed, fail) {\n try {\n return succeed(f());\n }\n catch (e) {\n fail(e);\n }\n}\nexport function add(callback, source) {\n source.Subscribe(new Observer(callback));\n}\nexport function choose(chooser, source) {\n return new Observable((observer) => source.Subscribe(new Observer((t) => protect(() => chooser(t), (u) => { if (u != null) {\n observer.OnNext(value(u));\n } }, observer.OnError), observer.OnError, observer.OnCompleted)));\n}\nexport function filter(predicate, source) {\n return choose((x) => predicate(x) ? x : null, source);\n}\nexport function map(mapping, source) {\n return new Observable((observer) => source.Subscribe(new Observer((t) => {\n protect(() => mapping(t), observer.OnNext, observer.OnError);\n }, observer.OnError, observer.OnCompleted)));\n}\nexport function merge(source1, source2) {\n return new Observable((observer) => {\n let stopped = false;\n let completed1 = false;\n let completed2 = false;\n const h1 = source1.Subscribe(new Observer((v) => { if (!stopped) {\n observer.OnNext(v);\n } }, (e) => {\n if (!stopped) {\n stopped = true;\n observer.OnError(e);\n }\n }, () => {\n if (!stopped) {\n completed1 = true;\n if (completed2) {\n stopped = true;\n observer.OnCompleted();\n }\n }\n }));\n const h2 = source2.Subscribe(new Observer((v) => { if (!stopped) {\n observer.OnNext(v);\n } }, (e) => {\n if (!stopped) {\n stopped = true;\n observer.OnError(e);\n }\n }, () => {\n if (!stopped) {\n completed2 = true;\n if (completed1) {\n stopped = true;\n observer.OnCompleted();\n }\n }\n }));\n return {\n Dispose() {\n h1.Dispose();\n h2.Dispose();\n },\n };\n });\n}\nexport function pairwise(source) {\n return new Observable((observer) => {\n let last;\n return source.Subscribe(new Observer((next) => {\n if (last != null) {\n observer.OnNext([last, next]);\n }\n last = next;\n }, observer.OnError, observer.OnCompleted));\n });\n}\nexport function partition(predicate, source) {\n return [filter(predicate, source), filter((x) => !predicate(x), source)];\n}\nexport function scan(collector, state, source) {\n return new Observable((observer) => {\n return source.Subscribe(new Observer((t) => {\n protect(() => collector(state, t), (u) => { state = u; observer.OnNext(u); }, observer.OnError);\n }, observer.OnError, observer.OnCompleted));\n });\n}\nexport function split(splitter, source) {\n return [\n choose((v) => Choice_tryValueIfChoice1Of2(splitter(v)), source),\n choose((v) => Choice_tryValueIfChoice2Of2(splitter(v)), source)\n ];\n}\nexport function subscribe(callback, source) {\n return source.Subscribe(new Observer(callback));\n}\n","namespace Elmish\n\n(**\nLog\n---------\nBasic cross-platform logging API.\n\n*)\nmodule internal Log =\n\n#if FABLE_COMPILER\n open Fable.Core.JS\n\n let onError (text: string, ex: exn) = console.error (text,ex)\n let toConsole(text: string, o: #obj) = console.log(text,o)\n\n#else\n#if NETSTANDARD2_0\n let onError (text: string, ex: exn) = System.Diagnostics.Trace.TraceError(\"{0}: {1}\", text, ex)\n let toConsole(text: string, o: #obj) = printfn \"%s: %A\" text o\n#else\n let onError (text: string, ex: exn) = System.Console.Error.WriteLine(\"{0}: {1}\", text, ex)\n let toConsole(text: string, o: #obj) = printfn \"%s: %A\" text o\n#endif\n#endif\n\n#if FABLE_COMPILER\nmodule internal Timer =\n open System.Timers\n let delay interval callback =\n let t = new Timer(float interval, AutoReset = false)\n t.Elapsed.Add callback\n t.Enabled <- true\n t.Start()\n#endif\n","import Event from \"./Event.js\";\nexport class Timer {\n constructor(interval) {\n this._enabled = false;\n this._isDisposed = false;\n this._intervalId = 0;\n this._timeoutId = 0;\n this.Interval = interval && interval > 0 ? interval : 100;\n this.AutoReset = true;\n this._elapsed = new Event();\n }\n Elapsed() {\n return this._elapsed;\n }\n get Enabled() {\n return this._enabled;\n }\n set Enabled(x) {\n if (!this._isDisposed && this._enabled !== x) {\n this._enabled = x;\n if (this._enabled) {\n if (this.AutoReset) {\n this._intervalId = setInterval(() => {\n if (!this.AutoReset) {\n this.Enabled = false;\n }\n this._elapsed.Trigger(new Date());\n }, this.Interval);\n }\n else {\n this._timeoutId = setTimeout(() => {\n this.Enabled = false;\n this._timeoutId = 0;\n if (this.AutoReset) {\n this.Enabled = true;\n }\n this._elapsed.Trigger(new Date());\n }, this.Interval);\n }\n }\n else {\n if (this._timeoutId) {\n clearTimeout(this._timeoutId);\n this._timeoutId = 0;\n }\n if (this._intervalId) {\n clearInterval(this._intervalId);\n this._intervalId = 0;\n }\n }\n }\n }\n Dispose() {\n this.Enabled = false;\n this._isDisposed = true;\n }\n Close() {\n this.Dispose();\n }\n Start() {\n this.Enabled = true;\n }\n Stop() {\n this.Enabled = false;\n }\n}\nexport default Timer;\n","(**\nCmd\n---------\nCore abstractions for dispatching messages in Elmish.\n\n*)\n\nnamespace Elmish\n\nopen System\n\n/// Dispatch - feed new message into the processing loop\ntype Dispatch<'msg> = 'msg -> unit\n\n/// Subscription - return immediately, but may schedule dispatch of a message at any time\ntype Sub<'msg> = Dispatch<'msg> -> unit\n\n/// Cmd - container for subscriptions that may produce messages\ntype Cmd<'msg> = Sub<'msg> list\n\n/// Cmd module for creating and manipulating commands\n[]\nmodule Cmd =\n /// Execute the commands using the supplied dispatcher\n let internal exec onError (dispatch: Dispatch<'msg>) (cmd: Cmd<'msg>) =\n cmd |> List.iter (fun call -> try call dispatch with ex -> onError ex)\n\n /// None - no commands, also known as `[]`\n let none : Cmd<'msg> =\n []\n\n /// When emitting the message, map to another type\n let map (f: 'a -> 'msg) (cmd: Cmd<'a>) : Cmd<'msg> =\n cmd |> List.map (fun g -> (fun dispatch -> f >> dispatch) >> g)\n\n /// Aggregate multiple commands\n let batch (cmds: #seq>) : Cmd<'msg> =\n cmds |> List.concat\n\n /// Command to call the subscriber\n let ofSub (sub: Sub<'msg>) : Cmd<'msg> =\n [sub]\n\n module OfFunc =\n /// Command to evaluate a simple function and map the result\n /// into success or error (of exception)\n let either (task: 'a -> _) (arg: 'a) (ofSuccess: _ -> 'msg) (ofError: _ -> 'msg) : Cmd<'msg> =\n let bind dispatch =\n try\n task arg\n |> (ofSuccess >> dispatch)\n with x ->\n x |> (ofError >> dispatch)\n [bind]\n\n /// Command to evaluate a simple function and map the success to a message\n /// discarding any possible error\n let perform (task: 'a -> _) (arg: 'a) (ofSuccess: _ -> 'msg) : Cmd<'msg> =\n let bind dispatch =\n try\n task arg\n |> (ofSuccess >> dispatch)\n with x ->\n ()\n [bind]\n\n /// Command to evaluate a simple function and map the error (in case of exception)\n let attempt (task: 'a -> unit) (arg: 'a) (ofError: _ -> 'msg) : Cmd<'msg> =\n let bind dispatch =\n try\n task arg\n with x ->\n x |> (ofError >> dispatch)\n [bind]\n\n /// Command to issue a specific message\n let result (msg:'msg) : Cmd<'msg> =\n [fun dispatch -> dispatch msg]\n\n module OfAsyncWith =\n /// Command that will evaluate an async block and map the result\n /// into success or error (of exception)\n let either (start: Async -> unit) \n (task: 'a -> Async<_>)\n (arg: 'a)\n (ofSuccess: _ -> 'msg)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n let bind dispatch =\n async {\n let! r = task arg |> Async.Catch\n dispatch (match r with\n | Choice1Of2 x -> ofSuccess x\n | Choice2Of2 x -> ofError x)\n }\n [bind >> start]\n\n /// Command that will evaluate an async block and map the success\n let perform (start: Async -> unit) \n (task: 'a -> Async<_>)\n (arg: 'a)\n (ofSuccess: _ -> 'msg) : Cmd<'msg> =\n let bind dispatch =\n async {\n let! r = task arg |> Async.Catch\n match r with\n | Choice1Of2 x -> dispatch (ofSuccess x)\n | _ -> ()\n }\n [bind >> start]\n\n /// Command that will evaluate an async block and map the error (of exception)\n let attempt (start: Async -> unit) \n (task: 'a -> Async<_>)\n (arg: 'a)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n let bind dispatch =\n async {\n let! r = task arg |> Async.Catch\n match r with\n | Choice2Of2 x -> dispatch (ofError x)\n | _ -> ()\n }\n [bind >> start]\n\n /// Command that will evaluate an async block to the message\n let result (start: Async -> unit) \n (task: Async<'msg>) : Cmd<'msg> =\n let bind dispatch =\n async {\n let! r = task\n dispatch r\n }\n [bind >> start]\n\n module OfAsync =\n#if FABLE_COMPILER\n let start x = Timer.delay 0 (fun _ -> Async.StartImmediate x)\n#else\n let inline start x = Async.Start x\n#endif \n /// Command that will evaluate an async block and map the result\n /// into success or error (of exception)\n let inline either (task: 'a -> Async<_>)\n (arg: 'a)\n (ofSuccess: _ -> 'msg)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfAsyncWith.either start task arg ofSuccess ofError\n\n /// Command that will evaluate an async block and map the success\n let inline perform (task: 'a -> Async<_>)\n (arg: 'a)\n (ofSuccess: _ -> 'msg) : Cmd<'msg> =\n OfAsyncWith.perform start task arg ofSuccess\n\n /// Command that will evaluate an async block and map the error (of exception)\n let inline attempt (task: 'a -> Async<_>)\n (arg: 'a)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfAsyncWith.attempt start task arg ofError\n\n /// Command that will evaluate an async block to the message\n let inline result (task: Async<'msg>) : Cmd<'msg> =\n OfAsyncWith.result start task\n\n module OfAsyncImmediate =\n /// Command that will evaluate an async block and map the result\n /// into success or error (of exception)\n let inline either (task: 'a -> Async<_>)\n (arg: 'a)\n (ofSuccess: _ -> 'msg)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfAsyncWith.either Async.StartImmediate task arg ofSuccess ofError\n\n /// Command that will evaluate an async block and map the success\n let inline perform (task: 'a -> Async<_>)\n (arg: 'a)\n (ofSuccess: _ -> 'msg) : Cmd<'msg> =\n OfAsyncWith.perform Async.StartImmediate task arg ofSuccess\n\n /// Command that will evaluate an async block and map the error (of exception)\n let inline attempt (task: 'a -> Async<_>)\n (arg: 'a)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfAsyncWith.attempt Async.StartImmediate task arg ofError\n\n /// Command that will evaluate an async block to the message\n let inline result (task: Async<'msg>) : Cmd<'msg> =\n OfAsyncWith.result Async.StartImmediate task\n\n#if FABLE_COMPILER\n module OfPromise =\n /// Command to call `promise` block and map the results\n let either (task: 'a -> Fable.Core.JS.Promise<_>)\n (arg:'a)\n (ofSuccess: _ -> 'msg)\n (ofError: #exn -> 'msg) : Cmd<'msg> =\n let bind dispatch =\n (task arg)\n .``then``(ofSuccess >> dispatch)\n .catch(unbox >> ofError >> dispatch)\n |> ignore\n [bind]\n\n /// Command to call `promise` block and map the success\n let perform (task: 'a -> Fable.Core.JS.Promise<_>)\n (arg:'a)\n (ofSuccess: _ -> 'msg) =\n let bind dispatch =\n (task arg)\n .``then``(ofSuccess >> dispatch)\n |> ignore\n [bind]\n\n /// Command to call `promise` block and map the error\n let attempt (task: 'a -> Fable.Core.JS.Promise<_>)\n (arg:'a)\n (ofError: #exn -> 'msg) : Cmd<'msg> =\n let bind dispatch =\n (task arg)\n .catch(unbox >> ofError >> dispatch)\n |> ignore\n [bind]\n\n /// Command to dispatch the `promise` result\n let result (task: Fable.Core.JS.Promise<'msg>) =\n let bind dispatch =\n task.``then`` dispatch\n |> ignore\n [bind]\n\n []\n let inline ofPromise (task: 'a -> Fable.Core.JS.Promise<_>)\n (arg:'a)\n (ofSuccess: _ -> 'msg)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfPromise.either task arg ofSuccess ofError \n#else\n open System.Threading.Tasks\n module OfTask =\n /// Command to call a task and map the results\n let inline either (task: 'a -> Task<_>)\n (arg:'a)\n (ofSuccess: _ -> 'msg)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfAsync.either (task >> Async.AwaitTask) arg ofSuccess ofError\n\n /// Command to call a task and map the success\n let inline perform (task: 'a -> Task<_>)\n (arg:'a)\n (ofSuccess: _ -> 'msg) : Cmd<'msg> =\n OfAsync.perform (task >> Async.AwaitTask) arg ofSuccess\n\n /// Command to call a task and map the error\n let inline attempt (task: 'a -> Task<_>)\n (arg:'a)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfAsync.attempt (task >> Async.AwaitTask) arg ofError\n\n /// Command and map the task success\n let inline result (task: Task<'msg>) : Cmd<'msg> =\n OfAsync.result (task |> Async.AwaitTask)\n\n []\n let inline ofTask (task: 'a -> Task<_>)\n (arg:'a)\n (ofSuccess: _ -> 'msg)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfTask.either task arg ofSuccess ofError\n#endif\n\n // Synonymous with `OfFunc.result`, may be removed in the future\n let inline ofMsg (msg:'msg) : Cmd<'msg> =\n OfFunc.result msg\n\n []\n let inline ofAsync (task: 'a -> Async<_>)\n (arg: 'a)\n (ofSuccess: _ -> 'msg)\n (ofError: _ -> 'msg) : Cmd<'msg> =\n OfAsync.either task arg ofSuccess ofError\n\n []\n let inline ofFunc (task: 'a -> _) (arg: 'a) (ofSuccess: _ -> 'msg) (ofError: _ -> 'msg) : Cmd<'msg> =\n OfFunc.either task arg ofSuccess ofError\n\n []\n let inline performFunc (task: 'a -> _) (arg: 'a) (ofSuccess: _ -> 'msg) : Cmd<'msg> =\n OfFunc.perform task arg ofSuccess\n\n []\n let attemptFunc (task: 'a -> unit) (arg: 'a) (ofError: _ -> 'msg) : Cmd<'msg> =\n OfFunc.attempt task arg ofError\n\n","namespace Shared.Infrastructure\n\nopen System\n\n[]\nmodule DateTime =\n let toString (dateTime: DateTime) =\n dateTime.ToString(\"dd.MM.yyyy HH:mm:ss\")\n\n let offsetToString (dateTime: DateTimeOffset) =\n dateTime.ToString(\"dd.MM.yyyy HH:mm:ss\")\n\n let toShortString (dateTime: DateTime) = dateTime.ToString(\"dd.MM.yy HH:mm\")\n\n let toDateString (dateTime: DateTime) = dateTime.ToString(\"dd.MM.yyyy\")\n\n let toDateFileNameString (dateTime: DateTime) = dateTime.ToString(\"yyyyMMdd\")\n\n let toDayMonthString (dateTime: DateTime) = dateTime.ToString(\"dd.MM.\")\n\n let toTimeString (time: DateTime) = time.ToString(\"HH:mm\")\n\n let startOfDay (dateTime: DateTime) : DateTime = dateTime.Date\n\n let endOfDay (dateTime: DateTime) : DateTime =\n DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59, dateTime.Kind)\n\n let addMinutes (minutes: int) (date: DateTime) = date.AddMinutes(float minutes)\n\n let addHours (hours: int) (date: DateTime) = date.AddHours(float hours)\n\n let addDays (days: int) (date: DateTime) = date.AddDays(float days)\n\n let removeDays (days: int) (date: DateTime) = addDays (-days) date\n\n let addMonths (months: int) (date: DateTime) = date.AddMonths(months)\n\n let removeMonths (months: int) (date: DateTime) = addMonths (-months) date\n\n let addYears (years: int) (date: DateTime) = date.AddYears(years)\n\n let removeYears (years: int) (date: DateTime) = addYears (-years) date","module Shared.DtoTypes.DateRangeDto\n\nopen System\nopen Shared.Infrastructure\n\ntype DateRangeOption = {\n Id: string\n Label: string\n StartTime: DateTime -> DateTime\n EndTime: DateTime -> DateTime\n}\n\nlet todayRange = {\n Id = \"today\"\n Label = \"Heute\"\n StartTime = fun currentTime -> currentTime |> DateTime.startOfDay\n EndTime = fun currentTime -> currentTime |> DateTime.endOfDay\n}\n\nlet thisWeekRange = {\n Id = \"this_week\"\n Label = \"Diese Woche\"\n StartTime =\n fun currentTime ->\n let days = (int currentTime.DayOfWeek) - 1\n\n currentTime |> DateTime.removeDays days |> DateTime.startOfDay\n EndTime =\n fun currentTime ->\n let days = 7 - int currentTime.DayOfWeek\n\n currentTime |> DateTime.addDays days |> DateTime.endOfDay\n}\n\nlet thisMonthRange = {\n Id = \"this_month\"\n Label = \"Dieser Monat\"\n StartTime = fun currentTime -> currentTime |> DateTime.removeDays (currentTime.Day - 1) |> DateTime.startOfDay\n EndTime =\n fun currentTime ->\n currentTime\n |> DateTime.addMonths 1\n |> (fun dt -> DateTime.removeDays dt.Day dt)\n |> DateTime.endOfDay\n}\n\nlet thisYearRange = {\n Id = \"this_year\"\n Label = \"Dieses Jahr\"\n StartTime =\n fun currentTime ->\n currentTime\n |> DateTime.removeDays (currentTime.DayOfYear - 1)\n |> DateTime.startOfDay\n EndTime =\n fun currentTime ->\n currentTime\n |> DateTime.addDays (365 - currentTime.DayOfYear + 1)\n |> DateTime.endOfDay\n}\n\nlet yesterdayRange = {\n Id = \"yesterday\"\n Label = \"Gestern\"\n StartTime = fun currentTime -> currentTime |> DateTime.removeDays 1 |> DateTime.startOfDay\n EndTime = fun currentTime -> currentTime |> DateTime.removeDays 1 |> DateTime.endOfDay\n}\n\nlet lastWeekRange = {\n Id = \"last_week\"\n Label = \"Letzte Woche\"\n StartTime =\n fun currentTime ->\n let days = (int currentTime.DayOfWeek) - 1 + 7\n\n currentTime |> DateTime.removeDays days |> DateTime.startOfDay\n\n EndTime =\n fun currentTime ->\n let days = int currentTime.DayOfWeek\n\n currentTime |> DateTime.removeDays days |> DateTime.endOfDay\n}\n\nlet lastMonthRange = {\n Id = \"last_month\"\n Label = \"Letzter Monat\"\n StartTime =\n fun currentTime ->\n currentTime\n |> DateTime.removeMonths 1\n |> (fun dt -> DateTime.removeDays (dt.Day - 1) dt)\n |> DateTime.startOfDay\n EndTime = fun currentTime -> currentTime |> DateTime.removeDays currentTime.Day |> DateTime.endOfDay\n}\n\nlet lastYearRange = {\n Id = \"last_year\"\n Label = \"Letztes Jahr\"\n StartTime =\n fun currentTime ->\n currentTime\n |> DateTime.removeDays (currentTime.DayOfYear - 1)\n |> DateTime.removeYears 1\n |> DateTime.startOfDay\n EndTime = fun currentTime -> currentTime |> DateTime.removeDays (currentTime.DayOfYear) |> DateTime.endOfDay\n}\n\nlet getRangeFromId (id: string) : DateRangeOption option =\n let availableRanges = [\n todayRange\n thisWeekRange\n thisMonthRange\n thisYearRange\n yesterdayRange\n lastWeekRange\n lastMonthRange\n lastYearRange\n ]\n\n List.tryFind (fun range -> range.Id = id) availableRanges","namespace Fable.Remoting.Client \n\nopen System\n\ntype HttpMethod = GET | POST \n\ntype RequestBody = \n | Empty\n | Json of string \n | Binary of byte[] \n\ntype CustomResponseSerializer = byte[] -> Type -> obj\n\ntype HttpRequest = {\n HttpMethod: HttpMethod\n Url: string \n Headers: (string * string) list \n RequestBody : RequestBody\n WithCredentials : bool\n}\n \ntype HttpResponse = {\n StatusCode: int \n ResponseBody: string\n}\n\ntype RemoteBuilderOptions = {\n CustomHeaders : (string * string) list\n BaseUrl : string option\n Authorization : string option\n WithCredentials : bool\n RouteBuilder : (string -> string -> string)\n CustomResponseSerialization : CustomResponseSerializer option\n}\n\ntype ProxyRequestException(response: HttpResponse, errorMsg, reponseText: string) = \n inherit System.Exception(errorMsg)\n member this.Response = response \n member this.StatusCode = response.StatusCode\n member this.ResponseText = reponseText ","import { Record, Union } from \"./Types.js\";\nimport { combineHashCodes, equalArraysWith, stringHash } from \"./Util.js\";\nimport Decimal from \"./Decimal.js\";\nimport { fromInt as int64FromInt } from \"./Long.js\";\nexport class CaseInfo {\n constructor(declaringType, tag, name, fields) {\n this.declaringType = declaringType;\n this.tag = tag;\n this.name = name;\n this.fields = fields;\n }\n}\nexport class MethodInfo {\n constructor(name, parameters, returnType) {\n this.name = name;\n this.parameters = parameters;\n this.returnType = returnType;\n }\n}\nexport class TypeInfo {\n constructor(fullname, generics, construct, parent, fields, cases, enumCases) {\n this.fullname = fullname;\n this.generics = generics;\n this.construct = construct;\n this.parent = parent;\n this.fields = fields;\n this.cases = cases;\n this.enumCases = enumCases;\n }\n toString() {\n return fullName(this);\n }\n GetHashCode() {\n return getHashCode(this);\n }\n Equals(other) {\n return equals(this, other);\n }\n}\nexport class GenericParameter extends TypeInfo {\n constructor(name) {\n super(name);\n }\n}\nexport function getGenerics(t) {\n return t.generics != null ? t.generics : [];\n}\nexport function getHashCode(t) {\n const fullnameHash = stringHash(t.fullname);\n const genHashes = getGenerics(t).map(getHashCode);\n return combineHashCodes([fullnameHash, ...genHashes]);\n}\nexport function equals(t1, t2) {\n if (t1.fullname === \"\") { // Anonymous records\n return t2.fullname === \"\"\n && equalArraysWith(getRecordElements(t1), getRecordElements(t2), ([k1, v1], [k2, v2]) => k1 === k2 && equals(v1, v2));\n }\n else {\n return t1.fullname === t2.fullname\n && equalArraysWith(getGenerics(t1), getGenerics(t2), equals);\n }\n}\nexport function class_type(fullname, generics, construct, parent) {\n return new TypeInfo(fullname, generics, construct, parent);\n}\nexport function record_type(fullname, generics, construct, fields) {\n return new TypeInfo(fullname, generics, construct, undefined, fields);\n}\nexport function anonRecord_type(...fields) {\n return new TypeInfo(\"\", undefined, undefined, undefined, () => fields);\n}\nexport function union_type(fullname, generics, construct, cases) {\n const t = new TypeInfo(fullname, generics, construct, undefined, undefined, () => {\n const caseNames = construct.prototype.cases();\n return cases().map((fields, i) => new CaseInfo(t, i, caseNames[i], fields));\n });\n return t;\n}\nexport function tuple_type(...generics) {\n return new TypeInfo(\"System.Tuple`\" + generics.length, generics);\n}\nexport function delegate_type(...generics) {\n return new TypeInfo(\"System.Func`\" + generics.length, generics);\n}\nexport function lambda_type(argType, returnType) {\n return new TypeInfo(\"Microsoft.FSharp.Core.FSharpFunc`2\", [argType, returnType]);\n}\nexport function option_type(generic) {\n return new TypeInfo(\"Microsoft.FSharp.Core.FSharpOption`1\", [generic]);\n}\nexport function list_type(generic) {\n return new TypeInfo(\"Microsoft.FSharp.Collections.FSharpList`1\", [generic]);\n}\nexport function array_type(generic) {\n return new TypeInfo(\"[]\", [generic]);\n}\nexport function enum_type(fullname, underlyingType, enumCases) {\n return new TypeInfo(fullname, [underlyingType], undefined, undefined, undefined, undefined, enumCases);\n}\nexport function measure_type(fullname) {\n return new TypeInfo(fullname);\n}\nexport function generic_type(name) {\n return new GenericParameter(name);\n}\nexport const obj_type = new TypeInfo(\"System.Object\");\nexport const unit_type = new TypeInfo(\"Microsoft.FSharp.Core.Unit\");\nexport const char_type = new TypeInfo(\"System.Char\");\nexport const string_type = new TypeInfo(\"System.String\");\nexport const bool_type = new TypeInfo(\"System.Boolean\");\nexport const int8_type = new TypeInfo(\"System.SByte\");\nexport const uint8_type = new TypeInfo(\"System.Byte\");\nexport const int16_type = new TypeInfo(\"System.Int16\");\nexport const uint16_type = new TypeInfo(\"System.UInt16\");\nexport const int32_type = new TypeInfo(\"System.Int32\");\nexport const uint32_type = new TypeInfo(\"System.UInt32\");\nexport const float32_type = new TypeInfo(\"System.Single\");\nexport const float64_type = new TypeInfo(\"System.Double\");\nexport const decimal_type = new TypeInfo(\"System.Decimal\");\nexport function name(info) {\n if (Array.isArray(info)) {\n return info[0];\n }\n else if (info instanceof TypeInfo) {\n const elemType = getElementType(info);\n if (elemType != null) {\n return name(elemType) + \"[]\";\n }\n else {\n const i = info.fullname.lastIndexOf(\".\");\n return i === -1 ? info.fullname : info.fullname.substr(i + 1);\n }\n }\n else {\n return info.name;\n }\n}\nexport function fullName(t) {\n const elemType = getElementType(t);\n if (elemType != null) {\n return fullName(elemType) + \"[]\";\n }\n else if (t.generics == null || t.generics.length === 0) {\n return t.fullname;\n }\n else {\n return t.fullname + \"[\" + t.generics.map((x) => fullName(x)).join(\",\") + \"]\";\n }\n}\nexport function namespace(t) {\n const elemType = getElementType(t);\n if (elemType != null) {\n return namespace(elemType);\n }\n else {\n const i = t.fullname.lastIndexOf(\".\");\n return i === -1 ? \"\" : t.fullname.substr(0, i);\n }\n}\nexport function isArray(t) {\n return getElementType(t) != null;\n}\nexport function getElementType(t) {\n var _a;\n return t.fullname === \"[]\" && ((_a = t.generics) === null || _a === void 0 ? void 0 : _a.length) === 1 ? t.generics[0] : undefined;\n}\nexport function isGenericType(t) {\n return t.generics != null && t.generics.length > 0;\n}\nexport function isGenericParameter(t) {\n return t instanceof GenericParameter;\n}\nexport function isEnum(t) {\n return t.enumCases != null && t.enumCases.length > 0;\n}\nexport function isSubclassOf(t1, t2) {\n return (t2.fullname === obj_type.fullname) || (t1.parent != null && (t1.parent.Equals(t2) || isSubclassOf(t1.parent, t2)));\n}\nfunction isErasedToNumber(t) {\n return isEnum(t) || [\n int8_type.fullname,\n uint8_type.fullname,\n int16_type.fullname,\n uint16_type.fullname,\n int32_type.fullname,\n uint32_type.fullname,\n float32_type.fullname,\n float64_type.fullname,\n ].includes(t.fullname);\n}\nexport function isInstanceOfType(t, o) {\n if (t.fullname === obj_type.fullname)\n return true;\n switch (typeof o) {\n case \"boolean\":\n return t.fullname === bool_type.fullname;\n case \"string\":\n return t.fullname === string_type.fullname;\n case \"function\":\n return isFunction(t);\n case \"number\":\n return isErasedToNumber(t);\n default:\n return t.construct != null && o instanceof t.construct;\n }\n}\n/**\n * This doesn't replace types for fields (records) or cases (unions)\n * but it should be enough for type comparison purposes\n */\nexport function getGenericTypeDefinition(t) {\n return t.generics == null ? t : new TypeInfo(t.fullname, t.generics.map(() => obj_type));\n}\nexport function getEnumUnderlyingType(t) {\n var _a;\n return (_a = t.generics) === null || _a === void 0 ? void 0 : _a[0];\n}\nexport function getEnumValues(t) {\n if (isEnum(t) && t.enumCases != null) {\n return t.enumCases.map((kv) => kv[1]);\n }\n else {\n throw new Error(`${t.fullname} is not an enum type`);\n }\n}\nexport function getEnumNames(t) {\n if (isEnum(t) && t.enumCases != null) {\n return t.enumCases.map((kv) => kv[0]);\n }\n else {\n throw new Error(`${t.fullname} is not an enum type`);\n }\n}\nfunction getEnumCase(t, v) {\n if (t.enumCases != null) {\n if (typeof v === \"string\") {\n for (const kv of t.enumCases) {\n if (kv[0] === v) {\n return kv;\n }\n }\n throw new Error(`'${v}' was not found in ${t.fullname}`);\n }\n else {\n for (const kv of t.enumCases) {\n if (kv[1] === v) {\n return kv;\n }\n }\n // .NET returns the number even if it doesn't match any of the cases\n return [\"\", v];\n }\n }\n else {\n throw new Error(`${t.fullname} is not an enum type`);\n }\n}\nexport function parseEnum(t, str) {\n // TODO: better int parsing here, parseInt ceils floats: \"4.8\" -> 4\n const value = parseInt(str, 10);\n return getEnumCase(t, isNaN(value) ? str : value)[1];\n}\nexport function tryParseEnum(t, str, defValue) {\n try {\n defValue.contents = parseEnum(t, str);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nexport function getEnumName(t, v) {\n return getEnumCase(t, v)[0];\n}\nexport function isEnumDefined(t, v) {\n try {\n const kv = getEnumCase(t, v);\n return kv[0] != null && kv[0] !== \"\";\n }\n catch (_a) {\n // supress error\n }\n return false;\n}\n// FSharpType\nexport function getUnionCases(t) {\n if (t.cases != null) {\n return t.cases();\n }\n else {\n throw new Error(`${t.fullname} is not an F# union type`);\n }\n}\nexport function getRecordElements(t) {\n if (t.fields != null) {\n return t.fields();\n }\n else {\n throw new Error(`${t.fullname} is not an F# record type`);\n }\n}\nexport function getTupleElements(t) {\n if (isTuple(t) && t.generics != null) {\n return t.generics;\n }\n else {\n throw new Error(`${t.fullname} is not a tuple type`);\n }\n}\nexport function getFunctionElements(t) {\n if (isFunction(t) && t.generics != null) {\n const gen = t.generics;\n return [gen[0], gen[1]];\n }\n else {\n throw new Error(`${t.fullname} is not an F# function type`);\n }\n}\nexport function isUnion(t) {\n return t instanceof TypeInfo ? t.cases != null : t instanceof Union;\n}\nexport function isRecord(t) {\n return t instanceof TypeInfo ? t.fields != null : t instanceof Record;\n}\nexport function isTuple(t) {\n return t.fullname.startsWith(\"System.Tuple\");\n}\n// In .NET this is false for delegates\nexport function isFunction(t) {\n return t.fullname === \"Microsoft.FSharp.Core.FSharpFunc`2\";\n}\n// FSharpValue\nexport function getUnionFields(v, t) {\n const cases = getUnionCases(t);\n const case_ = cases[v.tag];\n if (case_ == null) {\n throw new Error(`Cannot find case ${v.name} in union type`);\n }\n return [case_, v.fields];\n}\nexport function getUnionCaseFields(uci) {\n return uci.fields == null ? [] : uci.fields;\n}\n// This is used as replacement of `FSharpValue.GetRecordFields`\n// For `FSharpTypes.GetRecordFields` see `getRecordElements`\n// Object.keys returns keys in the order they were added to the object\nexport function getRecordFields(v) {\n return Object.keys(v).map((k) => v[k]);\n}\nexport function getRecordField(v, field) {\n return v[field[0]];\n}\nexport function getTupleFields(v) {\n return v;\n}\nexport function getTupleField(v, i) {\n return v[i];\n}\nexport function makeUnion(uci, values) {\n const expectedLength = (uci.fields || []).length;\n if (values.length !== expectedLength) {\n throw new Error(`Expected an array of length ${expectedLength} but got ${values.length}`);\n }\n return uci.declaringType.construct != null\n ? new uci.declaringType.construct(uci.tag, ...values)\n : {};\n}\nexport function makeRecord(t, values) {\n const fields = getRecordElements(t);\n if (fields.length !== values.length) {\n throw new Error(`Expected an array of length ${fields.length} but got ${values.length}`);\n }\n return t.construct != null\n ? new t.construct(...values)\n : fields.reduce((obj, [key, _t], i) => {\n obj[key] = values[i];\n return obj;\n }, {});\n}\nexport function makeTuple(values, _t) {\n return values;\n}\nexport function makeGenericType(t, generics) {\n return new TypeInfo(t.fullname, generics, t.construct, t.parent, t.fields, t.cases);\n}\nexport function createInstance(t, consArgs) {\n // TODO: Check if consArgs length is same as t.construct?\n // (Arg types can still be different)\n if (typeof t.construct === \"function\") {\n return new t.construct(...(consArgs !== null && consArgs !== void 0 ? consArgs : []));\n }\n else if (isErasedToNumber(t)) {\n return 0;\n }\n else {\n switch (t.fullname) {\n case obj_type.fullname:\n return {};\n case bool_type.fullname:\n return false;\n case \"System.Int64\":\n case \"System.UInt64\":\n // typeof and typeof get transformed to class_type(\"System.Int64\")\n // and class_type(\"System.UInt64\") respectively. Test for the name of the primitive type.\n return int64FromInt(0);\n case decimal_type.fullname:\n return new Decimal(0);\n case char_type.fullname:\n // Even though char is a value type, it's erased to string, and Unchecked.defaultof is null\n return null;\n default:\n throw new Error(`Cannot access constructor of ${t.fullname}`);\n }\n }\n}\nexport function getValue(propertyInfo, v) {\n return v[propertyInfo[0]];\n}\n// Fable.Core.Reflection\nfunction assertUnion(x) {\n if (!(x instanceof Union)) {\n throw new Error(`Value is not an F# union type`);\n }\n}\nexport function getCaseTag(x) {\n assertUnion(x);\n return x.tag;\n}\nexport function getCaseName(x) {\n assertUnion(x);\n return x.cases()[x.tag];\n}\nexport function getCaseFields(x) {\n assertUnion(x);\n return x.fields;\n}\n","import { disposeSafe, structuralHash, equals } from \"./Util.js\";\nimport { HashIdentity_Structural, ComparisonIdentity_Structural } from \"./FSharp.Collections.js\";\nimport { StringBuilder__Append_Z721C83C5 } from \"./System.Text.js\";\n\nexport const LanguagePrimitives_GenericEqualityComparer = {\n [\"System.Collections.IEqualityComparer.Equals541DA560\"](x, y) {\n return equals(x, y);\n },\n [\"System.Collections.IEqualityComparer.GetHashCode4E60E31B\"](x_1) {\n return structuralHash(x_1);\n },\n};\n\nexport const LanguagePrimitives_GenericEqualityERComparer = {\n [\"System.Collections.IEqualityComparer.Equals541DA560\"](x, y) {\n return equals(x, y);\n },\n [\"System.Collections.IEqualityComparer.GetHashCode4E60E31B\"](x_1) {\n return structuralHash(x_1);\n },\n};\n\nexport function LanguagePrimitives_FastGenericComparer() {\n return ComparisonIdentity_Structural();\n}\n\nexport function LanguagePrimitives_FastGenericComparerFromTable() {\n return ComparisonIdentity_Structural();\n}\n\nexport function LanguagePrimitives_FastGenericEqualityComparer() {\n return HashIdentity_Structural();\n}\n\nexport function LanguagePrimitives_FastGenericEqualityComparerFromTable() {\n return HashIdentity_Structural();\n}\n\nexport function Operators_Failure(message) {\n return new Error(message);\n}\n\nexport function Operators_FailurePattern(exn) {\n return exn.message;\n}\n\nexport function Operators_NullArg(x) {\n throw (new Error(x));\n}\n\nexport function Operators_Using(resource, action) {\n try {\n return action(resource);\n }\n finally {\n if (equals(resource, null)) {\n }\n else {\n disposeSafe(resource);\n }\n }\n}\n\nexport function Operators_Lock(_lockObj, action) {\n return action();\n}\n\nexport function ExtraTopLevelOperators_LazyPattern(input) {\n return input.Value;\n}\n\nexport function PrintfModule_PrintFormatToStringBuilderThen(continuation, builder, format) {\n return format.cont((s) => {\n StringBuilder__Append_Z721C83C5(builder, s);\n return continuation();\n });\n}\n\nexport function PrintfModule_PrintFormatToStringBuilder(builder, format) {\n return PrintfModule_PrintFormatToStringBuilderThen(() => {\n }, builder, format);\n}\n\n","import { compare, physicalHash, equals, structuralHash } from \"./Util.js\";\n\nexport function HashIdentity_FromFunctions(hash, eq) {\n return {\n Equals(x, y) {\n return eq(x, y);\n },\n GetHashCode(x_1) {\n return hash(x_1);\n },\n };\n}\n\nexport function HashIdentity_Structural() {\n return HashIdentity_FromFunctions(structuralHash, equals);\n}\n\nexport function HashIdentity_Reference() {\n return HashIdentity_FromFunctions(physicalHash, (e, e_1) => (e === e_1));\n}\n\nexport function ComparisonIdentity_FromFunction(comparer) {\n return {\n Compare(x, y) {\n return comparer(x, y);\n },\n };\n}\n\nexport function ComparisonIdentity_Structural() {\n return ComparisonIdentity_FromFunction(compare);\n}\n\n","import { clear, equals, isArrayLike, isDisposable, toIterator, disposeSafe, getEnumerator } from \"./Util.js\";\nimport { toString } from \"./Types.js\";\nimport { class_type } from \"./Reflection.js\";\nimport { some, value as value_1 } from \"./Option.js\";\nimport { Operators_Lock, Operators_NullArg } from \"./FSharp.Core.js\";\nimport { chunkBySize as chunkBySize_1, permute as permute_1, transpose as transpose_1, windowed as windowed_1, splitInto as splitInto_1, map as map_1, pairwise as pairwise_1, scanBack as scanBack_1, reverse as reverse_1, mapFoldBack as mapFoldBack_1, mapFold as mapFold_1, tryItem as tryItem_1, tryHead as tryHead_1, foldBack2 as foldBack2_1, foldBack as foldBack_1, tryFindIndexBack as tryFindIndexBack_1, tryFindBack as tryFindBack_1, singleton as singleton_1 } from \"./Array.js\";\nimport { length as length_1, tryItem as tryItem_2, isEmpty as isEmpty_1, tryHead as tryHead_2, ofSeq as ofSeq_1, ofArray as ofArray_1, toArray as toArray_1, FSharpList } from \"./List.js\";\nimport { SR_indexOutOfBounds } from \"./Global.js\";\n\nexport const SR_enumerationAlreadyFinished = \"Enumeration already finished.\";\n\nexport const SR_enumerationNotStarted = \"Enumeration has not started. Call MoveNext.\";\n\nexport const SR_inputSequenceEmpty = \"The input sequence was empty.\";\n\nexport const SR_inputSequenceTooLong = \"The input sequence contains more than one element.\";\n\nexport const SR_keyNotFoundAlt = \"An index satisfying the predicate was not found in the collection.\";\n\nexport const SR_notEnoughElements = \"The input sequence has an insufficient number of elements.\";\n\nexport const SR_resetNotSupported = \"Reset is not supported on this enumerator.\";\n\nexport function Enumerator_noReset() {\n throw (new Error(SR_resetNotSupported));\n}\n\nexport function Enumerator_notStarted() {\n throw (new Error(SR_enumerationNotStarted));\n}\n\nexport function Enumerator_alreadyFinished() {\n throw (new Error(SR_enumerationAlreadyFinished));\n}\n\nexport class Enumerator_Seq {\n constructor(f) {\n this.f = f;\n }\n toString() {\n const xs = this;\n const maxCount = 4;\n let i = 0;\n let str = \"seq [\";\n const e = getEnumerator(xs);\n try {\n while ((i < maxCount) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n if (i > 0) {\n str = (str + \"; \");\n }\n str = (str + toString(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]()));\n i = ((i + 1) | 0);\n }\n if (i === maxCount) {\n str = (str + \"; ...\");\n }\n return str + \"]\";\n }\n finally {\n disposeSafe(e);\n }\n }\n GetEnumerator() {\n const x = this;\n return x.f();\n }\n [Symbol.iterator]() {\n return toIterator(this.GetEnumerator());\n }\n [\"System.Collections.IEnumerable.GetEnumerator\"]() {\n const x = this;\n return x.f();\n }\n}\n\nexport function Enumerator_Seq$reflection(gen0) {\n return class_type(\"SeqModule.Enumerator.Seq\", [gen0], Enumerator_Seq);\n}\n\nexport function Enumerator_Seq_$ctor_673A07F2(f) {\n return new Enumerator_Seq(f);\n}\n\nexport class Enumerator_FromFunctions$1 {\n constructor(current, next, dispose) {\n this.current = current;\n this.next = next;\n this.dispose = dispose;\n }\n [\"System.Collections.Generic.IEnumerator`1.get_Current\"]() {\n const __ = this;\n return __.current();\n }\n [\"System.Collections.IEnumerator.get_Current\"]() {\n const __ = this;\n return __.current();\n }\n [\"System.Collections.IEnumerator.MoveNext\"]() {\n const __ = this;\n return __.next();\n }\n [\"System.Collections.IEnumerator.Reset\"]() {\n Enumerator_noReset();\n }\n Dispose() {\n const __ = this;\n __.dispose();\n }\n}\n\nexport function Enumerator_FromFunctions$1$reflection(gen0) {\n return class_type(\"SeqModule.Enumerator.FromFunctions`1\", [gen0], Enumerator_FromFunctions$1);\n}\n\nexport function Enumerator_FromFunctions$1_$ctor_58C54629(current, next, dispose) {\n return new Enumerator_FromFunctions$1(current, next, dispose);\n}\n\nexport function Enumerator_cast(e) {\n return Enumerator_FromFunctions$1_$ctor_58C54629(() => e[\"System.Collections.IEnumerator.get_Current\"](), () => e[\"System.Collections.IEnumerator.MoveNext\"](), () => {\n if (isDisposable(e)) {\n disposeSafe(e);\n }\n });\n}\n\nexport function Enumerator_concat(sources) {\n let outerOpt = void 0;\n let innerOpt = void 0;\n let started = false;\n let finished = false;\n let curr = void 0;\n const finish = () => {\n finished = true;\n if (innerOpt != null) {\n const inner = innerOpt;\n try {\n disposeSafe(inner);\n }\n finally {\n innerOpt = (void 0);\n }\n }\n if (outerOpt != null) {\n const outer = outerOpt;\n try {\n disposeSafe(outer);\n }\n finally {\n outerOpt = (void 0);\n }\n }\n };\n return Enumerator_FromFunctions$1_$ctor_58C54629(() => {\n if (!started) {\n Enumerator_notStarted();\n }\n else if (finished) {\n Enumerator_alreadyFinished();\n }\n if (curr != null) {\n return value_1(curr);\n }\n else {\n return Enumerator_alreadyFinished();\n }\n }, () => {\n let copyOfStruct;\n if (!started) {\n started = true;\n }\n if (finished) {\n return false;\n }\n else {\n let res = void 0;\n while (res == null) {\n const matchValue = [outerOpt, innerOpt];\n if (matchValue[0] != null) {\n if (matchValue[1] != null) {\n const inner_1 = matchValue[1];\n if (inner_1[\"System.Collections.IEnumerator.MoveNext\"]()) {\n curr = some(inner_1[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n res = true;\n }\n else {\n try {\n disposeSafe(inner_1);\n }\n finally {\n innerOpt = (void 0);\n }\n }\n }\n else {\n const outer_1 = matchValue[0];\n if (outer_1[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const ie = outer_1[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n innerOpt = ((copyOfStruct = ie, getEnumerator(copyOfStruct)));\n }\n else {\n finish();\n res = false;\n }\n }\n }\n else {\n outerOpt = getEnumerator(sources);\n }\n }\n return value_1(res);\n }\n }, () => {\n if (!finished) {\n finish();\n }\n });\n}\n\nexport function Enumerator_enumerateThenFinally(f, e) {\n return Enumerator_FromFunctions$1_$ctor_58C54629(() => e[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), () => e[\"System.Collections.IEnumerator.MoveNext\"](), () => {\n try {\n disposeSafe(e);\n }\n finally {\n f();\n }\n });\n}\n\nexport function Enumerator_generateWhileSome(openf, compute, closef) {\n let started = false;\n let curr = void 0;\n let state = some(openf());\n const dispose = () => {\n if (state != null) {\n const x_1 = value_1(state);\n try {\n closef(x_1);\n }\n finally {\n state = (void 0);\n }\n }\n };\n const finish = () => {\n try {\n dispose();\n }\n finally {\n curr = (void 0);\n }\n };\n return Enumerator_FromFunctions$1_$ctor_58C54629(() => {\n if (!started) {\n Enumerator_notStarted();\n }\n if (curr != null) {\n return value_1(curr);\n }\n else {\n return Enumerator_alreadyFinished();\n }\n }, () => {\n if (!started) {\n started = true;\n }\n if (state != null) {\n const s = value_1(state);\n let matchValue_1;\n try {\n matchValue_1 = compute(s);\n }\n catch (matchValue) {\n finish();\n throw matchValue;\n }\n if (matchValue_1 != null) {\n curr = matchValue_1;\n return true;\n }\n else {\n finish();\n return false;\n }\n }\n else {\n return false;\n }\n }, dispose);\n}\n\nexport function Enumerator_unfold(f, state) {\n let curr = void 0;\n let acc = state;\n return Enumerator_FromFunctions$1_$ctor_58C54629(() => {\n if (curr != null) {\n const x = curr[0];\n const st = curr[1];\n return x;\n }\n else {\n return Enumerator_notStarted();\n }\n }, () => {\n curr = f(acc);\n if (curr != null) {\n const x_1 = curr[0];\n const st_1 = curr[1];\n acc = st_1;\n return true;\n }\n else {\n return false;\n }\n }, () => {\n });\n}\n\nexport function indexNotFound() {\n throw (new Error(SR_keyNotFoundAlt));\n}\n\nexport function checkNonNull(argName, arg) {\n if (arg == null) {\n Operators_NullArg(argName);\n }\n}\n\nexport function mkSeq(f) {\n return Enumerator_Seq_$ctor_673A07F2(f);\n}\n\nexport function ofSeq(xs) {\n checkNonNull(\"source\", xs);\n return getEnumerator(xs);\n}\n\nexport function delay(generator) {\n return mkSeq(() => getEnumerator(generator()));\n}\n\nexport function concat(sources) {\n return mkSeq(() => Enumerator_concat(sources));\n}\n\nexport function unfold(generator, state) {\n return mkSeq(() => Enumerator_unfold(generator, state));\n}\n\nexport function empty() {\n return delay(() => (new Array(0)));\n}\n\nexport function singleton(x) {\n return delay(() => singleton_1(x));\n}\n\nexport function ofArray(arr) {\n return arr;\n}\n\nexport function toArray(xs) {\n if (xs instanceof FSharpList) {\n return toArray_1(xs);\n }\n else {\n return Array.from(xs);\n }\n}\n\nexport function ofList(xs) {\n return xs;\n}\n\nexport function toList(xs) {\n if (isArrayLike(xs)) {\n return ofArray_1(xs);\n }\n else if (xs instanceof FSharpList) {\n return xs;\n }\n else {\n return ofSeq_1(xs);\n }\n}\n\nexport function generate(create, compute, dispose) {\n return mkSeq(() => Enumerator_generateWhileSome(create, compute, dispose));\n}\n\nexport function generateIndexed(create, compute, dispose) {\n return mkSeq(() => {\n let i = -1;\n return Enumerator_generateWhileSome(create, (x) => {\n i = ((i + 1) | 0);\n return compute(i, x);\n }, dispose);\n });\n}\n\nexport function append(xs, ys) {\n return concat([xs, ys]);\n}\n\nexport function cast(xs) {\n return mkSeq(() => {\n checkNonNull(\"source\", xs);\n return Enumerator_cast(getEnumerator(xs));\n });\n}\n\nexport function choose(chooser, xs) {\n return generate(() => ofSeq(xs), (e) => {\n let curr = void 0;\n while ((curr == null) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n curr = chooser(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n return curr;\n }, (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function compareWith(comparer, xs, ys) {\n const e1 = ofSeq(xs);\n try {\n const e2 = ofSeq(ys);\n try {\n let c = 0;\n let b1 = e1[\"System.Collections.IEnumerator.MoveNext\"]();\n let b2 = e2[\"System.Collections.IEnumerator.MoveNext\"]();\n while (((c === 0) && b1) && b2) {\n c = (comparer(e1[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), e2[\"System.Collections.Generic.IEnumerator`1.get_Current\"]()) | 0);\n if (c === 0) {\n b1 = e1[\"System.Collections.IEnumerator.MoveNext\"]();\n b2 = e2[\"System.Collections.IEnumerator.MoveNext\"]();\n }\n }\n return ((c !== 0) ? c : (b1 ? 1 : (b2 ? -1 : 0))) | 0;\n }\n finally {\n disposeSafe(e2);\n }\n }\n finally {\n disposeSafe(e1);\n }\n}\n\nexport function contains(value, xs, comparer) {\n const e = ofSeq(xs);\n try {\n let found = false;\n while ((!found) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n found = comparer.Equals(value, e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n return found;\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function enumerateFromFunctions(create, moveNext, current) {\n return generate(create, (x) => (moveNext(x) ? some(current(x)) : (void 0)), (x_1) => {\n const matchValue = x_1;\n if (isDisposable(matchValue)) {\n disposeSafe(matchValue);\n }\n });\n}\n\nexport function enumerateThenFinally(source, compensation) {\n const compensation_1 = compensation;\n return mkSeq(() => {\n try {\n return Enumerator_enumerateThenFinally(compensation_1, ofSeq(source));\n }\n catch (matchValue) {\n compensation_1();\n throw matchValue;\n }\n });\n}\n\nexport function enumerateUsing(resource, source) {\n const compensation = () => {\n if (equals(resource, null)) {\n }\n else {\n let copyOfStruct = resource;\n disposeSafe(copyOfStruct);\n }\n };\n return mkSeq(() => {\n try {\n return Enumerator_enumerateThenFinally(compensation, ofSeq(source(resource)));\n }\n catch (matchValue_1) {\n compensation();\n throw matchValue_1;\n }\n });\n}\n\nexport function enumerateWhile(guard, xs) {\n return concat(unfold((i) => (guard() ? [xs, i + 1] : (void 0)), 0));\n}\n\nexport function filter(f, xs) {\n return choose((x) => {\n if (f(x)) {\n return some(x);\n }\n else {\n return void 0;\n }\n }, xs);\n}\n\nexport function exists(predicate, xs) {\n const e = ofSeq(xs);\n try {\n let found = false;\n while ((!found) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n found = predicate(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n return found;\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function exists2(predicate, xs, ys) {\n const e1 = ofSeq(xs);\n try {\n const e2 = ofSeq(ys);\n try {\n let found = false;\n while (((!found) && e1[\"System.Collections.IEnumerator.MoveNext\"]()) && e2[\"System.Collections.IEnumerator.MoveNext\"]()) {\n found = predicate(e1[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), e2[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n return found;\n }\n finally {\n disposeSafe(e2);\n }\n }\n finally {\n disposeSafe(e1);\n }\n}\n\nexport function exactlyOne(xs) {\n const e = ofSeq(xs);\n try {\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const v = e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n throw (new Error((SR_inputSequenceTooLong + \"\\\\nParameter name: \") + \"source\"));\n }\n else {\n return v;\n }\n }\n else {\n throw (new Error((SR_inputSequenceEmpty + \"\\\\nParameter name: \") + \"source\"));\n }\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function tryExactlyOne(xs) {\n const e = ofSeq(xs);\n try {\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const v = e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n return e[\"System.Collections.IEnumerator.MoveNext\"]() ? (void 0) : some(v);\n }\n else {\n return void 0;\n }\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function tryFind(predicate, xs) {\n const e = ofSeq(xs);\n try {\n let res = void 0;\n while ((res == null) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const c = e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n if (predicate(c)) {\n res = some(c);\n }\n }\n return res;\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function find(predicate, xs) {\n const matchValue = tryFind(predicate, xs);\n if (matchValue == null) {\n return indexNotFound();\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function tryFindBack(predicate, xs) {\n return tryFindBack_1(predicate, toArray(xs));\n}\n\nexport function findBack(predicate, xs) {\n const matchValue = tryFindBack(predicate, xs);\n if (matchValue == null) {\n return indexNotFound();\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function tryFindIndex(predicate, xs) {\n const e = ofSeq(xs);\n try {\n const loop = (i_mut) => {\n loop:\n while (true) {\n const i = i_mut;\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n if (predicate(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]())) {\n return i;\n }\n else {\n i_mut = (i + 1);\n continue loop;\n }\n }\n else {\n return void 0;\n }\n break;\n }\n };\n return loop(0);\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function findIndex(predicate, xs) {\n const matchValue = tryFindIndex(predicate, xs);\n if (matchValue == null) {\n return indexNotFound() | 0;\n }\n else {\n return matchValue | 0;\n }\n}\n\nexport function tryFindIndexBack(predicate, xs) {\n return tryFindIndexBack_1(predicate, toArray(xs));\n}\n\nexport function findIndexBack(predicate, xs) {\n const matchValue = tryFindIndexBack(predicate, xs);\n if (matchValue == null) {\n return indexNotFound() | 0;\n }\n else {\n return matchValue | 0;\n }\n}\n\nexport function fold(folder, state, xs) {\n const e = ofSeq(xs);\n try {\n let acc = state;\n while (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n acc = folder(acc, e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n return acc;\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function foldBack(folder, xs, state) {\n return foldBack_1(folder, toArray(xs), state);\n}\n\nexport function fold2(folder, state, xs, ys) {\n const e1 = ofSeq(xs);\n try {\n const e2 = ofSeq(ys);\n try {\n let acc = state;\n while (e1[\"System.Collections.IEnumerator.MoveNext\"]() && e2[\"System.Collections.IEnumerator.MoveNext\"]()) {\n acc = folder(acc, e1[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), e2[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n return acc;\n }\n finally {\n disposeSafe(e2);\n }\n }\n finally {\n disposeSafe(e1);\n }\n}\n\nexport function foldBack2(folder, xs, ys, state) {\n return foldBack2_1(folder, toArray(xs), toArray(ys), state);\n}\n\nexport function forAll(predicate, xs) {\n return !exists((x) => (!predicate(x)), xs);\n}\n\nexport function forAll2(predicate, xs, ys) {\n return !exists2((x, y) => (!predicate(x, y)), xs, ys);\n}\n\nexport function tryHead(xs) {\n if (isArrayLike(xs)) {\n return tryHead_1(xs);\n }\n else if (xs instanceof FSharpList) {\n return tryHead_2(xs);\n }\n else {\n const e = ofSeq(xs);\n try {\n return e[\"System.Collections.IEnumerator.MoveNext\"]() ? some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]()) : (void 0);\n }\n finally {\n disposeSafe(e);\n }\n }\n}\n\nexport function head(xs) {\n const matchValue = tryHead(xs);\n if (matchValue == null) {\n throw (new Error((SR_inputSequenceEmpty + \"\\\\nParameter name: \") + \"source\"));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function initialize(count, f) {\n return unfold((i) => ((i < count) ? [f(i), i + 1] : (void 0)), 0);\n}\n\nexport function initializeInfinite(f) {\n return initialize(2147483647, f);\n}\n\nexport function isEmpty(xs) {\n if (isArrayLike(xs)) {\n return xs.length === 0;\n }\n else if (xs instanceof FSharpList) {\n return isEmpty_1(xs);\n }\n else {\n const e = ofSeq(xs);\n try {\n return !e[\"System.Collections.IEnumerator.MoveNext\"]();\n }\n finally {\n disposeSafe(e);\n }\n }\n}\n\nexport function tryItem(index, xs) {\n if (isArrayLike(xs)) {\n return tryItem_1(index, xs);\n }\n else if (xs instanceof FSharpList) {\n return tryItem_2(index, xs);\n }\n else {\n const e = ofSeq(xs);\n try {\n const loop = (index_1_mut) => {\n loop:\n while (true) {\n const index_1 = index_1_mut;\n if (!e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return void 0;\n }\n else if (index_1 === 0) {\n return some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else {\n index_1_mut = (index_1 - 1);\n continue loop;\n }\n break;\n }\n };\n return loop(index);\n }\n finally {\n disposeSafe(e);\n }\n }\n}\n\nexport function item(index, xs) {\n const matchValue = tryItem(index, xs);\n if (matchValue == null) {\n throw (new Error((SR_notEnoughElements + \"\\\\nParameter name: \") + \"index\"));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function iterate(action, xs) {\n fold((unitVar, x) => {\n action(x);\n }, void 0, xs);\n}\n\nexport function iterate2(action, xs, ys) {\n fold2((unitVar, x, y) => {\n action(x, y);\n }, void 0, xs, ys);\n}\n\nexport function iterateIndexed(action, xs) {\n fold((i, x) => {\n action(i, x);\n return (i + 1) | 0;\n }, 0, xs);\n}\n\nexport function iterateIndexed2(action, xs, ys) {\n fold2((i, x, y) => {\n action(i, x, y);\n return (i + 1) | 0;\n }, 0, xs, ys);\n}\n\nexport function tryLast(xs) {\n const e = ofSeq(xs);\n try {\n const loop = (acc_mut) => {\n loop:\n while (true) {\n const acc = acc_mut;\n if (!e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return acc;\n }\n else {\n acc_mut = e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n continue loop;\n }\n break;\n }\n };\n return e[\"System.Collections.IEnumerator.MoveNext\"]() ? some(loop(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]())) : (void 0);\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function last(xs) {\n const matchValue = tryLast(xs);\n if (matchValue == null) {\n throw (new Error((SR_notEnoughElements + \"\\\\nParameter name: \") + \"source\"));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function length(xs) {\n if (isArrayLike(xs)) {\n return xs.length | 0;\n }\n else if (xs instanceof FSharpList) {\n return length_1(xs) | 0;\n }\n else {\n const e = ofSeq(xs);\n try {\n let count = 0;\n while (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n count = ((count + 1) | 0);\n }\n return count | 0;\n }\n finally {\n disposeSafe(e);\n }\n }\n}\n\nexport function map(mapping, xs) {\n return generate(() => ofSeq(xs), (e) => (e[\"System.Collections.IEnumerator.MoveNext\"]() ? some(mapping(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]())) : (void 0)), (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function mapIndexed(mapping, xs) {\n return generateIndexed(() => ofSeq(xs), (i, e) => (e[\"System.Collections.IEnumerator.MoveNext\"]() ? some(mapping(i, e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]())) : (void 0)), (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function indexed(xs) {\n return mapIndexed((i, x) => [i, x], xs);\n}\n\nexport function map2(mapping, xs, ys) {\n return generate(() => [ofSeq(xs), ofSeq(ys)], (tupledArg) => {\n const e1 = tupledArg[0];\n const e2 = tupledArg[1];\n return (e1[\"System.Collections.IEnumerator.MoveNext\"]() && e2[\"System.Collections.IEnumerator.MoveNext\"]()) ? some(mapping(e1[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), e2[\"System.Collections.Generic.IEnumerator`1.get_Current\"]())) : (void 0);\n }, (tupledArg_1) => {\n try {\n disposeSafe(tupledArg_1[0]);\n }\n finally {\n disposeSafe(tupledArg_1[1]);\n }\n });\n}\n\nexport function mapIndexed2(mapping, xs, ys) {\n return generateIndexed(() => [ofSeq(xs), ofSeq(ys)], (i, tupledArg) => {\n const e1 = tupledArg[0];\n const e2 = tupledArg[1];\n return (e1[\"System.Collections.IEnumerator.MoveNext\"]() && e2[\"System.Collections.IEnumerator.MoveNext\"]()) ? some(mapping(i, e1[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), e2[\"System.Collections.Generic.IEnumerator`1.get_Current\"]())) : (void 0);\n }, (tupledArg_1) => {\n try {\n disposeSafe(tupledArg_1[0]);\n }\n finally {\n disposeSafe(tupledArg_1[1]);\n }\n });\n}\n\nexport function map3(mapping, xs, ys, zs) {\n return generate(() => [ofSeq(xs), ofSeq(ys), ofSeq(zs)], (tupledArg) => {\n const e1 = tupledArg[0];\n const e2 = tupledArg[1];\n const e3 = tupledArg[2];\n return ((e1[\"System.Collections.IEnumerator.MoveNext\"]() && e2[\"System.Collections.IEnumerator.MoveNext\"]()) && e3[\"System.Collections.IEnumerator.MoveNext\"]()) ? some(mapping(e1[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), e2[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), e3[\"System.Collections.Generic.IEnumerator`1.get_Current\"]())) : (void 0);\n }, (tupledArg_1) => {\n try {\n disposeSafe(tupledArg_1[0]);\n }\n finally {\n try {\n disposeSafe(tupledArg_1[1]);\n }\n finally {\n disposeSafe(tupledArg_1[2]);\n }\n }\n });\n}\n\nexport function readOnly(xs) {\n checkNonNull(\"source\", xs);\n return map((x) => x, xs);\n}\n\nexport class CachedSeq$1 {\n constructor(cleanup, res) {\n this.cleanup = cleanup;\n this.res = res;\n }\n Dispose() {\n const _ = this;\n _.cleanup();\n }\n GetEnumerator() {\n const _ = this;\n return getEnumerator(_.res);\n }\n [Symbol.iterator]() {\n return toIterator(this.GetEnumerator());\n }\n [\"System.Collections.IEnumerable.GetEnumerator\"]() {\n const _ = this;\n return getEnumerator(_.res);\n }\n}\n\nexport function CachedSeq$1$reflection(gen0) {\n return class_type(\"SeqModule.CachedSeq`1\", [gen0], CachedSeq$1);\n}\n\nexport function CachedSeq$1_$ctor_Z7A8347D4(cleanup, res) {\n return new CachedSeq$1(cleanup, res);\n}\n\nexport function CachedSeq$1__Clear(_) {\n _.cleanup();\n}\n\nexport function cache(source) {\n checkNonNull(\"source\", source);\n const prefix = [];\n let enumeratorR = void 0;\n return CachedSeq$1_$ctor_Z7A8347D4(() => {\n Operators_Lock(prefix, () => {\n clear(prefix);\n let pattern_matching_result, e;\n if (enumeratorR != null) {\n if (value_1(enumeratorR) != null) {\n pattern_matching_result = 0;\n e = value_1(enumeratorR);\n }\n else {\n pattern_matching_result = 1;\n }\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n disposeSafe(e);\n break;\n }\n }\n enumeratorR = (void 0);\n });\n }, unfold((i_1) => Operators_Lock(prefix, () => {\n if (i_1 < prefix.length) {\n return [prefix[i_1], i_1 + 1];\n }\n else {\n if (i_1 >= prefix.length) {\n let optEnumerator_2;\n if (enumeratorR != null) {\n optEnumerator_2 = value_1(enumeratorR);\n }\n else {\n const optEnumerator = getEnumerator(source);\n enumeratorR = some(optEnumerator);\n optEnumerator_2 = optEnumerator;\n }\n if (optEnumerator_2 == null) {\n }\n else {\n const enumerator = optEnumerator_2;\n if (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n void (prefix.push(enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]()));\n }\n else {\n disposeSafe(enumerator);\n enumeratorR = some(void 0);\n }\n }\n }\n return (i_1 < prefix.length) ? [prefix[i_1], i_1 + 1] : (void 0);\n }\n }), 0));\n}\n\nexport function allPairs(xs, ys) {\n const ysCache = cache(ys);\n return delay(() => concat(map((x) => map((y) => [x, y], ysCache), xs)));\n}\n\nexport function mapFold(mapping, state, xs) {\n const patternInput = mapFold_1(mapping, state, toArray(xs));\n return [readOnly(patternInput[0]), patternInput[1]];\n}\n\nexport function mapFoldBack(mapping, xs, state) {\n const patternInput = mapFoldBack_1(mapping, toArray(xs), state);\n return [readOnly(patternInput[0]), patternInput[1]];\n}\n\nexport function tryPick(chooser, xs) {\n const e = ofSeq(xs);\n try {\n let res = void 0;\n while ((res == null) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n res = chooser(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n return res;\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function pick(chooser, xs) {\n const matchValue = tryPick(chooser, xs);\n if (matchValue == null) {\n return indexNotFound();\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function reduce(folder, xs) {\n const e = ofSeq(xs);\n try {\n const loop = (acc_mut) => {\n loop:\n while (true) {\n const acc = acc_mut;\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n acc_mut = folder(acc, e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n continue loop;\n }\n else {\n return acc;\n }\n break;\n }\n };\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return loop(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else {\n throw (new Error(SR_inputSequenceEmpty));\n }\n }\n finally {\n disposeSafe(e);\n }\n}\n\nexport function reduceBack(folder, xs) {\n const arr = toArray(xs);\n if (arr.length > 0) {\n return arr.reduceRight(folder);\n }\n else {\n throw (new Error(SR_inputSequenceEmpty));\n }\n}\n\nexport function replicate(n, x) {\n return initialize(n, (_arg) => x);\n}\n\nexport function reverse(xs) {\n return delay(() => ofArray(reverse_1(toArray(xs))));\n}\n\nexport function scan(folder, state, xs) {\n return delay(() => {\n let acc = state;\n return concat([singleton(state), map((x) => {\n acc = folder(acc, x);\n return acc;\n }, xs)]);\n });\n}\n\nexport function scanBack(folder, xs, state) {\n return delay(() => ofArray(scanBack_1(folder, toArray(xs), state)));\n}\n\nexport function skip(count, source) {\n return mkSeq(() => {\n const e = ofSeq(source);\n try {\n for (let _ = 1; _ <= count; _++) {\n if (!e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n throw (new Error((SR_notEnoughElements + \"\\\\nParameter name: \") + \"source\"));\n }\n }\n return Enumerator_enumerateThenFinally(() => {\n }, e);\n }\n catch (matchValue) {\n disposeSafe(e);\n throw matchValue;\n }\n });\n}\n\nexport function skipWhile(predicate, xs) {\n return delay(() => {\n let skipped = true;\n return filter((x) => {\n if (skipped) {\n skipped = predicate(x);\n }\n return !skipped;\n }, xs);\n });\n}\n\nexport function tail(xs) {\n return skip(1, xs);\n}\n\nexport function take(count, xs) {\n return generateIndexed(() => ofSeq(xs), (i, e) => {\n if (i < count) {\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else {\n throw (new Error((SR_notEnoughElements + \"\\\\nParameter name: \") + \"source\"));\n }\n }\n else {\n return void 0;\n }\n }, (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function takeWhile(predicate, xs) {\n return generate(() => ofSeq(xs), (e) => ((e[\"System.Collections.IEnumerator.MoveNext\"]() && predicate(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]())) ? some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]()) : (void 0)), (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function truncate(count, xs) {\n return generateIndexed(() => ofSeq(xs), (i, e) => (((i < count) && e[\"System.Collections.IEnumerator.MoveNext\"]()) ? some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]()) : (void 0)), (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function zip(xs, ys) {\n return map2((x, y) => [x, y], xs, ys);\n}\n\nexport function zip3(xs, ys, zs) {\n return map3((x, y, z) => [x, y, z], xs, ys, zs);\n}\n\nexport function collect(mapping, xs) {\n return delay(() => concat(map(mapping, xs)));\n}\n\nexport function where(predicate, xs) {\n return filter(predicate, xs);\n}\n\nexport function pairwise(xs) {\n return delay(() => ofArray(pairwise_1(toArray(xs))));\n}\n\nexport function splitInto(chunks, xs) {\n return delay(() => ofArray(map_1(ofArray, splitInto_1(chunks, toArray(xs)))));\n}\n\nexport function windowed(windowSize, xs) {\n return delay(() => ofArray(map_1(ofArray, windowed_1(windowSize, toArray(xs)))));\n}\n\nexport function transpose(xss) {\n return delay(() => ofArray(map_1(ofArray, transpose_1(map_1(toArray, toArray(xss))))));\n}\n\nexport function sortWith(comparer, xs) {\n return delay(() => {\n const arr = toArray(xs);\n arr.sort(comparer);\n return ofArray(arr);\n });\n}\n\nexport function sort(xs, comparer) {\n return sortWith((x, y) => comparer.Compare(x, y), xs);\n}\n\nexport function sortBy(projection, xs, comparer) {\n return sortWith((x, y) => comparer.Compare(projection(x), projection(y)), xs);\n}\n\nexport function sortDescending(xs, comparer) {\n return sortWith((x, y) => (comparer.Compare(x, y) * -1), xs);\n}\n\nexport function sortByDescending(projection, xs, comparer) {\n return sortWith((x, y) => (comparer.Compare(projection(x), projection(y)) * -1), xs);\n}\n\nexport function sum(xs, adder) {\n return fold((acc, x) => adder.Add(acc, x), adder.GetZero(), xs);\n}\n\nexport function sumBy(f, xs, adder) {\n return fold((acc, x) => adder.Add(acc, f(x)), adder.GetZero(), xs);\n}\n\nexport function maxBy(projection, xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(projection(y), projection(x)) > 0) ? y : x), xs);\n}\n\nexport function max(xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(y, x) > 0) ? y : x), xs);\n}\n\nexport function minBy(projection, xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(projection(y), projection(x)) > 0) ? x : y), xs);\n}\n\nexport function min(xs, comparer) {\n return reduce((x, y) => ((comparer.Compare(y, x) > 0) ? x : y), xs);\n}\n\nexport function average(xs, averager) {\n let count = 0;\n const total = fold((acc, x) => {\n count = ((count + 1) | 0);\n return averager.Add(acc, x);\n }, averager.GetZero(), xs);\n if (count === 0) {\n throw (new Error((SR_inputSequenceEmpty + \"\\\\nParameter name: \") + \"source\"));\n }\n else {\n return averager.DivideByInt(total, count);\n }\n}\n\nexport function averageBy(f, xs, averager) {\n let count = 0;\n const total = fold((acc, x) => {\n count = ((count + 1) | 0);\n return averager.Add(acc, f(x));\n }, averager.GetZero(), xs);\n if (count === 0) {\n throw (new Error((SR_inputSequenceEmpty + \"\\\\nParameter name: \") + \"source\"));\n }\n else {\n return averager.DivideByInt(total, count);\n }\n}\n\nexport function permute(f, xs) {\n return delay(() => ofArray(permute_1(f, toArray(xs))));\n}\n\nexport function chunkBySize(chunkSize, xs) {\n return delay(() => ofArray(map_1(ofArray, chunkBySize_1(chunkSize, toArray(xs)))));\n}\n\nexport function insertAt(index, y, xs) {\n let isDone = false;\n if (index < 0) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return generateIndexed(() => ofSeq(xs), (i, e) => {\n if ((isDone ? true : (i < index)) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else if (i === index) {\n isDone = true;\n return some(y);\n }\n else {\n if (!isDone) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return void 0;\n }\n }, (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function insertManyAt(index, ys, xs) {\n let status = -1;\n if (index < 0) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return generateIndexed(() => [ofSeq(xs), ofSeq(ys)], (i, tupledArg) => {\n const e1 = tupledArg[0];\n const e2 = tupledArg[1];\n if (i === index) {\n status = 0;\n }\n let inserted;\n if (status === 0) {\n if (e2[\"System.Collections.IEnumerator.MoveNext\"]()) {\n inserted = some(e2[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else {\n status = 1;\n inserted = (void 0);\n }\n }\n else {\n inserted = (void 0);\n }\n if (inserted == null) {\n if (e1[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return some(e1[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else {\n if (status < 1) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return void 0;\n }\n }\n else {\n return some(value_1(inserted));\n }\n }, (tupledArg_1) => {\n disposeSafe(tupledArg_1[0]);\n disposeSafe(tupledArg_1[1]);\n });\n}\n\nexport function removeAt(index, xs) {\n let isDone = false;\n if (index < 0) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return generateIndexed(() => ofSeq(xs), (i, e) => {\n if ((isDone ? true : (i < index)) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else if ((i === index) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n isDone = true;\n return e[\"System.Collections.IEnumerator.MoveNext\"]() ? some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]()) : (void 0);\n }\n else {\n if (!isDone) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return void 0;\n }\n }, (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function removeManyAt(index, count, xs) {\n if (index < 0) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return generateIndexed(() => ofSeq(xs), (i, e) => {\n if (i < index) {\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n }\n else {\n if (i === index) {\n for (let _ = 1; _ <= count; _++) {\n if (!e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"count\"));\n }\n }\n }\n return e[\"System.Collections.IEnumerator.MoveNext\"]() ? some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]()) : (void 0);\n }\n }, (e_1) => {\n disposeSafe(e_1);\n });\n}\n\nexport function updateAt(index, y, xs) {\n let isDone = false;\n if (index < 0) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return generateIndexed(() => ofSeq(xs), (i, e) => {\n if ((isDone ? true : (i < index)) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return some(e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n }\n else if ((i === index) && e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n isDone = true;\n return some(y);\n }\n else {\n if (!isDone) {\n throw (new Error((SR_indexOutOfBounds + \"\\\\nParameter name: \") + \"index\"));\n }\n return void 0;\n }\n }, (e_1) => {\n disposeSafe(e_1);\n });\n}\n\n","import { equals } from \"./Util.js\";\nimport { Union } from \"./Types.js\";\nconst CaseRules = {\n None: 0,\n LowerFirst: 1,\n SnakeCase: 2,\n SnakeCaseAllCaps: 3,\n KebabCase: 4,\n};\nfunction dashify(str, separator) {\n return str.replace(/[a-z]?[A-Z]/g, (m) => m.length === 1\n ? m.toLowerCase()\n : m.charAt(0) + separator + m.charAt(1).toLowerCase());\n}\nfunction changeCase(str, caseRule) {\n switch (caseRule) {\n case CaseRules.LowerFirst:\n return str.charAt(0).toLowerCase() + str.slice(1);\n case CaseRules.SnakeCase:\n return dashify(str, \"_\");\n case CaseRules.SnakeCaseAllCaps:\n return dashify(str, \"_\").toUpperCase();\n case CaseRules.KebabCase:\n return dashify(str, \"-\");\n case CaseRules.None:\n default:\n return str;\n }\n}\nexport function keyValueList(fields, caseRule = CaseRules.None) {\n const obj = {};\n const definedCaseRule = caseRule;\n function fail(kvPair) {\n throw new Error(\"Cannot infer key and value of \" + String(kvPair));\n }\n function assign(key, caseRule, value) {\n key = changeCase(key, caseRule);\n obj[key] = value;\n }\n for (let kvPair of fields) {\n let caseRule = CaseRules.None;\n if (kvPair == null) {\n fail(kvPair);\n }\n // Deflate unions and use the defined case rule\n if (kvPair instanceof Union) {\n const name = kvPair.cases()[kvPair.tag];\n kvPair = kvPair.fields.length === 0 ? name : [name].concat(kvPair.fields);\n caseRule = definedCaseRule;\n }\n if (Array.isArray(kvPair)) {\n switch (kvPair.length) {\n case 0:\n fail(kvPair);\n break;\n case 1:\n assign(kvPair[0], caseRule, true);\n break;\n case 2:\n const value = kvPair[1];\n assign(kvPair[0], caseRule, value);\n break;\n default:\n assign(kvPair[0], caseRule, kvPair.slice(1));\n }\n }\n else if (typeof kvPair === \"string\") {\n assign(kvPair, caseRule, true);\n }\n else {\n fail(kvPair);\n }\n }\n return obj;\n}\n// TODO: Move these methods to Map and Set modules\nexport function containsValue(v, map) {\n for (const kv of map) {\n if (equals(v, kv[1])) {\n return true;\n }\n }\n return false;\n}\nexport function tryGetValue(map, key, defaultValue) {\n if (map.has(key)) {\n defaultValue.contents = map.get(key);\n return true;\n }\n return false;\n}\nexport function addToSet(v, set) {\n if (set.has(v)) {\n return false;\n }\n set.add(v);\n return true;\n}\nexport function addToDict(dict, k, v) {\n if (dict.has(k)) {\n throw new Error(\"An item with the same key has already been added. Key: \" + k);\n }\n dict.set(k, v);\n}\nexport function getItemFromDict(map, key) {\n if (map.has(key)) {\n return map.get(key);\n }\n else {\n throw new Error(`The given key '${key}' was not present in the dictionary.`);\n }\n}\n","import { disposeSafe, equals, toIterator, getEnumerator } from \"./Util.js\";\nimport { iterate, map, delay, toArray, iterateIndexed, concat } from \"./Seq.js\";\nimport { FSharpRef } from \"./Types.js\";\nimport { class_type } from \"./Reflection.js\";\nimport { getItemFromDict, tryGetValue } from \"./MapUtil.js\";\nimport { format } from \"./String.js\";\n\nexport class Dictionary {\n constructor(pairs, comparer) {\n const this$ = new FSharpRef(null);\n this.comparer = comparer;\n this$.contents = this;\n this.hashMap = (new Map([]));\n this[\"init@8-1\"] = 1;\n const enumerator = getEnumerator(pairs);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const pair = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n Dictionary__Add_5BDDA1(this$.contents, pair[0], pair[1]);\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n }\n get [Symbol.toStringTag]() {\n return \"Dictionary\";\n }\n toJSON(_key) {\n const this$ = this;\n return Array.from(this$);\n }\n [\"System.Collections.IEnumerable.GetEnumerator\"]() {\n const this$ = this;\n return getEnumerator(this$);\n }\n GetEnumerator() {\n const this$ = this;\n return getEnumerator(concat(this$.hashMap.values()));\n }\n [Symbol.iterator]() {\n return toIterator(this.GetEnumerator());\n }\n [\"System.Collections.Generic.ICollection`1.Add2B595\"](item) {\n const this$ = this;\n Dictionary__Add_5BDDA1(this$, item[0], item[1]);\n }\n [\"System.Collections.Generic.ICollection`1.Clear\"]() {\n const this$ = this;\n Dictionary__Clear(this$);\n }\n [\"System.Collections.Generic.ICollection`1.Contains2B595\"](item) {\n const this$ = this;\n const matchValue = Dictionary__TryFind_2B595(this$, item[0]);\n let pattern_matching_result;\n if (matchValue != null) {\n if (equals(matchValue[1], item[1])) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 1;\n }\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n return true;\n }\n case 1: {\n return false;\n }\n }\n }\n [\"System.Collections.Generic.ICollection`1.CopyToZ2E171D71\"](array, arrayIndex) {\n const this$ = this;\n iterateIndexed((i, e) => {\n array[arrayIndex + i] = e;\n }, this$);\n }\n [\"System.Collections.Generic.ICollection`1.get_Count\"]() {\n const this$ = this;\n return Dictionary__get_Count(this$) | 0;\n }\n [\"System.Collections.Generic.ICollection`1.get_IsReadOnly\"]() {\n return false;\n }\n [\"System.Collections.Generic.ICollection`1.Remove2B595\"](item) {\n const this$ = this;\n const matchValue = Dictionary__TryFind_2B595(this$, item[0]);\n if (matchValue != null) {\n if (equals(matchValue[1], item[1])) {\n Dictionary__Remove_2B595(this$, item[0]);\n }\n return true;\n }\n else {\n return false;\n }\n }\n [\"System.Collections.Generic.IDictionary`2.Add5BDDA1\"](key, value) {\n const this$ = this;\n Dictionary__Add_5BDDA1(this$, key, value);\n }\n [\"System.Collections.Generic.IDictionary`2.ContainsKey2B595\"](key) {\n const this$ = this;\n return Dictionary__ContainsKey_2B595(this$, key);\n }\n [\"System.Collections.Generic.IDictionary`2.get_Item2B595\"](key) {\n const this$ = this;\n return Dictionary__get_Item_2B595(this$, key);\n }\n [\"System.Collections.Generic.IDictionary`2.set_Item5BDDA1\"](key, v) {\n const this$ = this;\n Dictionary__set_Item_5BDDA1(this$, key, v);\n }\n [\"System.Collections.Generic.IDictionary`2.get_Keys\"]() {\n const this$ = this;\n return toArray(delay(() => map((pair) => pair[0], this$)));\n }\n [\"System.Collections.Generic.IDictionary`2.Remove2B595\"](key) {\n const this$ = this;\n return Dictionary__Remove_2B595(this$, key);\n }\n [\"System.Collections.Generic.IDictionary`2.TryGetValue23A0B95A\"](key, value) {\n const this$ = this;\n const matchValue = Dictionary__TryFind_2B595(this$, key);\n if (matchValue != null) {\n const pair = matchValue;\n value.contents = pair[1];\n return true;\n }\n else {\n return false;\n }\n }\n [\"System.Collections.Generic.IDictionary`2.get_Values\"]() {\n const this$ = this;\n return toArray(delay(() => map((pair) => pair[1], this$)));\n }\n get size() {\n const this$ = this;\n return Dictionary__get_Count(this$) | 0;\n }\n clear() {\n const this$ = this;\n Dictionary__Clear(this$);\n }\n delete(k) {\n const this$ = this;\n return Dictionary__Remove_2B595(this$, k);\n }\n entries() {\n const this$ = this;\n return map((p) => [p[0], p[1]], this$);\n }\n get(k) {\n const this$ = this;\n return Dictionary__get_Item_2B595(this$, k);\n }\n has(k) {\n const this$ = this;\n return Dictionary__ContainsKey_2B595(this$, k);\n }\n keys() {\n const this$ = this;\n return map((p) => p[0], this$);\n }\n set(k, v) {\n const this$ = this;\n Dictionary__set_Item_5BDDA1(this$, k, v);\n return this$;\n }\n values() {\n const this$ = this;\n return map((p) => p[1], this$);\n }\n forEach(f, thisArg) {\n const this$ = this;\n iterate((p) => {\n f(p[1], p[0], this$);\n }, this$);\n }\n}\n\nexport function Dictionary$reflection(gen0, gen1) {\n return class_type(\"Fable.Collections.Dictionary\", [gen0, gen1], Dictionary);\n}\n\nexport function Dictionary_$ctor_6623D9B3(pairs, comparer) {\n return new Dictionary(pairs, comparer);\n}\n\nfunction Dictionary__TryFindIndex_2B595(this$, k) {\n const h = this$.comparer.GetHashCode(k) | 0;\n let matchValue;\n let outArg = null;\n matchValue = [tryGetValue(this$.hashMap, h, new FSharpRef(() => outArg, (v) => {\n outArg = v;\n })), outArg];\n if (matchValue[0]) {\n return [true, h, matchValue[1].findIndex((pair) => this$.comparer.Equals(k, pair[0]))];\n }\n else {\n return [false, h, -1];\n }\n}\n\nexport function Dictionary__TryFind_2B595(this$, k) {\n const matchValue = Dictionary__TryFindIndex_2B595(this$, k);\n let pattern_matching_result;\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 1;\n }\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n return getItemFromDict(this$.hashMap, matchValue[1])[matchValue[2]];\n }\n case 1: {\n return void 0;\n }\n }\n}\n\nexport function Dictionary__get_Comparer(this$) {\n return this$.comparer;\n}\n\nexport function Dictionary__Clear(this$) {\n this$.hashMap.clear();\n}\n\nexport function Dictionary__get_Count(this$) {\n let count = 0;\n let enumerator = getEnumerator(this$.hashMap.values());\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const pairs = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n count = ((count + pairs.length) | 0);\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n return count | 0;\n}\n\nexport function Dictionary__get_Item_2B595(this$, k) {\n const matchValue = Dictionary__TryFind_2B595(this$, k);\n if (matchValue != null) {\n return matchValue[1];\n }\n else {\n throw (new Error(\"The item was not found in collection\"));\n }\n}\n\nexport function Dictionary__set_Item_5BDDA1(this$, k, v) {\n const matchValue = Dictionary__TryFindIndex_2B595(this$, k);\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n getItemFromDict(this$.hashMap, matchValue[1])[matchValue[2]] = [k, v];\n }\n else {\n const value = void (getItemFromDict(this$.hashMap, matchValue[1]).push([k, v]));\n }\n }\n else {\n this$.hashMap.set(matchValue[1], [[k, v]]);\n }\n}\n\nexport function Dictionary__Add_5BDDA1(this$, k, v) {\n const matchValue = Dictionary__TryFindIndex_2B595(this$, k);\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n const msg = format(\"An item with the same key has already been added. Key: {0}\", k);\n throw (new Error(msg));\n }\n else {\n const value = void (getItemFromDict(this$.hashMap, matchValue[1]).push([k, v]));\n }\n }\n else {\n this$.hashMap.set(matchValue[1], [[k, v]]);\n }\n}\n\nexport function Dictionary__ContainsKey_2B595(this$, k) {\n const matchValue = Dictionary__TryFindIndex_2B595(this$, k);\n let pattern_matching_result;\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 1;\n }\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n return true;\n }\n case 1: {\n return false;\n }\n }\n}\n\nexport function Dictionary__Remove_2B595(this$, k) {\n const matchValue = Dictionary__TryFindIndex_2B595(this$, k);\n let pattern_matching_result;\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 1;\n }\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n getItemFromDict(this$.hashMap, matchValue[1]).splice(matchValue[2], 1);\n return true;\n }\n case 1: {\n return false;\n }\n }\n}\n\n","namespace Fable.SimpleJson\n\nopen System\nopen FSharp.Reflection\nopen Fable.Core\nopen System.Reflection\nopen System.Collections.Generic\n\n[]\nmodule Converter =\n let (|PrimitiveType|_|) (primType: Type) =\n match primType.FullName with\n | \"System.String\" -> Some TypeInfo.String\n | \"System.Char\" -> Some TypeInfo.Char\n | \"System.Int16\" -> Some TypeInfo.Short\n | \"System.Int32\" -> Some TypeInfo.Int32\n | \"Microsoft.FSharp.Core.int64`1\"\n | \"System.Int64\" -> Some TypeInfo.Long\n | \"System.UInt16\" -> Some TypeInfo.UInt16\n | \"System.UInt32\" -> Some TypeInfo.UInt32\n | \"System.UInt64\" -> Some TypeInfo.UInt64\n | \"System.DateTime\" -> Some TypeInfo.DateTime\n | \"System.DateOnly\" -> Some TypeInfo.DateOnly\n | \"System.TimeOnly\" -> Some TypeInfo.TimeOnly\n | \"System.TimeSpan\" -> Some TypeInfo.TimeSpan\n | \"System.DateTimeOffset\" -> Some TypeInfo.DateTimeOffset\n | \"System.Boolean\" -> Some TypeInfo.Bool\n | \"System.Single\" -> Some TypeInfo.Float32\n | \"System.Double\" -> Some TypeInfo.Float\n | \"Microsoft.FSharp.Core.decimal`1\"\n | \"System.Decimal\" -> Some TypeInfo.Decimal\n | \"System.Numerics.BigInteger\" -> Some TypeInfo.BigInt\n | \"Microsoft.FSharp.Core.Unit\" -> Some TypeInfo.Unit\n | \"System.Guid\" -> Some TypeInfo.Guid\n | \"System.Byte\" -> Some TypeInfo.Byte\n | \"System.SByte\" -> Some TypeInfo.SByte\n | \"System.Object\" -> Some TypeInfo.Object\n | \"System.Uri\" -> Some TypeInfo.Uri\n | _ -> None\n\n let (|RecordType|_|) (t: Type) =\n if FSharpType.IsRecord t\n then\n FSharpType.GetRecordFields t\n |> Array.map (fun field -> field, field.Name, field.PropertyType)\n |> Some\n else None\n\n let (|SetType|_|) (t: Type) =\n if t.FullName.StartsWith \"Microsoft.FSharp.Collections.FSharpSet`1\"\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let (|Nullable|_|) (t: Type) =\n if t.FullName.StartsWith \"System.Nullable`1\"\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let (|UnionType|_|) (t: Type) =\n if FSharpType.IsUnion t\n then\n FSharpType.GetUnionCases t\n |> Array.map (fun info ->\n let caseName = info.Name\n let caseTypes = info.GetFields() |> Array.map (fun prop -> prop.PropertyType)\n caseName, info, caseTypes)\n |> Some\n else None\n\n let (|MapType|_|) (t: Type) =\n if (t.FullName.StartsWith \"Microsoft.FSharp.Collections.FSharpMap`2\")\n then\n let genArgs = t.GetGenericArguments()\n Some (genArgs.[0], genArgs.[1])\n else None\n\n let (|ListType|_|) (t: Type) =\n if (t.FullName.StartsWith \"Microsoft.FSharp.Collections.FSharpList`1\")\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let rec flattenFuncTypes (typeDef: Type) =\n [| if FSharpType.IsFunction typeDef\n then let (domain, range) = FSharpType.GetFunctionElements typeDef\n yield! flattenFuncTypes domain\n yield! flattenFuncTypes range\n else yield typeDef |]\n\n let (|FuncType|_|) (t: Type) =\n if FSharpType.IsFunction t\n then flattenFuncTypes t |> Some\n else None\n\n let (|ArrayType|_|) (t:Type) =\n if t.IsArray\n then t.GetElementType() |> Some\n else None\n\n let (|OptionType|_|) (t:Type) =\n if (t.FullName.StartsWith \"Microsoft.FSharp.Core.FSharpOption`1\")\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let (|TupleType|_|) (t: Type) =\n if FSharpType.IsTuple t\n then FSharpType.GetTupleElements(t) |> Some\n else None\n\n let (|SeqType|_|) (t: Type) =\n if t.FullName.StartsWith \"System.Collections.Generic.IEnumerable`1\"\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let (|DictionaryType|_|) (t: Type) =\n if t.FullName.StartsWith \"System.Collections.Generic.Dictionary\"\n then\n let genArgs = t.GetGenericArguments()\n Some (genArgs.[0], genArgs.[1])\n else\n None\n\n let (|ResizeArrayType|_|) (t: Type) =\n if t.FullName.StartsWith \"System.Collections.Generic.List\"\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let (|HashSetType|_|) (t: Type) =\n if t.FullName.StartsWith \"System.Collections.Generic.HashSet\"\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let (|AsyncType|_|) (t:Type) =\n if t.FullName.StartsWith \"Microsoft.FSharp.Control.FSharpAsync`1\"\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let (|PromiseType|_|) (t:Type) =\n if t.FullName.StartsWith \"Fable.Core.JS.Promise`1\"\n then t.GetGenericArguments().[0] |> Some\n else None\n\n let private lazyToDelayed (l:Lazy<_>) = fun () -> l.Value\n\n let (|EnumType|_|) (t: Type) =\n if t.IsEnum\n then Enum.GetUnderlyingType(t) |> Some\n else None\n\n let rec private _createTypeInfo (resolvedType: Type) : Fable.SimpleJson.TypeInfo =\n match resolvedType with\n | PrimitiveType typeInfo -> typeInfo\n | FuncType (types) -> TypeInfo.Func <| lazyToDelayed (lazy (Array.map createTypeInfo types))\n | RecordType fields ->\n let l = lazy (\n let fields =\n [| for (field, fieldName, fieldType) in fields ->\n { PropertyInfo = field\n FieldName = fieldName;\n FieldType = createTypeInfo fieldType } |]\n fields, resolvedType)\n TypeInfo.Record (lazyToDelayed l)\n\n | UnionType cases ->\n let l = lazy (\n [| for (caseName, caseInfo, caseTypes) in cases ->\n { CaseName = caseName;\n Info = caseInfo;\n CaseTypes = Array.map createTypeInfo caseTypes } |], resolvedType)\n TypeInfo.Union (lazyToDelayed l)\n\n | EnumType elemType -> TypeInfo.Enum (lazyToDelayed <| lazy (createTypeInfo elemType, resolvedType))\n | ListType elemType -> TypeInfo.List (lazyToDelayed <| lazy (createTypeInfo elemType))\n | ResizeArrayType elemType -> TypeInfo.ResizeArray (lazyToDelayed <| lazy (createTypeInfo elemType))\n | HashSetType elemType -> TypeInfo.HashSet (lazyToDelayed <| lazy (createTypeInfo elemType))\n | ArrayType elemType -> TypeInfo.Array (lazyToDelayed <| lazy (createTypeInfo elemType))\n // Checking for tuples has to happen after checking for arrays\n | TupleType types -> TypeInfo.Tuple (lazyToDelayed <| lazy (Array.map createTypeInfo types))\n | OptionType elemType -> TypeInfo.Option (lazyToDelayed <| lazy (createTypeInfo elemType))\n | Nullable elemType -> TypeInfo.Option (lazyToDelayed <| lazy (createTypeInfo elemType))\n | SetType elemType -> TypeInfo.Set (lazyToDelayed <| lazy (createTypeInfo elemType))\n | MapType (keyType, valueType) -> TypeInfo.Map (lazyToDelayed <| lazy (createTypeInfo keyType, createTypeInfo valueType))\n | DictionaryType (keyType, valueType) -> TypeInfo.Dictionary (lazyToDelayed <| lazy (createTypeInfo keyType, createTypeInfo valueType, valueType))\n | SeqType elemType -> TypeInfo.Seq (lazyToDelayed <| lazy (createTypeInfo elemType))\n | AsyncType elemType -> TypeInfo.Async (lazyToDelayed <| lazy (createTypeInfo elemType))\n | PromiseType elemType -> TypeInfo.Promise (lazyToDelayed <| lazy (createTypeInfo elemType))\n | _ -> TypeInfo.Any (lazyToDelayed <| lazy (resolvedType))\n\n and private typeInfoCache = Dictionary()\n\n and createTypeInfo (resolvedType: Type) : Fable.SimpleJson.TypeInfo =\n match typeInfoCache.TryGetValue resolvedType with\n | true, ti -> ti\n | false, _ ->\n let ti = _createTypeInfo resolvedType\n // see https://github.com/fable-compiler/Fable/issues/1871\n // Type equality doesn't work for anonymous records - all anon records are considered equal.\n // For anonymous records, the name is the empty string.\n let notAnonymousRecord =\n not (String.IsNullOrEmpty resolvedType.FullName)\n && not (resolvedType.FullName.EndsWith(\"`1[]\"))\n && not (resolvedType.FullName.EndsWith(\"`2[]\"))\n\n if notAnonymousRecord then\n typeInfoCache.[resolvedType] <- ti\n ti\n else\n ti\n\n type Fable.SimpleJson.TypeInfo with\n static member inline createFrom<'t> () : Fable.SimpleJson.TypeInfo =\n createTypeInfo typeof<'t>\n\n /// returns whether a type is primitive\n let isPrimitive = function\n | TypeInfo.Unit\n | TypeInfo.String\n | TypeInfo.UInt16\n | TypeInfo.UInt32\n | TypeInfo.UInt64\n | TypeInfo.Int32\n | TypeInfo.Bool\n | TypeInfo.Float32\n | TypeInfo.Float\n | TypeInfo.Decimal\n | TypeInfo.Short\n | TypeInfo.Long\n | TypeInfo.Byte\n | TypeInfo.DateTime\n | TypeInfo.DateTimeOffset\n | TypeInfo.DateOnly\n | TypeInfo.TimeOnly\n | TypeInfo.BigInt\n | TypeInfo.Guid\n | TypeInfo.Option _ -> true\n | otherwise -> false\n\n /// returns whether the discrimiated union type is like a enum\n let enumUnion = function\n | TypeInfo.Union getCases ->\n getCases()\n |> fst\n |> Array.forall (fun case -> Array.isEmpty case.CaseTypes)\n | otherwise -> false\n","namespace Fable.Remoting.Client\n\nopen System\nopen Browser.Types\nopen Fable.Core\nopen Fable.Core.JsInterop\nopen System.Runtime.CompilerServices\n\n/// Utilities for working with binary data types in the browser\nmodule InternalUtilities =\n /// Creates a new instance of a FileReader\n []\n let createFileReader() : FileReader = jsNative\n []\n let createUInt8Array(x: 'a) : byte[] = jsNative\n /// Creates a Blob from the given input string\n []\n let createBlobFromBytesAndMimeType (value: byte[]) (mimeType: string) : Blob = jsNative\n /// Creates an object URL (also known as data url) from a Blob\n []\n let createObjectUrl (blob: Blob) : string = jsNative\n /// Releases an existing object URL which was previously created by calling createObjectURL(). Call this method when you've finished using an object URL to let the browser know not to keep the reference to the file any longer.\n []\n let revokeObjectUrl (dataUrl: string) : unit = jsNative\n /// Returns whether the input byte array is a typed array of type Uint8Array\n []\n let isUInt8Array (data: byte[]) : bool = jsNative\n /// Creates a typed byte array of binary data if it not already typed\n let toUInt8Array(data: byte[]) : byte[] =\n if isUInt8Array data\n then data\n else createUInt8Array data\n\n[]\nmodule BrowserFileExtensions =\n\n type File with\n\n /// Asynchronously reads the File content as byte[]\n member instance.ReadAsByteArray() =\n Async.FromContinuations <| fun (resolve, _, _) ->\n let reader = InternalUtilities.createFileReader()\n reader.onload <- fun _ ->\n if reader.readyState = FileReaderState.DONE\n then resolve(InternalUtilities.createUInt8Array(reader.result))\n\n reader.readAsArrayBuffer(instance)\n\n /// Asynchronously reads the File content as a data url string\n member instance.ReadAsDataUrl() =\n Async.FromContinuations <| fun (resolve, _, _) ->\n let reader = InternalUtilities.createFileReader()\n reader.onload <- fun _ ->\n if reader.readyState = FileReaderState.DONE\n then resolve(unbox reader.result)\n\n reader.readAsDataURL(instance)\n\n /// Asynchronously reads the File contents as text\n member instance.ReadAsText() =\n Async.FromContinuations <| fun (resolve, _, _) ->\n let reader = InternalUtilities.createFileReader()\n reader.onload <- fun _ ->\n if reader.readyState = FileReaderState.DONE\n then resolve(unbox reader.result)\n\n reader.readAsText(instance)\n\n[]\ntype ByteArrayExtensions =\n /// Saves the binary content as a file using the provided file name.\n []\n static member SaveFileAs(content: byte[], fileName: string) =\n\n if String.IsNullOrWhiteSpace(fileName) then\n ()\n else\n let mimeType = \"application/octet-stream\"\n let binaryData = InternalUtilities.toUInt8Array content\n let blob = InternalUtilities.createBlobFromBytesAndMimeType binaryData mimeType\n let dataUrl = InternalUtilities.createObjectUrl blob\n let anchor = (Browser.Dom.document.createElement \"a\")\n anchor?style <- \"display: none\"\n anchor?href <- dataUrl\n anchor?download <- fileName\n anchor?rel <- \"noopener\"\n anchor.click()\n // clean up\n anchor.remove()\n // clean up the created object url because it is being kept in memory\n Browser.Dom.window.setTimeout(unbox(fun () -> InternalUtilities.revokeObjectUrl(dataUrl)), 40 * 1000)\n |> ignore\n\n /// Saves the binary content as a file using the provided file name.\n []\n static member SaveFileAs(content: byte[], fileName: string, mimeType: string) =\n\n if String.IsNullOrWhiteSpace(fileName) then\n ()\n else\n let binaryData = InternalUtilities.toUInt8Array content\n let blob = InternalUtilities.createBlobFromBytesAndMimeType binaryData mimeType\n let dataUrl = InternalUtilities.createObjectUrl blob\n let anchor = Browser.Dom.document.createElement \"a\"\n anchor?style <- \"display: none\"\n anchor?href <- dataUrl\n anchor?download <- fileName\n anchor?rel <- \"noopener\"\n anchor.click()\n // clean up element\n anchor.remove()\n // clean up the created object url because it is being kept in memory\n Browser.Dom.window.setTimeout(unbox(fun () -> InternalUtilities.revokeObjectUrl(dataUrl)), 40 * 1000)\n |> ignore\n\n \n /// Converts the binary content into a data url by first converting it to a Blob of type \"application/octet-stream\" and reading it as a data url.\n []\n static member AsDataUrl(content: byte[]) : string =\n let binaryData = InternalUtilities.toUInt8Array content\n let blob = InternalUtilities.createBlobFromBytesAndMimeType binaryData \"application/octet-stream\"\n let dataUrl = InternalUtilities.createObjectUrl blob\n dataUrl\n\n /// Converts the binary content into a data url by first converting it to a Blob of the provided mime-type and reading it as a data url.\n []\n static member AsDataUrl(content: byte[], mimeType:string) : string =\n let binaryData = InternalUtilities.toUInt8Array content\n let blob = InternalUtilities.createBlobFromBytesAndMimeType binaryData mimeType\n let dataUrl = InternalUtilities.createObjectUrl blob\n dataUrl","namespace Fable.Remoting.Client\n\nopen System.Threading\nopen Browser\nopen Browser.Types\n\nmodule Http =\n\n /// Constructs default values for HttpRequest\n let private defaultRequestConfig : HttpRequest = {\n HttpMethod = GET\n Url = \"/\"\n Headers = [ ]\n WithCredentials = false\n RequestBody = Empty\n }\n\n /// Creates a GET request to the specified url\n let get (url: string) : HttpRequest =\n { defaultRequestConfig\n with Url = url\n HttpMethod = GET }\n\n /// Creates a POST request to the specified url\n let post (url: string) : HttpRequest =\n { defaultRequestConfig\n with Url = url\n HttpMethod = POST }\n\n /// Creates a request using the given method and url\n let request method url =\n { defaultRequestConfig\n with Url = url\n HttpMethod = method }\n\n /// Appends a request with headers as key-value pairs\n let withHeaders headers (req: HttpRequest) = { req with Headers = headers }\n\n /// Sets the withCredentials option on the XHR request, useful for CORS requests\n let withCredentials withCredentials (req: HttpRequest) =\n { req with WithCredentials = withCredentials }\n\n /// Appends a request with string body content\n let withBody body (req: HttpRequest) = { req with RequestBody = body }\n\n let private sendAndRead (preparation:(XMLHttpRequest -> unit) option) resultMapper (req: HttpRequest) = async {\n let! token = Async.CancellationToken\n let request = Async.FromContinuations <| fun (resolve, _, cancel) ->\n let xhr = XMLHttpRequest.Create()\n\n match req.HttpMethod with\n | GET -> xhr.``open``(\"GET\", req.Url)\n | POST -> xhr.``open``(\"POST\", req.Url)\n\n match preparation with\n | Some f -> f xhr\n | _ -> ignore()\n\n let cancellationTokenRegistration =\n token.Register(fun _ ->\n xhr.abort()\n cancel(System.OperationCanceledException(token))\n )\n\n // set the headers, must be after opening the request\n for (key, value) in req.Headers do\n xhr.setRequestHeader(key, value)\n\n xhr.withCredentials <- req.WithCredentials\n\n xhr.onreadystatechange <- fun _ ->\n match xhr.readyState with\n | ReadyState.Done when not token.IsCancellationRequested ->\n (cancellationTokenRegistration :> System.IDisposable).Dispose()\n xhr |> resultMapper |> resolve\n | _ -> ignore()\n\n match req.RequestBody with\n | Empty -> xhr.send()\n | RequestBody.Json content -> xhr.send(content)\n | Binary content -> xhr.send(InternalUtilities.toUInt8Array content)\n\n return! request\n }\n\n /// Sends the request to the server and asynchronously returns a response\n let send = sendAndRead None (fun xhr -> { StatusCode = unbox xhr.status; ResponseBody = xhr.responseText })\n\n /// Sends the request to the server and asynchronously returns the response as byte array\n let sendAndReadBinary =\n sendAndRead\n (Some (fun xhr -> xhr.responseType <- \"arraybuffer\" )) // read response as byte array\n (fun xhr ->\n let bytes = InternalUtilities.createUInt8Array xhr.response\n (bytes, xhr.status))\n\n","\"use strict\";\r\n\r\nexport function Parsimmon(action) {\r\n if (!(this instanceof Parsimmon)) {\r\n return new Parsimmon(action);\r\n }\r\n this._ = action;\r\n}\r\n\r\nvar _ = Parsimmon.prototype;\r\n\r\nexport function times(n, f) {\r\n var i = 0;\r\n for (i; i < n; i++) {\r\n f(i);\r\n }\r\n}\r\n\r\nexport function forEach(f, arr) {\r\n times(arr.length, function(i) {\r\n f(arr[i], i, arr);\r\n });\r\n}\r\n\r\nexport function reduce(f, seed, arr) {\r\n forEach(function(elem, i, arr) {\r\n seed = f(seed, elem, i, arr);\r\n }, arr);\r\n return seed;\r\n}\r\n\r\nexport function map(f, arr) {\r\n return reduce(\r\n function(acc, elem, i, a) {\r\n return acc.concat([f(elem, i, a)]);\r\n },\r\n [],\r\n arr\r\n );\r\n}\r\n\r\nexport function lshiftBuffer(input) {\r\n var asTwoBytes = reduce(\r\n function(a, v, i, b) {\r\n return a.concat(\r\n i === b.length - 1\r\n ? Buffer.from([v, 0]).readUInt16BE(0)\r\n : b.readUInt16BE(i)\r\n );\r\n },\r\n [],\r\n input\r\n );\r\n return Buffer.from(\r\n map(function(x) {\r\n return ((x << 1) & 0xffff) >> 8;\r\n }, asTwoBytes)\r\n );\r\n}\r\n\r\nfunction consumeBitsFromBuffer(n, input) {\r\n var state = { v: 0, buf: input };\r\n times(n, function() {\r\n state = {\r\n v: (state.v << 1) | bitPeekBuffer(state.buf),\r\n buf: lshiftBuffer(state.buf)\r\n };\r\n });\r\n return state;\r\n}\r\n\r\nfunction bitPeekBuffer(input) {\r\n return input[0] >> 7;\r\n}\r\n\r\nexport function sum(numArr) {\r\n return reduce(\r\n function(x, y) {\r\n return x + y;\r\n },\r\n 0,\r\n numArr\r\n );\r\n}\r\n\r\nexport function find(pred, arr) {\r\n return reduce(\r\n function(found, elem) {\r\n return found || (pred(elem) ? elem : found);\r\n },\r\n null,\r\n arr\r\n );\r\n}\r\n\r\nfunction bufferExists() {\r\n return typeof Buffer !== \"undefined\";\r\n}\r\n\r\nfunction ensureBuffer() {\r\n if (!bufferExists()) {\r\n throw new Error(\r\n \"Buffer global does not exist; please consider using https://github.com/feross/buffer if you are running Parsimmon in a browser.\"\r\n );\r\n }\r\n}\r\n\r\nfunction bitSeq(alignments) {\r\n ensureBuffer();\r\n var totalBits = sum(alignments);\r\n if (totalBits % 8 !== 0) {\r\n throw new Error(\r\n \"The bits [\" +\r\n alignments.join(\", \") +\r\n \"] add up to \" +\r\n totalBits +\r\n \" which is not an even number of bytes; the total should be divisible by 8\"\r\n );\r\n }\r\n var bytes = totalBits / 8;\r\n\r\n var tooBigRange = find(function(x) {\r\n return x > 48;\r\n }, alignments);\r\n if (tooBigRange) {\r\n throw new Error(\r\n tooBigRange + \" bit range requested exceeds 48 bit (6 byte) Number max.\"\r\n );\r\n }\r\n\r\n return new Parsimmon(function(input, i) {\r\n var newPos = bytes + i;\r\n if (newPos > input.length) {\r\n return makeFailure(i, bytes.toString() + \" bytes\");\r\n }\r\n return makeSuccess(\r\n newPos,\r\n reduce(\r\n function(acc, bits) {\r\n var state = consumeBitsFromBuffer(bits, acc.buf);\r\n return {\r\n coll: acc.coll.concat(state.v),\r\n buf: state.buf\r\n };\r\n },\r\n { coll: [], buf: input.slice(i, newPos) },\r\n alignments\r\n ).coll\r\n );\r\n });\r\n}\r\n\r\nfunction bitSeqObj(namedAlignments) {\r\n ensureBuffer();\r\n var seenKeys = {};\r\n var totalKeys = 0;\r\n var fullAlignments = map(function(item) {\r\n if (isArray(item)) {\r\n var pair = item;\r\n if (pair.length !== 2) {\r\n throw new Error(\r\n \"[\" +\r\n pair.join(\", \") +\r\n \"] should be length 2, got length \" +\r\n pair.length\r\n );\r\n }\r\n assertString(pair[0]);\r\n assertNumber(pair[1]);\r\n if (Object.prototype.hasOwnProperty.call(seenKeys, pair[0])) {\r\n throw new Error(\"duplicate key in bitSeqObj: \" + pair[0]);\r\n }\r\n seenKeys[pair[0]] = true;\r\n totalKeys++;\r\n return pair;\r\n } else {\r\n assertNumber(item);\r\n return [null, item];\r\n }\r\n }, namedAlignments);\r\n if (totalKeys < 1) {\r\n throw new Error(\r\n \"bitSeqObj expects at least one named pair, got [\" +\r\n namedAlignments.join(\", \") +\r\n \"]\"\r\n );\r\n }\r\n var namesOnly = map(function(pair) {\r\n return pair[0];\r\n }, fullAlignments);\r\n var alignmentsOnly = map(function(pair) {\r\n return pair[1];\r\n }, fullAlignments);\r\n\r\n return bitSeq(alignmentsOnly).map(function(parsed) {\r\n var namedParsed = map(function(name, i) {\r\n return [name, parsed[i]];\r\n }, namesOnly);\r\n\r\n return reduce(\r\n function(obj, kv) {\r\n if (kv[0] !== null) {\r\n obj[kv[0]] = kv[1];\r\n }\r\n return obj;\r\n },\r\n {},\r\n namedParsed\r\n );\r\n });\r\n}\r\n\r\nfunction parseBufferFor(other, length) {\r\n ensureBuffer();\r\n return new Parsimmon(function(input, i) {\r\n if (i + length > input.length) {\r\n return makeFailure(i, length + \" bytes for \" + other);\r\n }\r\n return makeSuccess(i + length, input.slice(i, i + length));\r\n });\r\n}\r\n\r\nfunction parseBuffer(length) {\r\n return parseBufferFor(\"buffer\", length).map(function(unsafe) {\r\n return Buffer.from(unsafe);\r\n });\r\n}\r\n\r\nfunction encodedString(encoding, length) {\r\n return parseBufferFor(\"string\", length).map(function(buff) {\r\n return buff.toString(encoding);\r\n });\r\n}\r\n\r\nfunction isInteger(value) {\r\n return typeof value === \"number\" && Math.floor(value) === value;\r\n}\r\n\r\nfunction assertValidIntegerByteLengthFor(who, length) {\r\n if (!isInteger(length) || length < 0 || length > 6) {\r\n throw new Error(who + \" requires integer length in range [0, 6].\");\r\n }\r\n}\r\n\r\nfunction uintBE(length) {\r\n assertValidIntegerByteLengthFor(\"uintBE\", length);\r\n return parseBufferFor(\"uintBE(\" + length + \")\", length).map(function(buff) {\r\n return buff.readUIntBE(0, length);\r\n });\r\n}\r\n\r\nfunction uintLE(length) {\r\n assertValidIntegerByteLengthFor(\"uintLE\", length);\r\n return parseBufferFor(\"uintLE(\" + length + \")\", length).map(function(buff) {\r\n return buff.readUIntLE(0, length);\r\n });\r\n}\r\n\r\nfunction intBE(length) {\r\n assertValidIntegerByteLengthFor(\"intBE\", length);\r\n return parseBufferFor(\"intBE(\" + length + \")\", length).map(function(buff) {\r\n return buff.readIntBE(0, length);\r\n });\r\n}\r\n\r\nfunction intLE(length) {\r\n assertValidIntegerByteLengthFor(\"intLE\", length);\r\n return parseBufferFor(\"intLE(\" + length + \")\", length).map(function(buff) {\r\n return buff.readIntLE(0, length);\r\n });\r\n}\r\n\r\nfunction floatBE() {\r\n return parseBufferFor(\"floatBE\", 4).map(function(buff) {\r\n return buff.readFloatBE(0);\r\n });\r\n}\r\n\r\nfunction floatLE() {\r\n return parseBufferFor(\"floatLE\", 4).map(function(buff) {\r\n return buff.readFloatLE(0);\r\n });\r\n}\r\n\r\nfunction doubleBE() {\r\n return parseBufferFor(\"doubleBE\", 8).map(function(buff) {\r\n return buff.readDoubleBE(0);\r\n });\r\n}\r\n\r\nfunction doubleLE() {\r\n return parseBufferFor(\"doubleLE\", 8).map(function(buff) {\r\n return buff.readDoubleLE(0);\r\n });\r\n}\r\n\r\nfunction toArray(arrLike) {\r\n return Array.prototype.slice.call(arrLike);\r\n}\r\n// -*- Helpers -*-\r\n\r\nfunction isParser(obj) {\r\n return obj instanceof Parsimmon;\r\n}\r\n\r\nfunction isArray(x) {\r\n return {}.toString.call(x) === \"[object Array]\";\r\n}\r\n\r\nfunction isBuffer(x) {\r\n /* global Buffer */\r\n return bufferExists() && Buffer.isBuffer(x);\r\n}\r\n\r\nexport function makeSuccess(index, value) {\r\n return {\r\n status: true,\r\n index: index,\r\n value: value,\r\n furthest: -1,\r\n expected: []\r\n };\r\n}\r\n\r\nexport function makeFailure(index, expected) {\r\n if (!isArray(expected)) {\r\n expected = [expected];\r\n }\r\n return {\r\n status: false,\r\n index: -1,\r\n value: null,\r\n furthest: index,\r\n expected: expected\r\n };\r\n}\r\n\r\nfunction mergeReplies(result, last) {\r\n if (!last) {\r\n return result;\r\n }\r\n if (result.furthest > last.furthest) {\r\n return result;\r\n }\r\n var expected =\r\n result.furthest === last.furthest\r\n ? union(result.expected, last.expected)\r\n : last.expected;\r\n return {\r\n status: result.status,\r\n index: result.index,\r\n value: result.value,\r\n furthest: last.furthest,\r\n expected: expected\r\n };\r\n}\r\n\r\nfunction makeLineColumnIndex(input, i) {\r\n if (isBuffer(input)) {\r\n return {\r\n offset: i,\r\n line: -1,\r\n column: -1\r\n };\r\n }\r\n var lines = input.slice(0, i).split(\"\\n\");\r\n // Note that unlike the character offset, the line and column offsets are\r\n // 1-based.\r\n var lineWeAreUpTo = lines.length;\r\n var columnWeAreUpTo = lines[lines.length - 1].length + 1;\r\n return {\r\n offset: i,\r\n line: lineWeAreUpTo,\r\n column: columnWeAreUpTo\r\n };\r\n}\r\n\r\n// Returns the sorted set union of two arrays of strings\r\nfunction union(xs, ys) {\r\n var obj = {};\r\n for (var i = 0; i < xs.length; i++) {\r\n obj[xs[i]] = true;\r\n }\r\n for (var j = 0; j < ys.length; j++) {\r\n obj[ys[j]] = true;\r\n }\r\n var keys = [];\r\n for (var k in obj) {\r\n if ({}.hasOwnProperty.call(obj, k)) {\r\n keys.push(k);\r\n }\r\n }\r\n keys.sort();\r\n return keys;\r\n}\r\n\r\nfunction assertParser(p) {\r\n if (!isParser(p)) {\r\n throw new Error(\"not a parser: \" + p);\r\n }\r\n}\r\n\r\nfunction get(input, i) {\r\n if (typeof input === \"string\") {\r\n return input.charAt(i);\r\n }\r\n return input[i];\r\n}\r\n\r\n// TODO[ES5]: Switch to Array.isArray eventually.\r\nfunction assertArray(x) {\r\n if (!isArray(x)) {\r\n throw new Error(\"not an array: \" + x);\r\n }\r\n}\r\n\r\nfunction assertNumber(x) {\r\n if (typeof x !== \"number\") {\r\n throw new Error(\"not a number: \" + x);\r\n }\r\n}\r\n\r\nfunction assertRegexp(x) {\r\n if (!(x instanceof RegExp)) {\r\n throw new Error(\"not a regexp: \" + x);\r\n }\r\n var f = flags(x);\r\n for (var i = 0; i < f.length; i++) {\r\n var c = f.charAt(i);\r\n // Only allow regexp flags [imu] for now, since [g] and [y] specifically\r\n // mess up Parsimmon. If more non-stateful regexp flags are added in the\r\n // future, this will need to be revisited.\r\n if (c !== \"i\" && c !== \"m\" && c !== \"u\") {\r\n throw new Error('unsupported regexp flag \"' + c + '\": ' + x);\r\n }\r\n }\r\n}\r\n\r\nfunction assertFunction(x) {\r\n if (typeof x !== \"function\") {\r\n throw new Error(\"not a function: \" + x);\r\n }\r\n}\r\n\r\nfunction assertString(x) {\r\n if (typeof x !== \"string\") {\r\n throw new Error(\"not a string: \" + x);\r\n }\r\n}\r\n\r\n// -*- Error Formatting -*-\r\n\r\nvar linesBeforeStringError = 2;\r\nvar linesAfterStringError = 3;\r\nvar bytesPerLine = 8;\r\nvar bytesBefore = bytesPerLine * 5;\r\nvar bytesAfter = bytesPerLine * 4;\r\nvar defaultLinePrefix = \" \";\r\n\r\nexport function repeat(string, amount) {\r\n return new Array(amount + 1).join(string);\r\n}\r\n\r\nexport function formatExpected(expected) {\r\n if (expected.length === 1) {\r\n return \"Expected:\\n\\n\" + expected[0];\r\n }\r\n return \"Expected one of the following: \\n\\n\" + expected.join(\", \");\r\n}\r\n\r\nexport function leftPad(str, pad, char) {\r\n var add = pad - str.length;\r\n if (add <= 0) {\r\n return str;\r\n }\r\n return repeat(char, add) + str;\r\n}\r\n\r\nfunction toChunks(arr, chunkSize) {\r\n var length = arr.length;\r\n var chunks = [];\r\n var chunkIndex = 0;\r\n\r\n if (length <= chunkSize) {\r\n return [arr.slice()];\r\n }\r\n\r\n for (var i = 0; i < length; i++) {\r\n if (!chunks[chunkIndex]) {\r\n chunks.push([]);\r\n }\r\n\r\n chunks[chunkIndex].push(arr[i]);\r\n\r\n if ((i + 1) % chunkSize === 0) {\r\n chunkIndex++;\r\n }\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\n// Get a range of indexes including `i`-th element and `before` and `after` amount of elements from `arr`.\r\nexport function rangeFromIndexAndOffsets(i, before, after, length) {\r\n return {\r\n // Guard against the negative upper bound for lines included in the output.\r\n from: i - before > 0 ? i - before : 0,\r\n to: i + after > length ? length : i + after\r\n };\r\n}\r\n\r\nexport function byteRangeToRange(byteRange) {\r\n // Exception for inputs smaller than `bytesPerLine`\r\n if (byteRange.from === 0 && byteRange.to === 1) {\r\n return {\r\n from: byteRange.from,\r\n to: byteRange.to\r\n };\r\n }\r\n\r\n return {\r\n from: byteRange.from / bytesPerLine,\r\n // Round `to`, so we don't get float if the amount of bytes is not divisible by `bytesPerLine`\r\n to: Math.floor(byteRange.to / bytesPerLine)\r\n };\r\n}\r\n\r\nexport function formatGot(input, error) {\r\n var index = error.index;\r\n var i = index.offset;\r\n\r\n var verticalMarkerLength = 1;\r\n var column;\r\n var lineWithErrorIndex;\r\n var lines;\r\n var lineRange;\r\n var lastLineNumberLabelLength;\r\n\r\n if (i === input.length) {\r\n return \"Got the end of the input\";\r\n }\r\n\r\n if (isBuffer(input)) {\r\n var byteLineWithErrorIndex = i - (i % bytesPerLine);\r\n var columnByteIndex = i - byteLineWithErrorIndex;\r\n var byteRange = rangeFromIndexAndOffsets(\r\n byteLineWithErrorIndex,\r\n bytesBefore,\r\n bytesAfter + bytesPerLine,\r\n input.length\r\n );\r\n var bytes = input.slice(byteRange.from, byteRange.to);\r\n var bytesInChunks = toChunks(bytes.toJSON().data, bytesPerLine);\r\n\r\n var byteLines = map(function(byteRow) {\r\n return map(function(byteValue) {\r\n // Prefix byte values with a `0` if they are shorter than 2 characters.\r\n return leftPad(byteValue.toString(16), 2, \"0\");\r\n }, byteRow);\r\n }, bytesInChunks);\r\n\r\n lineRange = byteRangeToRange(byteRange);\r\n lineWithErrorIndex = byteLineWithErrorIndex / bytesPerLine;\r\n column = columnByteIndex * 3;\r\n\r\n // Account for an extra space.\r\n if (columnByteIndex >= 4) {\r\n column += 1;\r\n }\r\n\r\n verticalMarkerLength = 2;\r\n lines = map(function(byteLine) {\r\n return byteLine.length <= 4\r\n ? byteLine.join(\" \")\r\n : byteLine.slice(0, 4).join(\" \") + \" \" + byteLine.slice(4).join(\" \");\r\n }, byteLines);\r\n lastLineNumberLabelLength = (\r\n (lineRange.to > 0 ? lineRange.to - 1 : lineRange.to) * 8\r\n ).toString(16).length;\r\n\r\n if (lastLineNumberLabelLength < 2) {\r\n lastLineNumberLabelLength = 2;\r\n }\r\n } else {\r\n var inputLines = input.split(/\\r\\n|[\\n\\r\\u2028\\u2029]/);\r\n column = index.column - 1;\r\n lineWithErrorIndex = index.line - 1;\r\n lineRange = rangeFromIndexAndOffsets(\r\n lineWithErrorIndex,\r\n linesBeforeStringError,\r\n linesAfterStringError,\r\n inputLines.length\r\n );\r\n\r\n lines = inputLines.slice(lineRange.from, lineRange.to);\r\n lastLineNumberLabelLength = lineRange.to.toString().length;\r\n }\r\n\r\n var lineWithErrorCurrentIndex = lineWithErrorIndex - lineRange.from;\r\n\r\n if (isBuffer(input)) {\r\n lastLineNumberLabelLength = (\r\n (lineRange.to > 0 ? lineRange.to - 1 : lineRange.to) * 8\r\n ).toString(16).length;\r\n\r\n if (lastLineNumberLabelLength < 2) {\r\n lastLineNumberLabelLength = 2;\r\n }\r\n }\r\n\r\n var linesWithLineNumbers = reduce(\r\n function(acc, lineSource, index) {\r\n var isLineWithError = index === lineWithErrorCurrentIndex;\r\n var prefix = isLineWithError ? \"> \" : defaultLinePrefix;\r\n var lineNumberLabel;\r\n\r\n if (isBuffer(input)) {\r\n lineNumberLabel = leftPad(\r\n ((lineRange.from + index) * 8).toString(16),\r\n lastLineNumberLabelLength,\r\n \"0\"\r\n );\r\n } else {\r\n lineNumberLabel = leftPad(\r\n (lineRange.from + index + 1).toString(),\r\n lastLineNumberLabelLength,\r\n \" \"\r\n );\r\n }\r\n\r\n return [].concat(\r\n acc,\r\n [prefix + lineNumberLabel + \" | \" + lineSource],\r\n isLineWithError\r\n ? [\r\n defaultLinePrefix +\r\n repeat(\" \", lastLineNumberLabelLength) +\r\n \" | \" +\r\n leftPad(\"\", column, \" \") +\r\n repeat(\"^\", verticalMarkerLength)\r\n ]\r\n : []\r\n );\r\n },\r\n [],\r\n lines\r\n );\r\n\r\n return linesWithLineNumbers.join(\"\\n\");\r\n}\r\n\r\nexport function formatError(input, error) {\r\n return [\r\n \"\\n\",\r\n \"-- PARSING FAILED \" + repeat(\"-\", 50),\r\n \"\\n\\n\",\r\n formatGot(input, error),\r\n \"\\n\\n\",\r\n formatExpected(error.expected),\r\n \"\\n\"\r\n ].join(\"\");\r\n}\r\n\r\nexport function flags(re) {\r\n var s = \"\" + re;\r\n return s.slice(s.lastIndexOf(\"/\") + 1);\r\n}\r\n\r\nexport function anchoredRegexp(re) {\r\n return RegExp(\"^(?:\" + re.source + \")\", flags(re));\r\n}\r\n\r\n// -*- Combinators -*-\r\n\r\nexport function seq() {\r\n var parsers = [].slice.call(arguments);\r\n var numParsers = parsers.length;\r\n for (var j = 0; j < numParsers; j += 1) {\r\n assertParser(parsers[j]);\r\n }\r\n return Parsimmon(function(input, i) {\r\n var result;\r\n var accum = new Array(numParsers);\r\n for (var j = 0; j < numParsers; j += 1) {\r\n result = mergeReplies(parsers[j]._(input, i), result);\r\n if (!result.status) {\r\n return result;\r\n }\r\n accum[j] = result.value;\r\n i = result.index;\r\n }\r\n return mergeReplies(makeSuccess(i, accum), result);\r\n });\r\n}\r\n\r\nexport function seqObj() {\r\n var seenKeys = {};\r\n var totalKeys = 0;\r\n var parsers = toArray(arguments);\r\n var numParsers = parsers.length;\r\n for (var j = 0; j < numParsers; j += 1) {\r\n var p = parsers[j];\r\n if (isParser(p)) {\r\n continue;\r\n }\r\n if (isArray(p)) {\r\n var isWellFormed =\r\n p.length === 2 && typeof p[0] === \"string\" && isParser(p[1]);\r\n if (isWellFormed) {\r\n var key = p[0];\r\n if (Object.prototype.hasOwnProperty.call(seenKeys, key)) {\r\n throw new Error(\"seqObj: duplicate key \" + key);\r\n }\r\n seenKeys[key] = true;\r\n totalKeys++;\r\n continue;\r\n }\r\n }\r\n throw new Error(\r\n \"seqObj arguments must be parsers or [string, parser] array pairs.\"\r\n );\r\n }\r\n if (totalKeys === 0) {\r\n throw new Error(\"seqObj expects at least one named parser, found zero\");\r\n }\r\n return Parsimmon(function(input, i) {\r\n var result;\r\n var accum = {};\r\n for (var j = 0; j < numParsers; j += 1) {\r\n var name;\r\n var parser;\r\n if (isArray(parsers[j])) {\r\n name = parsers[j][0];\r\n parser = parsers[j][1];\r\n } else {\r\n name = null;\r\n parser = parsers[j];\r\n }\r\n result = mergeReplies(parser._(input, i), result);\r\n if (!result.status) {\r\n return result;\r\n }\r\n if (name) {\r\n accum[name] = result.value;\r\n }\r\n i = result.index;\r\n }\r\n return mergeReplies(makeSuccess(i, accum), result);\r\n });\r\n}\r\n\r\nexport function seqMap() {\r\n var args = [].slice.call(arguments);\r\n if (args.length === 0) {\r\n throw new Error(\"seqMap needs at least one argument\");\r\n }\r\n var mapper = args.pop();\r\n assertFunction(mapper);\r\n return seq.apply(null, args).map(function(results) {\r\n return mapper.apply(null, results);\r\n });\r\n}\r\n\r\n// TODO[ES5]: Revisit this with Object.keys and .bind.\r\nexport function createLanguage(parsers) {\r\n var language = {};\r\n for (var key in parsers) {\r\n if ({}.hasOwnProperty.call(parsers, key)) {\r\n (function(key) {\r\n var func = function() {\r\n return parsers[key](language);\r\n };\r\n language[key] = lazy(func);\r\n })(key);\r\n }\r\n }\r\n return language;\r\n}\r\n\r\nexport function alt() {\r\n var parsers = [].slice.call(arguments);\r\n var numParsers = parsers.length;\r\n if (numParsers === 0) {\r\n return fail(\"zero alternates\");\r\n }\r\n for (var j = 0; j < numParsers; j += 1) {\r\n assertParser(parsers[j]);\r\n }\r\n return Parsimmon(function(input, i) {\r\n var result;\r\n for (var j = 0; j < parsers.length; j += 1) {\r\n result = mergeReplies(parsers[j]._(input, i), result);\r\n if (result.status) {\r\n return result;\r\n }\r\n }\r\n return result;\r\n });\r\n}\r\n\r\nexport function sepBy(parser, separator) {\r\n // Argument asserted by sepBy1\r\n return sepBy1(parser, separator).or(succeed([]));\r\n}\r\n\r\nexport function sepBy1(parser, separator) {\r\n assertParser(parser);\r\n assertParser(separator);\r\n var pairs = separator.then(parser).many();\r\n return seqMap(parser, pairs, function(r, rs) {\r\n return [r].concat(rs);\r\n });\r\n}\r\n\r\n// -*- Core Parsing Methods -*-\r\n\r\n_.parse = function(input) {\r\n if (typeof input !== \"string\" && !isBuffer(input)) {\r\n throw new Error(\r\n \".parse must be called with a string or Buffer as its argument\"\r\n );\r\n }\r\n var result = this.skip(eof)._(input, 0);\r\n if (result.status) {\r\n return {\r\n status: true,\r\n value: result.value\r\n };\r\n }\r\n return {\r\n status: false,\r\n index: makeLineColumnIndex(input, result.furthest),\r\n expected: result.expected\r\n };\r\n};\r\n\r\n// -*- Other Methods -*-\r\n\r\n_.tryParse = function(str) {\r\n var result = this.parse(str);\r\n if (result.status) {\r\n return result.value;\r\n } else {\r\n var msg = formatError(str, result);\r\n var err = new Error(msg);\r\n err.type = \"ParsimmonError\";\r\n err.result = result;\r\n throw err;\r\n }\r\n};\r\n\r\n_.or = function(alternative) {\r\n return alt(this, alternative);\r\n};\r\n\r\n_.trim = function(parser) {\r\n return this.wrap(parser, parser);\r\n};\r\n\r\n_.wrap = function(leftParser, rightParser) {\r\n return seqMap(leftParser, this, rightParser, function(left, middle) {\r\n return middle;\r\n });\r\n};\r\n\r\n_.thru = function(wrapper) {\r\n return wrapper(this);\r\n};\r\n\r\n_.then = function(next) {\r\n assertParser(next);\r\n return seq(this, next).map(function(results) {\r\n return results[1];\r\n });\r\n};\r\n\r\n_.many = function() {\r\n var self = this;\r\n\r\n return Parsimmon(function(input, i) {\r\n var accum = [];\r\n var result = undefined;\r\n\r\n for (;;) {\r\n result = mergeReplies(self._(input, i), result);\r\n if (result.status) {\r\n if (i === result.index) {\r\n throw new Error(\r\n \"infinite loop detected in .many() parser --- calling .many() on \" +\r\n \"a parser which can accept zero characters is usually the cause\"\r\n );\r\n }\r\n i = result.index;\r\n accum.push(result.value);\r\n } else {\r\n return mergeReplies(makeSuccess(i, accum), result);\r\n }\r\n }\r\n });\r\n};\r\n\r\n_.tieWith = function(separator) {\r\n assertString(separator);\r\n return this.map(function(args) {\r\n assertArray(args);\r\n if (args.length) {\r\n assertString(args[0]);\r\n var s = args[0];\r\n for (var i = 1; i < args.length; i++) {\r\n assertString(args[i]);\r\n s += separator + args[i];\r\n }\r\n return s;\r\n } else {\r\n return \"\";\r\n }\r\n });\r\n};\r\n\r\n_.tie = function() {\r\n return this.tieWith(\"\");\r\n};\r\n\r\n_.times = function(min, max) {\r\n var self = this;\r\n if (arguments.length < 2) {\r\n max = min;\r\n }\r\n assertNumber(min);\r\n assertNumber(max);\r\n return Parsimmon(function(input, i) {\r\n var accum = [];\r\n var result = undefined;\r\n var prevResult = undefined;\r\n for (var times = 0; times < min; times += 1) {\r\n result = self._(input, i);\r\n prevResult = mergeReplies(result, prevResult);\r\n if (result.status) {\r\n i = result.index;\r\n accum.push(result.value);\r\n } else {\r\n return prevResult;\r\n }\r\n }\r\n for (; times < max; times += 1) {\r\n result = self._(input, i);\r\n prevResult = mergeReplies(result, prevResult);\r\n if (result.status) {\r\n i = result.index;\r\n accum.push(result.value);\r\n } else {\r\n break;\r\n }\r\n }\r\n return mergeReplies(makeSuccess(i, accum), prevResult);\r\n });\r\n};\r\n\r\n_.result = function(res) {\r\n return this.map(function() {\r\n return res;\r\n });\r\n};\r\n\r\n_.atMost = function(n) {\r\n return this.times(0, n);\r\n};\r\n\r\n_.atLeast = function(n) {\r\n return seqMap(this.times(n), this.many(), function(init, rest) {\r\n return init.concat(rest);\r\n });\r\n};\r\n\r\n_.map = function(fn) {\r\n assertFunction(fn);\r\n var self = this;\r\n return Parsimmon(function(input, i) {\r\n var result = self._(input, i);\r\n if (!result.status) {\r\n return result;\r\n }\r\n return mergeReplies(makeSuccess(result.index, fn(result.value)), result);\r\n });\r\n};\r\n\r\n_.contramap = function(fn) {\r\n assertFunction(fn);\r\n var self = this;\r\n return Parsimmon(function(input, i) {\r\n var result = self.parse(fn(input.slice(i)));\r\n if (!result.status) {\r\n return result;\r\n }\r\n return makeSuccess(i + input.length, result.value);\r\n });\r\n};\r\n\r\n_.promap = function(f, g) {\r\n assertFunction(f);\r\n assertFunction(g);\r\n return this.contramap(f).map(g);\r\n};\r\n\r\n_.skip = function(next) {\r\n return seq(this, next).map(function(results) {\r\n return results[0];\r\n });\r\n};\r\n\r\n_.mark = function() {\r\n return seqMap(index, this, index, function(start, value, end) {\r\n return {\r\n start: start,\r\n value: value,\r\n end: end\r\n };\r\n });\r\n};\r\n\r\n_.node = function(name) {\r\n return seqMap(index, this, index, function(start, value, end) {\r\n return {\r\n name: name,\r\n value: value,\r\n start: start,\r\n end: end\r\n };\r\n });\r\n};\r\n\r\n_.sepBy = function(separator) {\r\n return sepBy(this, separator);\r\n};\r\n\r\n_.sepBy1 = function(separator) {\r\n return sepBy1(this, separator);\r\n};\r\n\r\n_.lookahead = function(x) {\r\n return this.skip(lookahead(x));\r\n};\r\n\r\n_.notFollowedBy = function(x) {\r\n return this.skip(notFollowedBy(x));\r\n};\r\n\r\n_.desc = function(expected) {\r\n if (!isArray(expected)) {\r\n expected = [expected];\r\n }\r\n var self = this;\r\n return Parsimmon(function(input, i) {\r\n var reply = self._(input, i);\r\n if (!reply.status) {\r\n reply.expected = expected;\r\n }\r\n return reply;\r\n });\r\n};\r\n\r\n_.fallback = function(result) {\r\n return this.or(succeed(result));\r\n};\r\n\r\n_.ap = function(other) {\r\n return seqMap(other, this, function(f, x) {\r\n return f(x);\r\n });\r\n};\r\n\r\n_.chain = function(f) {\r\n var self = this;\r\n return Parsimmon(function(input, i) {\r\n var result = self._(input, i);\r\n if (!result.status) {\r\n return result;\r\n }\r\n var nextParser = f(result.value);\r\n return mergeReplies(nextParser._(input, result.index), result);\r\n });\r\n};\r\n\r\n// -*- Constructors -*-\r\n\r\nexport function string(str) {\r\n assertString(str);\r\n var expected = \"'\" + str + \"'\";\r\n return Parsimmon(function(input, i) {\r\n var j = i + str.length;\r\n var head = input.slice(i, j);\r\n if (head === str) {\r\n return makeSuccess(j, head);\r\n } else {\r\n return makeFailure(i, expected);\r\n }\r\n });\r\n}\r\n\r\nexport function byte(b) {\r\n ensureBuffer();\r\n assertNumber(b);\r\n if (b > 0xff) {\r\n throw new Error(\r\n \"Value specified to byte constructor (\" +\r\n b +\r\n \"=0x\" +\r\n b.toString(16) +\r\n \") is larger in value than a single byte.\"\r\n );\r\n }\r\n var expected = (b > 0xf ? \"0x\" : \"0x0\") + b.toString(16);\r\n return Parsimmon(function(input, i) {\r\n var head = get(input, i);\r\n if (head === b) {\r\n return makeSuccess(i + 1, head);\r\n } else {\r\n return makeFailure(i, expected);\r\n }\r\n });\r\n}\r\n\r\nexport function regexp(re, group) {\r\n assertRegexp(re);\r\n if (arguments.length >= 2) {\r\n assertNumber(group);\r\n } else {\r\n group = 0;\r\n }\r\n var anchored = anchoredRegexp(re);\r\n var expected = \"\" + re;\r\n return Parsimmon(function(input, i) {\r\n var match = anchored.exec(input.slice(i));\r\n if (match) {\r\n if (0 <= group && group <= match.length) {\r\n var fullMatch = match[0];\r\n var groupMatch = match[group];\r\n return makeSuccess(i + fullMatch.length, groupMatch);\r\n }\r\n var message =\r\n \"valid match group (0 to \" + match.length + \") in \" + expected;\r\n return makeFailure(i, message);\r\n }\r\n return makeFailure(i, expected);\r\n });\r\n}\r\n\r\nexport function succeed(value) {\r\n return Parsimmon(function(input, i) {\r\n return makeSuccess(i, value);\r\n });\r\n}\r\n\r\nexport function fail(expected) {\r\n return Parsimmon(function(input, i) {\r\n return makeFailure(i, expected);\r\n });\r\n}\r\n\r\nexport function lookahead(x) {\r\n if (isParser(x)) {\r\n return Parsimmon(function(input, i) {\r\n var result = x._(input, i);\r\n result.index = i;\r\n result.value = \"\";\r\n return result;\r\n });\r\n } else if (typeof x === \"string\") {\r\n return lookahead(string(x));\r\n } else if (x instanceof RegExp) {\r\n return lookahead(regexp(x));\r\n }\r\n throw new Error(\"not a string, regexp, or parser: \" + x);\r\n}\r\n\r\nexport function notFollowedBy(parser) {\r\n assertParser(parser);\r\n return Parsimmon(function(input, i) {\r\n var result = parser._(input, i);\r\n var text = input.slice(i, result.index);\r\n return result.status\r\n ? makeFailure(i, 'not \"' + text + '\"')\r\n : makeSuccess(i, null);\r\n });\r\n}\r\n\r\nexport function test(predicate) {\r\n assertFunction(predicate);\r\n return Parsimmon(function(input, i) {\r\n var char = get(input, i);\r\n if (i < input.length && predicate(char)) {\r\n return makeSuccess(i + 1, char);\r\n } else {\r\n return makeFailure(i, \"a character/byte matching \" + predicate);\r\n }\r\n });\r\n}\r\n\r\nexport function oneOf(str) {\r\n var expected = str.split(\"\");\r\n for (var idx = 0; idx < expected.length; idx++) {\r\n expected[idx] = \"'\" + expected[idx] + \"'\";\r\n }\r\n return test(function(ch) {\r\n return str.indexOf(ch) >= 0;\r\n }).desc(expected);\r\n}\r\n\r\nexport function noneOf(str) {\r\n return test(function(ch) {\r\n return str.indexOf(ch) < 0;\r\n }).desc(\"none of '\" + str + \"'\");\r\n}\r\n\r\nexport function custom(parsingFunction) {\r\n return Parsimmon(parsingFunction(makeSuccess, makeFailure));\r\n}\r\n\r\n// TODO[ES5]: Improve error message using JSON.stringify eventually.\r\nexport function range(begin, end) {\r\n return test(function(ch) {\r\n return begin <= ch && ch <= end;\r\n }).desc(begin + \"-\" + end);\r\n}\r\n\r\nexport function takeWhile(predicate) {\r\n assertFunction(predicate);\r\n\r\n return Parsimmon(function(input, i) {\r\n var j = i;\r\n while (j < input.length && predicate(get(input, j))) {\r\n j++;\r\n }\r\n return makeSuccess(j, input.slice(i, j));\r\n });\r\n}\r\n\r\nexport function lazy(desc, f) {\r\n if (arguments.length < 2) {\r\n f = desc;\r\n desc = undefined;\r\n }\r\n\r\n var parser = Parsimmon(function(input, i) {\r\n parser._ = f()._;\r\n return parser._(input, i);\r\n });\r\n\r\n if (desc) {\r\n return parser.desc(desc);\r\n } else {\r\n return parser;\r\n }\r\n}\r\n\r\n// -*- Fantasy Land Extras -*-\r\n\r\nfunction empty() {\r\n return fail(\"fantasy-land/empty\");\r\n}\r\n\r\n_.concat = _.or;\r\n_.empty = empty;\r\n_.of = succeed;\r\n_[\"fantasy-land/ap\"] = _.ap;\r\n_[\"fantasy-land/chain\"] = _.chain;\r\n_[\"fantasy-land/concat\"] = _.concat;\r\n_[\"fantasy-land/empty\"] = _.empty;\r\n_[\"fantasy-land/of\"] = _.of;\r\n_[\"fantasy-land/map\"] = _.map;\r\n\r\n// -*- Base Parsers -*-\r\n\r\nexport const index = Parsimmon(function(input, i) {\r\n return makeSuccess(i, makeLineColumnIndex(input, i));\r\n});\r\n\r\nexport const any = Parsimmon(function(input, i) {\r\n if (i >= input.length) {\r\n return makeFailure(i, \"any character/byte\");\r\n }\r\n return makeSuccess(i + 1, get(input, i));\r\n});\r\n\r\nexport const all = Parsimmon(function(input, i) {\r\n return makeSuccess(input.length, input.slice(i));\r\n});\r\n\r\nexport const eof = Parsimmon(function(input, i) {\r\n if (i < input.length) {\r\n return makeFailure(i, \"EOF\");\r\n }\r\n return makeSuccess(i, null);\r\n});\r\n\r\nexport const digit = regexp(/[0-9]/).desc(\"a digit\");\r\nexport const digits = regexp(/[0-9]*/).desc(\"optional digits\");\r\nexport const letter = regexp(/[a-z]/i).desc(\"a letter\");\r\nexport const letters = regexp(/[a-z]*/i).desc(\"optional letters\");\r\nexport const optWhitespace = regexp(/\\s*/).desc(\"optional whitespace\");\r\nexport const whitespace = regexp(/\\s+/).desc(\"whitespace\");\r\nexport const cr = string(\"\\r\");\r\nexport const lf = string(\"\\n\");\r\nexport const crlf = string(\"\\r\\n\");\r\nexport const newline = alt(crlf, lf, cr).desc(\"newline\");\r\nexport const end = alt(newline, eof);","namespace Fable.Parsimmon\r\n\r\nopen Fable.Core\r\nopen Fable.Core.JsInterop\r\n\r\ntype ParseResult<'t> =\r\n abstract status : bool\r\n abstract value : 't\r\n\r\ntype IParserOffSet =\r\n abstract offset : int\r\n abstract line : int\r\n abstract column : int\r\n\r\ntype TokenPosition =\r\n { offset: int\r\n line: int\r\n column: int }\r\n\r\ntype NodeResult<'t> =\r\n { name: string\r\n value: 't\r\n start: TokenPosition\r\n ``end``: TokenPosition }\r\n\r\ntype IParser<'t> =\r\n abstract map<'u> : ('t -> 'u) -> IParser<'u>\r\n abstract parse : string -> ParseResult<'t>\r\n abstract times : int -> IParser<'t []>\r\n abstract times : int * int -> IParser<'t []>\r\n abstract many : unit -> IParser<'t []>\r\n []\r\n abstract chain : IParser<'u> -> IParser<'u>\r\n []\r\n abstract bind : ('t -> IParser<'u>) -> IParser<'u>\r\n abstract skip : IParser<'u> -> IParser<'t>\r\n abstract sepBy : IParser<'u> -> IParser<'t []>\r\n abstract fallback : 't -> IParser<'t>\r\n abstract trim : IParser<'u> -> IParser<'t>\r\n abstract notFollowedBy : IParser<'u> -> IParser<'t>\r\n abstract atMost : int -> IParser<'t[]>\r\n abstract atLeast : int -> IParser<'t[]>\r\n []\r\n abstract orTry : IParser<'t> -> IParser<'t>\r\n abstract sepBy1 : IParser<'u> -> IParser<'t []>\r\n []\r\n abstract node : string -> IParser>\r\n\r\nmodule Parsimmon =\r\n let parseRaw (input: string) (parser: IParser<'t>) =\r\n parser.parse input\r\n\r\n let parse (input: string) (parser: IParser<'t>) =\r\n parser.parse input\r\n |> fun result ->\r\n match result.status with\r\n | true -> Some result.value\r\n | false -> None\r\n\r\n /// A parser that consumes no input and yields an object an object representing the current offset into the parse: it has a 0-based character offset property and 1-based line and column properties\r\n let index : IParser =\r\n import \"index\" \"./Parsimmon.js\"\r\n\r\n /// Returns a new parser which tries parser, and if it fails uses otherParser. Example:\r\n let orTry (otherParser: IParser<'t>) (parser: IParser<'t>) : IParser<'t> =\r\n parser.orTry(otherParser)\r\n\r\n /// Returns a new parser that tries to parse the input exactly `n` times\r\n let times<'t> (n: int) (parser : IParser<'t>) : IParser<'t[]> =\r\n parser.times n\r\n\r\n /// Expects parser at least n times. Yields an array of the results.\r\n let atLeast (n: int) (parser: IParser<'t>) : IParser<'t[]> =\r\n parser.atLeast n\r\n\r\n\r\n /// Expects parser at most n times. Yields an array of the results.\r\n let atMost (n: int) (parser: IParser<'t>) : IParser<'t[]> =\r\n parser.atMost n\r\n\r\n let skip (skipped: IParser<'u>) (keep: IParser<'t>) : IParser<'t> =\r\n keep.skip skipped\r\n\r\n let many (parser : IParser<'t>) : IParser<'t[]> =\r\n parser.many()\r\n\r\n /// Returns a parser that looks for a match to the regexp and yields the entire text matched. The regexp will always match starting at the current parse location.\r\n []\r\n let regex (pattern: string) : IParser = jsNative\r\n /// Returns a parser that looks for a match to the regexp and yields the entire text matched. The regexp will always match starting at the current parse location.\r\n []\r\n let regexGroupNumber (pattern: string) (groupNumber: int): IParser = jsNative\r\n let ofLazy (f: unit -> IParser<'t>) : IParser<'t> =\r\n import \"lazy\" \"./Parsimmon.js\"\r\n\r\n /// This is the same as Parsimmon.sepBy, but matches the parser at least once.\r\n let seperateByAtLeastOne (seperator : IParser<'u>) (parser: IParser<'t>) : IParser<'t[]> =\r\n parser.sepBy1(seperator)\r\n\r\n /// Expects parser \"after\" to follow parser \"before\", and yields the result of \"before\".\r\n let chain (after: IParser<'u>) (before: IParser<'t>) : IParser<'u> =\r\n before.chain after\r\n\r\n /// Returns a new parser which tries parser \"p\", and on success calls the function \"f\" with the result of the parse, which is expected to return another parser, which will be tried next. This allows you to dynamically decide how to continue the parse, which is impossible with the other combinators.\r\n let bind (f: 't -> IParser<'u>) (p: IParser<'t>) : IParser<'u> =\r\n p.bind f\r\n\r\n /// A parser that consumes one letter\r\n let letter : IParser =\r\n import \"letter\" \"./Parsimmon.js\"\r\n\r\n /// Returns a parser that tries `parser` and succeeds if `parser` is able to parse between `min` and `max` times\r\n let timesBetween (min: int) (max: int) (parser: IParser<'u>) =\r\n parser.times(min, max)\r\n\r\n /// A parser that consumes one or more letters\r\n let letters : IParser =\r\n import \"letters\" \"./Parsimmon.js\"\r\n\r\n /// A parser that expects to be at the end of the input (zero characters left).\r\n let endOfFile : IParser =\r\n import \"eof\" \"./Parsimmon.js\"\r\n\r\n /// Returns a parser that looks for anything but whatever \"p\" wants to parse, and does not consume it. Yields the same result as \"before\".\r\n let notFollowedBy (p: IParser<'u>) (before: IParser<'t>) : IParser<'t> =\r\n before.notFollowedBy p\r\n\r\n /// Returns a parser that doesn't consume any input, and yields the given value\r\n let succeed (value: 't) : IParser<'t> =\r\n import \"succeed\" \"./Parsimmon.js\"\r\n\r\n /// Parses using parser, but does not consume what it parses. Yields an empty string.\r\n let lookahead (parser: IParser<'t>) : IParser =\r\n import \"lookahead\" \"./Parsimmon.js\"\r\n\r\n // A parser that consumes one digit\r\n let digit : IParser =\r\n import \"digit\" \"./Parsimmon.js\"\r\n\r\n // A parser that consumes one or more digits\r\n let digits : IParser =\r\n digit\r\n |> many\r\n\r\n /// Returns a new parser which tries \"parser\" and, if it fails, yields value without consuming any input.\r\n let fallback (value: 't) (parser: IParser<'t>) : IParser<'t> =\r\n parser.fallback value\r\n\r\n let seperateBy (content: IParser<'u>) (others: IParser<'t>) : IParser<'t[]> =\r\n others.sepBy(content)\r\n\r\n let between (left: IParser<'t>) (right: IParser<'u>) (middle: IParser<'v>) =\r\n left\r\n |> chain middle\r\n |> skip right\r\n\r\n /// Transforms the parsed value of the given parser.\r\n let map (f: 't -> 'u) (parser: IParser<'t>) = parser.map f\r\n\r\n /// Alias of Parsimmon.concat\r\n let tie (parser: IParser) : IParser =\r\n map (String.concat \"\") parser\r\n\r\n /// A parser that consumes and yields the next character of the input.\r\n let any : IParser =\r\n import \"any\" \"./Parsimmon.js\"\r\n\r\n /// Accepts any number of parsers, yielding the value of the first one that succeeds, backtracking in between.\r\n let choose (ps: IParser<'t> list) : IParser<'t> =\r\n List.reduce (fun acc parser -> acc.orTry(parser)) ps\r\n\r\n /// A parser that consumes and yields the entire remainder of the input.\r\n let all : IParser =\r\n import \"all\" \"./Parsimmon.js\"\r\n\r\n /// Returns a failing parser with the given message.\r\n let fail (input: string) : IParser =\r\n import \"fail\" \"./Parsimmon.js\"\r\n\r\n /// Returns a parser that yield a single character if it passes the predicate function.\r\n let satisfy (f: string -> bool) : IParser =\r\n import \"test\" \"./Parsimmon.js\"\r\n\r\n /// Returns a parser yield a string containing all the next characters that pass the predicate \"f\"\r\n let takeWhile (f: string -> bool) : IParser =\r\n import \"takeWhile\" \"./Parsimmon.js\"\r\n\r\n /// Returns a parser that can only parse the exact given input string\r\n let str (input: string) : IParser =\r\n import \"string\" \"./Parsimmon.js\"\r\n\r\n /// Returns a parser that parses any of the characters of the input string\r\n let oneOf (input: string) : IParser =\r\n import \"oneOf\" \"./Parsimmon.js\"\r\n\r\n let whitespace : IParser =\r\n import \"whitespace\" \"./Parsimmon.js\"\r\n\r\n let optionalWhitespace : IParser =\r\n import \"optWhitespace\" \"./Parsimmon.js\"\r\n\r\n /// Returns a parser that succeeds one or more times\r\n let atLeastOneOrMany (parser: IParser<'t>) : IParser<'t[]> =\r\n atLeast 1 parser\r\n\r\n let stringReturn (input: string) (value: 't) : IParser<'t> =\r\n str input\r\n |> map (fun _ -> value)\r\n\r\n /// Returns a parser that parses comsumes any character of a string other than the characters of the input string\r\n let noneOf (input: string) : IParser =\r\n import \"noneOf\" \"./Parsimmon.js\"\r\n\r\n let seq2 (p1: IParser<'t>) (p2:IParser<'u>) : IParser<'t * 'u> =\r\n import \"seq\" \"./Parsimmon.js\"\r\n\r\n let trim (trimmed: IParser<'a>) (p: IParser<'t>) : IParser<'t> =\r\n p.trim trimmed\r\n\r\n /// Equivalent to `parser.map (String.concat \"\")`\r\n let concat (parser: IParser) : IParser =\r\n parser.map (String.concat \"\")\r\n\r\n let seq3 (p1: IParser<'t>)\r\n (p2: IParser<'u>)\r\n (p3:IParser<'v>) : IParser<'t * 'u * 'v> =\r\n import \"seq\" \"./Parsimmon.js\"\r\n\r\n let seq4 (p1: IParser<'t>)\r\n (p2: IParser<'u>)\r\n (p3:IParser<'v>)\r\n (p4:IParser<'w>) : IParser<'t * 'u * 'v * 'w> =\r\n import \"seq\" \"./Parsimmon.js\"\r\n\r\n let seq5 (p1: IParser<'t>)\r\n (p2: IParser<'u>)\r\n (p3: IParser<'v>)\r\n (p4: IParser<'w>)\r\n (p5: IParser<'q>) : IParser<'t * 'u * 'v * 'w * 'q> =\r\n import \"seq\" \"./Parsimmon.js\"\r\n\r\n /// Equivalent to `parser.node(\"description\")`\r\n let node<'t> description (p:IParser<'t>) = p.node(description)","import { FSharpRef } from \"./Types.js\";\nexport function tryParse(str, defValue) {\n // TODO: test if value is valid and in range\n if (str != null && /\\S/.test(str)) {\n const v = +str.replace(\"_\", \"\");\n if (!Number.isNaN(v)) {\n defValue.contents = v;\n return true;\n }\n }\n return false;\n}\nexport function parse(str) {\n const defValue = new FSharpRef(0);\n if (tryParse(str, defValue)) {\n return defValue.contents;\n }\n else {\n throw new Error(\"Input string was not in a correct format.\");\n }\n}\n// JS Number.isFinite function evals false for NaN\nexport function isInfinity(x) {\n return x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY;\n}\n","import { record_type, bool_type, list_type, option_type, class_type } from \"./Reflection.js\";\nimport { some, value as value_1 } from \"./Option.js\";\nimport { singleton, ofArrayWithTail, head, tail, isEmpty as isEmpty_1, FSharpList, fold as fold_1, empty as empty_1, cons } from \"./List.js\";\nimport { map as map_2, fill } from \"./Array.js\";\nimport { structuralHash, compare, toIterator, equals, disposeSafe, getEnumerator, isArrayLike } from \"./Util.js\";\nimport { Record } from \"./Types.js\";\nimport { tryPick as tryPick_1, pick as pick_1, iterate as iterate_1, compareWith, map as map_1, unfold } from \"./Seq.js\";\nimport { format, join } from \"./String.js\";\nimport { LanguagePrimitives_FastGenericComparer } from \"./FSharp.Core.js\";\n\nexport class MapTreeLeaf$2 {\n constructor(k, v) {\n this.k = k;\n this.v = v;\n }\n}\n\nexport function MapTreeLeaf$2$reflection(gen0, gen1) {\n return class_type(\"Map.MapTreeLeaf`2\", [gen0, gen1], MapTreeLeaf$2);\n}\n\nexport function MapTreeLeaf$2_$ctor_5BDDA1(k, v) {\n return new MapTreeLeaf$2(k, v);\n}\n\nexport function MapTreeLeaf$2__get_Key(_) {\n return _.k;\n}\n\nexport function MapTreeLeaf$2__get_Value(_) {\n return _.v;\n}\n\nexport class MapTreeNode$2 extends MapTreeLeaf$2 {\n constructor(k, v, left, right, h) {\n super(k, v);\n this.left = left;\n this.right = right;\n this.h = (h | 0);\n }\n}\n\nexport function MapTreeNode$2$reflection(gen0, gen1) {\n return class_type(\"Map.MapTreeNode`2\", [gen0, gen1], MapTreeNode$2, MapTreeLeaf$2$reflection(gen0, gen1));\n}\n\nexport function MapTreeNode$2_$ctor_499A11FD(k, v, left, right, h) {\n return new MapTreeNode$2(k, v, left, right, h);\n}\n\nexport function MapTreeNode$2__get_Left(_) {\n return _.left;\n}\n\nexport function MapTreeNode$2__get_Right(_) {\n return _.right;\n}\n\nexport function MapTreeNode$2__get_Height(_) {\n return _.h;\n}\n\nexport function MapTreeModule_empty() {\n return void 0;\n}\n\nexport function MapTreeModule_sizeAux(acc_mut, m_mut) {\n MapTreeModule_sizeAux:\n while (true) {\n const acc = acc_mut, m = m_mut;\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n acc_mut = MapTreeModule_sizeAux(acc + 1, MapTreeNode$2__get_Left(m2));\n m_mut = MapTreeNode$2__get_Right(m2);\n continue MapTreeModule_sizeAux;\n }\n else {\n return (acc + 1) | 0;\n }\n }\n else {\n return acc | 0;\n }\n break;\n }\n}\n\nexport function MapTreeModule_size(x) {\n return MapTreeModule_sizeAux(0, x);\n}\n\nexport function MapTreeModule_mk(l, k, v, r) {\n let hl;\n const m = l;\n if (m != null) {\n const m2 = m;\n hl = ((m2 instanceof MapTreeNode$2) ? MapTreeNode$2__get_Height(m2) : 1);\n }\n else {\n hl = 0;\n }\n let hr;\n const m_1 = r;\n if (m_1 != null) {\n const m2_1 = m_1;\n hr = ((m2_1 instanceof MapTreeNode$2) ? MapTreeNode$2__get_Height(m2_1) : 1);\n }\n else {\n hr = 0;\n }\n const m_2 = ((hl < hr) ? hr : hl) | 0;\n if (m_2 === 0) {\n return MapTreeLeaf$2_$ctor_5BDDA1(k, v);\n }\n else {\n return MapTreeNode$2_$ctor_499A11FD(k, v, l, r, m_2 + 1);\n }\n}\n\nexport function MapTreeModule_rebalance(t1, k, v, t2) {\n let m_2, m2_2, m_3, m2_3;\n let t1h;\n const m = t1;\n if (m != null) {\n const m2 = m;\n t1h = ((m2 instanceof MapTreeNode$2) ? MapTreeNode$2__get_Height(m2) : 1);\n }\n else {\n t1h = 0;\n }\n let t2h;\n const m_1 = t2;\n if (m_1 != null) {\n const m2_1 = m_1;\n t2h = ((m2_1 instanceof MapTreeNode$2) ? MapTreeNode$2__get_Height(m2_1) : 1);\n }\n else {\n t2h = 0;\n }\n if (t2h > (t1h + 2)) {\n const matchValue = value_1(t2);\n if (matchValue instanceof MapTreeNode$2) {\n if (((m_2 = MapTreeNode$2__get_Left(matchValue), (m_2 != null) ? ((m2_2 = m_2, (m2_2 instanceof MapTreeNode$2) ? MapTreeNode$2__get_Height(m2_2) : 1)) : 0)) > (t1h + 1)) {\n const matchValue_1 = value_1(MapTreeNode$2__get_Left(matchValue));\n if (matchValue_1 instanceof MapTreeNode$2) {\n return MapTreeModule_mk(MapTreeModule_mk(t1, k, v, MapTreeNode$2__get_Left(matchValue_1)), MapTreeLeaf$2__get_Key(matchValue_1), MapTreeLeaf$2__get_Value(matchValue_1), MapTreeModule_mk(MapTreeNode$2__get_Right(matchValue_1), MapTreeLeaf$2__get_Key(matchValue), MapTreeLeaf$2__get_Value(matchValue), MapTreeNode$2__get_Right(matchValue)));\n }\n else {\n throw (new Error(\"internal error: Map.rebalance\"));\n }\n }\n else {\n return MapTreeModule_mk(MapTreeModule_mk(t1, k, v, MapTreeNode$2__get_Left(matchValue)), MapTreeLeaf$2__get_Key(matchValue), MapTreeLeaf$2__get_Value(matchValue), MapTreeNode$2__get_Right(matchValue));\n }\n }\n else {\n throw (new Error(\"internal error: Map.rebalance\"));\n }\n }\n else if (t1h > (t2h + 2)) {\n const matchValue_2 = value_1(t1);\n if (matchValue_2 instanceof MapTreeNode$2) {\n if (((m_3 = MapTreeNode$2__get_Right(matchValue_2), (m_3 != null) ? ((m2_3 = m_3, (m2_3 instanceof MapTreeNode$2) ? MapTreeNode$2__get_Height(m2_3) : 1)) : 0)) > (t2h + 1)) {\n const matchValue_3 = value_1(MapTreeNode$2__get_Right(matchValue_2));\n if (matchValue_3 instanceof MapTreeNode$2) {\n return MapTreeModule_mk(MapTreeModule_mk(MapTreeNode$2__get_Left(matchValue_2), MapTreeLeaf$2__get_Key(matchValue_2), MapTreeLeaf$2__get_Value(matchValue_2), MapTreeNode$2__get_Left(matchValue_3)), MapTreeLeaf$2__get_Key(matchValue_3), MapTreeLeaf$2__get_Value(matchValue_3), MapTreeModule_mk(MapTreeNode$2__get_Right(matchValue_3), k, v, t2));\n }\n else {\n throw (new Error(\"internal error: Map.rebalance\"));\n }\n }\n else {\n return MapTreeModule_mk(MapTreeNode$2__get_Left(matchValue_2), MapTreeLeaf$2__get_Key(matchValue_2), MapTreeLeaf$2__get_Value(matchValue_2), MapTreeModule_mk(MapTreeNode$2__get_Right(matchValue_2), k, v, t2));\n }\n }\n else {\n throw (new Error(\"internal error: Map.rebalance\"));\n }\n }\n else {\n return MapTreeModule_mk(t1, k, v, t2);\n }\n}\n\nexport function MapTreeModule_add(comparer, k, v, m) {\n if (m != null) {\n const m2 = m;\n const c = comparer.Compare(k, MapTreeLeaf$2__get_Key(m2)) | 0;\n if (m2 instanceof MapTreeNode$2) {\n if (c < 0) {\n return MapTreeModule_rebalance(MapTreeModule_add(comparer, k, v, MapTreeNode$2__get_Left(m2)), MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeNode$2__get_Right(m2));\n }\n else if (c === 0) {\n return MapTreeNode$2_$ctor_499A11FD(k, v, MapTreeNode$2__get_Left(m2), MapTreeNode$2__get_Right(m2), MapTreeNode$2__get_Height(m2));\n }\n else {\n return MapTreeModule_rebalance(MapTreeNode$2__get_Left(m2), MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeModule_add(comparer, k, v, MapTreeNode$2__get_Right(m2)));\n }\n }\n else if (c < 0) {\n return MapTreeNode$2_$ctor_499A11FD(k, v, MapTreeModule_empty(), m, 2);\n }\n else if (c === 0) {\n return MapTreeLeaf$2_$ctor_5BDDA1(k, v);\n }\n else {\n return MapTreeNode$2_$ctor_499A11FD(k, v, m, MapTreeModule_empty(), 2);\n }\n }\n else {\n return MapTreeLeaf$2_$ctor_5BDDA1(k, v);\n }\n}\n\nexport function MapTreeModule_tryFind(comparer_mut, k_mut, m_mut) {\n MapTreeModule_tryFind:\n while (true) {\n const comparer = comparer_mut, k = k_mut, m = m_mut;\n if (m != null) {\n const m2 = m;\n const c = comparer.Compare(k, MapTreeLeaf$2__get_Key(m2)) | 0;\n if (c === 0) {\n return some(MapTreeLeaf$2__get_Value(m2));\n }\n else if (m2 instanceof MapTreeNode$2) {\n comparer_mut = comparer;\n k_mut = k;\n m_mut = ((c < 0) ? MapTreeNode$2__get_Left(m2) : MapTreeNode$2__get_Right(m2));\n continue MapTreeModule_tryFind;\n }\n else {\n return void 0;\n }\n }\n else {\n return void 0;\n }\n break;\n }\n}\n\nexport function MapTreeModule_find(comparer, k, m) {\n const matchValue = MapTreeModule_tryFind(comparer, k, m);\n if (matchValue == null) {\n throw (new Error());\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function MapTreeModule_partition1(comparer, f, k, v, acc1, acc2) {\n if (f(k, v)) {\n return [MapTreeModule_add(comparer, k, v, acc1), acc2];\n }\n else {\n return [acc1, MapTreeModule_add(comparer, k, v, acc2)];\n }\n}\n\nexport function MapTreeModule_partitionAux(comparer_mut, f_mut, m_mut, acc__mut, acc__1_mut) {\n MapTreeModule_partitionAux:\n while (true) {\n const comparer = comparer_mut, f = f_mut, m = m_mut, acc_ = acc__mut, acc__1 = acc__1_mut;\n const acc = [acc_, acc__1];\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n const acc_1 = MapTreeModule_partitionAux(comparer, f, MapTreeNode$2__get_Right(m2), acc[0], acc[1]);\n const acc_4 = MapTreeModule_partition1(comparer, f, MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), acc_1[0], acc_1[1]);\n comparer_mut = comparer;\n f_mut = f;\n m_mut = MapTreeNode$2__get_Left(m2);\n acc__mut = acc_4[0];\n acc__1_mut = acc_4[1];\n continue MapTreeModule_partitionAux;\n }\n else {\n return MapTreeModule_partition1(comparer, f, MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), acc[0], acc[1]);\n }\n }\n else {\n return acc;\n }\n break;\n }\n}\n\nexport function MapTreeModule_partition(comparer, f, m) {\n return MapTreeModule_partitionAux(comparer, f, m, MapTreeModule_empty(), MapTreeModule_empty());\n}\n\nexport function MapTreeModule_filter1(comparer, f, k, v, acc) {\n if (f(k, v)) {\n return MapTreeModule_add(comparer, k, v, acc);\n }\n else {\n return acc;\n }\n}\n\nexport function MapTreeModule_filterAux(comparer_mut, f_mut, m_mut, acc_mut) {\n MapTreeModule_filterAux:\n while (true) {\n const comparer = comparer_mut, f = f_mut, m = m_mut, acc = acc_mut;\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n const acc_1 = MapTreeModule_filterAux(comparer, f, MapTreeNode$2__get_Left(m2), acc);\n const acc_2 = MapTreeModule_filter1(comparer, f, MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), acc_1);\n comparer_mut = comparer;\n f_mut = f;\n m_mut = MapTreeNode$2__get_Right(m2);\n acc_mut = acc_2;\n continue MapTreeModule_filterAux;\n }\n else {\n return MapTreeModule_filter1(comparer, f, MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), acc);\n }\n }\n else {\n return acc;\n }\n break;\n }\n}\n\nexport function MapTreeModule_filter(comparer, f, m) {\n return MapTreeModule_filterAux(comparer, f, m, MapTreeModule_empty());\n}\n\nexport function MapTreeModule_spliceOutSuccessor(m) {\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n if (MapTreeNode$2__get_Left(m2) == null) {\n return [MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeNode$2__get_Right(m2)];\n }\n else {\n const patternInput = MapTreeModule_spliceOutSuccessor(MapTreeNode$2__get_Left(m2));\n return [patternInput[0], patternInput[1], MapTreeModule_mk(patternInput[2], MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeNode$2__get_Right(m2))];\n }\n }\n else {\n return [MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeModule_empty()];\n }\n }\n else {\n throw (new Error(\"internal error: Map.spliceOutSuccessor\"));\n }\n}\n\nexport function MapTreeModule_remove(comparer, k, m) {\n if (m != null) {\n const m2 = m;\n const c = comparer.Compare(k, MapTreeLeaf$2__get_Key(m2)) | 0;\n if (m2 instanceof MapTreeNode$2) {\n if (c < 0) {\n return MapTreeModule_rebalance(MapTreeModule_remove(comparer, k, MapTreeNode$2__get_Left(m2)), MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeNode$2__get_Right(m2));\n }\n else if (c === 0) {\n if (MapTreeNode$2__get_Left(m2) == null) {\n return MapTreeNode$2__get_Right(m2);\n }\n else if (MapTreeNode$2__get_Right(m2) == null) {\n return MapTreeNode$2__get_Left(m2);\n }\n else {\n const patternInput = MapTreeModule_spliceOutSuccessor(MapTreeNode$2__get_Right(m2));\n return MapTreeModule_mk(MapTreeNode$2__get_Left(m2), patternInput[0], patternInput[1], patternInput[2]);\n }\n }\n else {\n return MapTreeModule_rebalance(MapTreeNode$2__get_Left(m2), MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeModule_remove(comparer, k, MapTreeNode$2__get_Right(m2)));\n }\n }\n else if (c === 0) {\n return MapTreeModule_empty();\n }\n else {\n return m;\n }\n }\n else {\n return MapTreeModule_empty();\n }\n}\n\nexport function MapTreeModule_change(comparer, k, u, m) {\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n const c = comparer.Compare(k, MapTreeLeaf$2__get_Key(m2)) | 0;\n if (c < 0) {\n return MapTreeModule_rebalance(MapTreeModule_change(comparer, k, u, MapTreeNode$2__get_Left(m2)), MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeNode$2__get_Right(m2));\n }\n else if (c === 0) {\n const matchValue_1 = u(some(MapTreeLeaf$2__get_Value(m2)));\n if (matchValue_1 != null) {\n return MapTreeNode$2_$ctor_499A11FD(k, value_1(matchValue_1), MapTreeNode$2__get_Left(m2), MapTreeNode$2__get_Right(m2), MapTreeNode$2__get_Height(m2));\n }\n else if (MapTreeNode$2__get_Left(m2) == null) {\n return MapTreeNode$2__get_Right(m2);\n }\n else if (MapTreeNode$2__get_Right(m2) == null) {\n return MapTreeNode$2__get_Left(m2);\n }\n else {\n const patternInput = MapTreeModule_spliceOutSuccessor(MapTreeNode$2__get_Right(m2));\n return MapTreeModule_mk(MapTreeNode$2__get_Left(m2), patternInput[0], patternInput[1], patternInput[2]);\n }\n }\n else {\n return MapTreeModule_rebalance(MapTreeNode$2__get_Left(m2), MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), MapTreeModule_change(comparer, k, u, MapTreeNode$2__get_Right(m2)));\n }\n }\n else {\n const c_1 = comparer.Compare(k, MapTreeLeaf$2__get_Key(m2)) | 0;\n if (c_1 < 0) {\n const matchValue_2 = u(void 0);\n if (matchValue_2 != null) {\n return MapTreeNode$2_$ctor_499A11FD(k, value_1(matchValue_2), MapTreeModule_empty(), m, 2);\n }\n else {\n return m;\n }\n }\n else if (c_1 === 0) {\n const matchValue_3 = u(some(MapTreeLeaf$2__get_Value(m2)));\n if (matchValue_3 != null) {\n return MapTreeLeaf$2_$ctor_5BDDA1(k, value_1(matchValue_3));\n }\n else {\n return MapTreeModule_empty();\n }\n }\n else {\n const matchValue_4 = u(void 0);\n if (matchValue_4 != null) {\n return MapTreeNode$2_$ctor_499A11FD(k, value_1(matchValue_4), m, MapTreeModule_empty(), 2);\n }\n else {\n return m;\n }\n }\n }\n }\n else {\n const matchValue = u(void 0);\n if (matchValue != null) {\n return MapTreeLeaf$2_$ctor_5BDDA1(k, value_1(matchValue));\n }\n else {\n return m;\n }\n }\n}\n\nexport function MapTreeModule_mem(comparer_mut, k_mut, m_mut) {\n MapTreeModule_mem:\n while (true) {\n const comparer = comparer_mut, k = k_mut, m = m_mut;\n if (m != null) {\n const m2 = m;\n const c = comparer.Compare(k, MapTreeLeaf$2__get_Key(m2)) | 0;\n if (m2 instanceof MapTreeNode$2) {\n if (c < 0) {\n comparer_mut = comparer;\n k_mut = k;\n m_mut = MapTreeNode$2__get_Left(m2);\n continue MapTreeModule_mem;\n }\n else if (c === 0) {\n return true;\n }\n else {\n comparer_mut = comparer;\n k_mut = k;\n m_mut = MapTreeNode$2__get_Right(m2);\n continue MapTreeModule_mem;\n }\n }\n else {\n return c === 0;\n }\n }\n else {\n return false;\n }\n break;\n }\n}\n\nexport function MapTreeModule_iterOpt(f_mut, m_mut) {\n MapTreeModule_iterOpt:\n while (true) {\n const f = f_mut, m = m_mut;\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n MapTreeModule_iterOpt(f, MapTreeNode$2__get_Left(m2));\n f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n f_mut = f;\n m_mut = MapTreeNode$2__get_Right(m2);\n continue MapTreeModule_iterOpt;\n }\n else {\n f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n }\n }\n break;\n }\n}\n\nexport function MapTreeModule_iter(f, m) {\n MapTreeModule_iterOpt(f, m);\n}\n\nexport function MapTreeModule_tryPickOpt(f_mut, m_mut) {\n MapTreeModule_tryPickOpt:\n while (true) {\n const f = f_mut, m = m_mut;\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n const matchValue = MapTreeModule_tryPickOpt(f, MapTreeNode$2__get_Left(m2));\n if (matchValue == null) {\n const matchValue_1 = f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n if (matchValue_1 == null) {\n f_mut = f;\n m_mut = MapTreeNode$2__get_Right(m2);\n continue MapTreeModule_tryPickOpt;\n }\n else {\n return matchValue_1;\n }\n }\n else {\n return matchValue;\n }\n }\n else {\n return f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n }\n }\n else {\n return void 0;\n }\n break;\n }\n}\n\nexport function MapTreeModule_tryPick(f, m) {\n return MapTreeModule_tryPickOpt(f, m);\n}\n\nexport function MapTreeModule_existsOpt(f_mut, m_mut) {\n MapTreeModule_existsOpt:\n while (true) {\n const f = f_mut, m = m_mut;\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n if (MapTreeModule_existsOpt(f, MapTreeNode$2__get_Left(m2)) ? true : f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2))) {\n return true;\n }\n else {\n f_mut = f;\n m_mut = MapTreeNode$2__get_Right(m2);\n continue MapTreeModule_existsOpt;\n }\n }\n else {\n return f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n }\n }\n else {\n return false;\n }\n break;\n }\n}\n\nexport function MapTreeModule_exists(f, m) {\n return MapTreeModule_existsOpt(f, m);\n}\n\nexport function MapTreeModule_forallOpt(f_mut, m_mut) {\n MapTreeModule_forallOpt:\n while (true) {\n const f = f_mut, m = m_mut;\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n if (MapTreeModule_forallOpt(f, MapTreeNode$2__get_Left(m2)) && f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2))) {\n f_mut = f;\n m_mut = MapTreeNode$2__get_Right(m2);\n continue MapTreeModule_forallOpt;\n }\n else {\n return false;\n }\n }\n else {\n return f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n }\n }\n else {\n return true;\n }\n break;\n }\n}\n\nexport function MapTreeModule_forall(f, m) {\n return MapTreeModule_forallOpt(f, m);\n}\n\nexport function MapTreeModule_map(f, m) {\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n const l2 = MapTreeModule_map(f, MapTreeNode$2__get_Left(m2));\n const v2 = f(MapTreeLeaf$2__get_Value(m2));\n const r2 = MapTreeModule_map(f, MapTreeNode$2__get_Right(m2));\n return MapTreeNode$2_$ctor_499A11FD(MapTreeLeaf$2__get_Key(m2), v2, l2, r2, MapTreeNode$2__get_Height(m2));\n }\n else {\n return MapTreeLeaf$2_$ctor_5BDDA1(MapTreeLeaf$2__get_Key(m2), f(MapTreeLeaf$2__get_Value(m2)));\n }\n }\n else {\n return MapTreeModule_empty();\n }\n}\n\nexport function MapTreeModule_mapiOpt(f, m) {\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n const l2 = MapTreeModule_mapiOpt(f, MapTreeNode$2__get_Left(m2));\n const v2 = f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n const r2 = MapTreeModule_mapiOpt(f, MapTreeNode$2__get_Right(m2));\n return MapTreeNode$2_$ctor_499A11FD(MapTreeLeaf$2__get_Key(m2), v2, l2, r2, MapTreeNode$2__get_Height(m2));\n }\n else {\n return MapTreeLeaf$2_$ctor_5BDDA1(MapTreeLeaf$2__get_Key(m2), f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2)));\n }\n }\n else {\n return MapTreeModule_empty();\n }\n}\n\nexport function MapTreeModule_mapi(f, m) {\n return MapTreeModule_mapiOpt(f, m);\n}\n\nexport function MapTreeModule_foldBackOpt(f_mut, m_mut, x_mut) {\n MapTreeModule_foldBackOpt:\n while (true) {\n const f = f_mut, m = m_mut, x = x_mut;\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n const x_1 = MapTreeModule_foldBackOpt(f, MapTreeNode$2__get_Right(m2), x);\n const x_2 = f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), x_1);\n f_mut = f;\n m_mut = MapTreeNode$2__get_Left(m2);\n x_mut = x_2;\n continue MapTreeModule_foldBackOpt;\n }\n else {\n return f(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), x);\n }\n }\n else {\n return x;\n }\n break;\n }\n}\n\nexport function MapTreeModule_foldBack(f, m, x) {\n return MapTreeModule_foldBackOpt(f, m, x);\n}\n\nexport function MapTreeModule_foldOpt(f_mut, x_mut, m_mut) {\n MapTreeModule_foldOpt:\n while (true) {\n const f = f_mut, x = x_mut, m = m_mut;\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n f_mut = f;\n x_mut = f(MapTreeModule_foldOpt(f, x, MapTreeNode$2__get_Left(m2)), MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n m_mut = MapTreeNode$2__get_Right(m2);\n continue MapTreeModule_foldOpt;\n }\n else {\n return f(x, MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2));\n }\n }\n else {\n return x;\n }\n break;\n }\n}\n\nexport function MapTreeModule_fold(f, x, m) {\n return MapTreeModule_foldOpt(f, x, m);\n}\n\nexport function MapTreeModule_foldSectionOpt(comparer, lo, hi, f, m, x) {\n const foldFromTo = (f_1_mut, m_1_mut, x_1_mut) => {\n foldFromTo:\n while (true) {\n const f_1 = f_1_mut, m_1 = m_1_mut, x_1 = x_1_mut;\n if (m_1 != null) {\n const m2 = m_1;\n if (m2 instanceof MapTreeNode$2) {\n const cLoKey = comparer.Compare(lo, MapTreeLeaf$2__get_Key(m2)) | 0;\n const cKeyHi = comparer.Compare(MapTreeLeaf$2__get_Key(m2), hi) | 0;\n const x_2 = (cLoKey < 0) ? foldFromTo(f_1, MapTreeNode$2__get_Left(m2), x_1) : x_1;\n const x_3 = ((cLoKey <= 0) && (cKeyHi <= 0)) ? f_1(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), x_2) : x_2;\n if (cKeyHi < 0) {\n f_1_mut = f_1;\n m_1_mut = MapTreeNode$2__get_Right(m2);\n x_1_mut = x_3;\n continue foldFromTo;\n }\n else {\n return x_3;\n }\n }\n else if ((comparer.Compare(lo, MapTreeLeaf$2__get_Key(m2)) <= 0) && (comparer.Compare(MapTreeLeaf$2__get_Key(m2), hi) <= 0)) {\n return f_1(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2), x_1);\n }\n else {\n return x_1;\n }\n }\n else {\n return x_1;\n }\n break;\n }\n };\n if (comparer.Compare(lo, hi) === 1) {\n return x;\n }\n else {\n return foldFromTo(f, m, x);\n }\n}\n\nexport function MapTreeModule_foldSection(comparer, lo, hi, f, m, x) {\n return MapTreeModule_foldSectionOpt(comparer, lo, hi, f, m, x);\n}\n\nexport function MapTreeModule_toList(m) {\n const loop = (m_1_mut, acc_mut) => {\n loop:\n while (true) {\n const m_1 = m_1_mut, acc = acc_mut;\n if (m_1 != null) {\n const m2 = m_1;\n if (m2 instanceof MapTreeNode$2) {\n m_1_mut = MapTreeNode$2__get_Left(m2);\n acc_mut = cons([MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2)], loop(MapTreeNode$2__get_Right(m2), acc));\n continue loop;\n }\n else {\n return cons([MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2)], acc);\n }\n }\n else {\n return acc;\n }\n break;\n }\n };\n return loop(m, empty_1());\n}\n\nexport function MapTreeModule_copyToArray(m, arr, i) {\n let j = i;\n MapTreeModule_iter((x, y) => {\n arr[j] = [x, y];\n j = ((j + 1) | 0);\n }, m);\n}\n\nexport function MapTreeModule_toArray(m) {\n const n = MapTreeModule_size(m) | 0;\n const res = fill(new Array(n), 0, n, [null, null]);\n MapTreeModule_copyToArray(m, res, 0);\n return res;\n}\n\nexport function MapTreeModule_ofList(comparer, l) {\n return fold_1((acc, tupledArg) => MapTreeModule_add(comparer, tupledArg[0], tupledArg[1], acc), MapTreeModule_empty(), l);\n}\n\nexport function MapTreeModule_mkFromEnumerator(comparer_mut, acc_mut, e_mut) {\n MapTreeModule_mkFromEnumerator:\n while (true) {\n const comparer = comparer_mut, acc = acc_mut, e = e_mut;\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const patternInput = e[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n comparer_mut = comparer;\n acc_mut = MapTreeModule_add(comparer, patternInput[0], patternInput[1], acc);\n e_mut = e;\n continue MapTreeModule_mkFromEnumerator;\n }\n else {\n return acc;\n }\n break;\n }\n}\n\nexport function MapTreeModule_ofArray(comparer, arr) {\n let res = MapTreeModule_empty();\n for (let idx = 0; idx <= (arr.length - 1); idx++) {\n const forLoopVar = arr[idx];\n res = MapTreeModule_add(comparer, forLoopVar[0], forLoopVar[1], res);\n }\n return res;\n}\n\nexport function MapTreeModule_ofSeq(comparer, c) {\n if (isArrayLike(c)) {\n return MapTreeModule_ofArray(comparer, c);\n }\n else if (c instanceof FSharpList) {\n return MapTreeModule_ofList(comparer, c);\n }\n else {\n const ie = getEnumerator(c);\n try {\n return MapTreeModule_mkFromEnumerator(comparer, MapTreeModule_empty(), ie);\n }\n finally {\n disposeSafe(ie);\n }\n }\n}\n\nexport class MapTreeModule_MapIterator$2 extends Record {\n constructor(stack, started) {\n super();\n this.stack = stack;\n this.started = started;\n }\n}\n\nexport function MapTreeModule_MapIterator$2$reflection(gen0, gen1) {\n return record_type(\"Map.MapTreeModule.MapIterator`2\", [gen0, gen1], MapTreeModule_MapIterator$2, () => [[\"stack\", list_type(option_type(MapTreeLeaf$2$reflection(gen0, gen1)))], [\"started\", bool_type]]);\n}\n\nexport function MapTreeModule_collapseLHS(stack_mut) {\n MapTreeModule_collapseLHS:\n while (true) {\n const stack = stack_mut;\n if (!isEmpty_1(stack)) {\n const rest = tail(stack);\n const m = head(stack);\n if (m != null) {\n const m2 = m;\n if (m2 instanceof MapTreeNode$2) {\n stack_mut = ofArrayWithTail([MapTreeNode$2__get_Left(m2), MapTreeLeaf$2_$ctor_5BDDA1(MapTreeLeaf$2__get_Key(m2), MapTreeLeaf$2__get_Value(m2)), MapTreeNode$2__get_Right(m2)], rest);\n continue MapTreeModule_collapseLHS;\n }\n else {\n return stack;\n }\n }\n else {\n stack_mut = rest;\n continue MapTreeModule_collapseLHS;\n }\n }\n else {\n return empty_1();\n }\n break;\n }\n}\n\nexport function MapTreeModule_mkIterator(m) {\n return new MapTreeModule_MapIterator$2(MapTreeModule_collapseLHS(singleton(m)), false);\n}\n\nexport function MapTreeModule_notStarted() {\n throw (new Error(\"enumeration not started\"));\n}\n\nexport function MapTreeModule_alreadyFinished() {\n throw (new Error(\"enumeration already finished\"));\n}\n\nexport function MapTreeModule_current(i) {\n if (i.started) {\n const matchValue = i.stack;\n if (!isEmpty_1(matchValue)) {\n if (head(matchValue) != null) {\n const m = head(matchValue);\n if (m instanceof MapTreeNode$2) {\n throw (new Error(\"Please report error: Map iterator, unexpected stack for current\"));\n }\n else {\n return [MapTreeLeaf$2__get_Key(m), MapTreeLeaf$2__get_Value(m)];\n }\n }\n else {\n throw (new Error(\"Please report error: Map iterator, unexpected stack for current\"));\n }\n }\n else {\n return MapTreeModule_alreadyFinished();\n }\n }\n else {\n return MapTreeModule_notStarted();\n }\n}\n\nexport function MapTreeModule_moveNext(i) {\n if (i.started) {\n const matchValue = i.stack;\n if (!isEmpty_1(matchValue)) {\n if (head(matchValue) != null) {\n const m = head(matchValue);\n if (m instanceof MapTreeNode$2) {\n throw (new Error(\"Please report error: Map iterator, unexpected stack for moveNext\"));\n }\n else {\n i.stack = MapTreeModule_collapseLHS(tail(matchValue));\n return !isEmpty_1(i.stack);\n }\n }\n else {\n throw (new Error(\"Please report error: Map iterator, unexpected stack for moveNext\"));\n }\n }\n else {\n return false;\n }\n }\n else {\n i.started = true;\n return !isEmpty_1(i.stack);\n }\n}\n\nexport function MapTreeModule_mkIEnumerator(m) {\n let i = MapTreeModule_mkIterator(m);\n return {\n [\"System.Collections.Generic.IEnumerator`1.get_Current\"]() {\n return MapTreeModule_current(i);\n },\n [\"System.Collections.IEnumerator.get_Current\"]() {\n return MapTreeModule_current(i);\n },\n [\"System.Collections.IEnumerator.MoveNext\"]() {\n return MapTreeModule_moveNext(i);\n },\n [\"System.Collections.IEnumerator.Reset\"]() {\n i = MapTreeModule_mkIterator(m);\n },\n Dispose() {\n },\n };\n}\n\nexport function MapTreeModule_toSeq(s) {\n return unfold((en_1) => {\n if (en_1[\"System.Collections.IEnumerator.MoveNext\"]()) {\n return [en_1[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), en_1];\n }\n else {\n return void 0;\n }\n }, MapTreeModule_mkIEnumerator(s));\n}\n\nexport class FSharpMap {\n constructor(comparer, tree) {\n this.comparer = comparer;\n this.tree = tree;\n }\n GetHashCode() {\n const this$ = this;\n return FSharpMap__ComputeHashCode(this$) | 0;\n }\n Equals(that) {\n const this$ = this;\n if (that instanceof FSharpMap) {\n const e1 = getEnumerator(this$);\n try {\n const e2 = getEnumerator(that);\n try {\n const loop = () => {\n const m1 = e1[\"System.Collections.IEnumerator.MoveNext\"]();\n if (m1 === e2[\"System.Collections.IEnumerator.MoveNext\"]()) {\n if (!m1) {\n return true;\n }\n else {\n const e1c = e1[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n const e2c = e2[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n if (equals(e1c[0], e2c[0]) && equals(e1c[1], e2c[1])) {\n return loop();\n }\n else {\n return false;\n }\n }\n }\n else {\n return false;\n }\n };\n return loop();\n }\n finally {\n disposeSafe(e2);\n }\n }\n finally {\n disposeSafe(e1);\n }\n }\n else {\n return false;\n }\n }\n toString() {\n const this$ = this;\n return (\"map [\" + join(\"; \", map_1((kv) => format(\"({0}, {1})\", kv[0], kv[1]), this$))) + \"]\";\n }\n get [Symbol.toStringTag]() {\n return \"FSharpMap\";\n }\n toJSON(_key) {\n const this$ = this;\n return Array.from(this$);\n }\n GetEnumerator() {\n const __ = this;\n return MapTreeModule_mkIEnumerator(__.tree);\n }\n [Symbol.iterator]() {\n return toIterator(this.GetEnumerator());\n }\n [\"System.Collections.IEnumerable.GetEnumerator\"]() {\n const __ = this;\n return MapTreeModule_mkIEnumerator(__.tree);\n }\n CompareTo(obj) {\n const m = this;\n if (obj instanceof FSharpMap) {\n return compareWith((kvp1, kvp2) => {\n const c = m.comparer.Compare(kvp1[0], kvp2[0]) | 0;\n return ((c !== 0) ? c : compare(kvp1[1], kvp2[1])) | 0;\n }, m, obj) | 0;\n }\n else {\n throw (new Error(\"not comparable\\\\nParameter name: obj\"));\n }\n }\n [\"System.Collections.Generic.ICollection`1.Add2B595\"](x) {\n throw (new Error(\"Map cannot be mutated\"));\n }\n [\"System.Collections.Generic.ICollection`1.Clear\"]() {\n throw (new Error(\"Map cannot be mutated\"));\n }\n [\"System.Collections.Generic.ICollection`1.Remove2B595\"](x) {\n throw (new Error(\"Map cannot be mutated\"));\n }\n [\"System.Collections.Generic.ICollection`1.Contains2B595\"](x) {\n const m = this;\n return FSharpMap__ContainsKey(m, x[0]) && equals(FSharpMap__get_Item(m, x[0]), x[1]);\n }\n [\"System.Collections.Generic.ICollection`1.CopyToZ2E171D71\"](arr, i) {\n const m = this;\n MapTreeModule_copyToArray(m.tree, arr, i);\n }\n [\"System.Collections.Generic.ICollection`1.get_IsReadOnly\"]() {\n return true;\n }\n [\"System.Collections.Generic.ICollection`1.get_Count\"]() {\n const m = this;\n return FSharpMap__get_Count(m) | 0;\n }\n [\"System.Collections.Generic.IReadOnlyCollection`1.get_Count\"]() {\n const m = this;\n return FSharpMap__get_Count(m) | 0;\n }\n get size() {\n const m = this;\n return FSharpMap__get_Count(m) | 0;\n }\n clear() {\n throw (new Error(\"Map cannot be mutated\"));\n }\n delete(_arg) {\n throw (new Error(\"Map cannot be mutated\"));\n return false;\n }\n entries() {\n const m = this;\n return map_1((p) => [p[0], p[1]], m);\n }\n get(k) {\n const m = this;\n return FSharpMap__get_Item(m, k);\n }\n has(k) {\n const m = this;\n return FSharpMap__ContainsKey(m, k);\n }\n keys() {\n const m = this;\n return map_1((p) => p[0], m);\n }\n set(k, v) {\n const m = this;\n throw (new Error(\"Map cannot be mutated\"));\n return m;\n }\n values() {\n const m = this;\n return map_1((p) => p[1], m);\n }\n forEach(f, thisArg) {\n const m = this;\n iterate_1((p) => {\n f(p[1], p[0], m);\n }, m);\n }\n}\n\nexport function FSharpMap$reflection(gen0, gen1) {\n return class_type(\"Map.FSharpMap\", [gen0, gen1], FSharpMap);\n}\n\nexport function FSharpMap_$ctor(comparer, tree) {\n return new FSharpMap(comparer, tree);\n}\n\n(() => {\n FSharpMap.empty = FSharpMap_$ctor(LanguagePrimitives_FastGenericComparer(), MapTreeModule_empty());\n})();\n\nexport function FSharpMap_get_Empty() {\n return FSharpMap.empty;\n}\n\nexport function FSharpMap_Create(ie) {\n const comparer = LanguagePrimitives_FastGenericComparer();\n return FSharpMap_$ctor(comparer, MapTreeModule_ofSeq(comparer, ie));\n}\n\nexport function FSharpMap__get_Comparer(m) {\n return m.comparer;\n}\n\nexport function FSharpMap__get_Tree(m) {\n return m.tree;\n}\n\nexport function FSharpMap__Add(m, key, value) {\n return FSharpMap_$ctor(m.comparer, MapTreeModule_add(m.comparer, key, value, m.tree));\n}\n\nexport function FSharpMap__Change(m, key, f) {\n return FSharpMap_$ctor(m.comparer, MapTreeModule_change(m.comparer, key, f, m.tree));\n}\n\nexport function FSharpMap__get_IsEmpty(m) {\n return m.tree == null;\n}\n\nexport function FSharpMap__get_Item(m, key) {\n return MapTreeModule_find(m.comparer, key, m.tree);\n}\n\nexport function FSharpMap__TryPick(m, f) {\n return MapTreeModule_tryPick(f, m.tree);\n}\n\nexport function FSharpMap__Exists(m, predicate) {\n return MapTreeModule_exists(predicate, m.tree);\n}\n\nexport function FSharpMap__Filter(m, predicate) {\n return FSharpMap_$ctor(m.comparer, MapTreeModule_filter(m.comparer, predicate, m.tree));\n}\n\nexport function FSharpMap__ForAll(m, predicate) {\n return MapTreeModule_forall(predicate, m.tree);\n}\n\nexport function FSharpMap__Fold(m, f, acc) {\n return MapTreeModule_foldBack(f, m.tree, acc);\n}\n\nexport function FSharpMap__FoldSection(m, lo, hi, f, acc) {\n return MapTreeModule_foldSection(m.comparer, lo, hi, f, m.tree, acc);\n}\n\nexport function FSharpMap__Iterate(m, f) {\n MapTreeModule_iter(f, m.tree);\n}\n\nexport function FSharpMap__MapRange(m, f) {\n return FSharpMap_$ctor(m.comparer, MapTreeModule_map(f, m.tree));\n}\n\nexport function FSharpMap__Map(m, f) {\n return FSharpMap_$ctor(m.comparer, MapTreeModule_mapi(f, m.tree));\n}\n\nexport function FSharpMap__Partition(m, predicate) {\n const patternInput = MapTreeModule_partition(m.comparer, predicate, m.tree);\n return [FSharpMap_$ctor(m.comparer, patternInput[0]), FSharpMap_$ctor(m.comparer, patternInput[1])];\n}\n\nexport function FSharpMap__get_Count(m) {\n return MapTreeModule_size(m.tree);\n}\n\nexport function FSharpMap__ContainsKey(m, key) {\n return MapTreeModule_mem(m.comparer, key, m.tree);\n}\n\nexport function FSharpMap__Remove(m, key) {\n return FSharpMap_$ctor(m.comparer, MapTreeModule_remove(m.comparer, key, m.tree));\n}\n\nexport function FSharpMap__TryGetValue(__, key, value) {\n const matchValue = MapTreeModule_tryFind(__.comparer, key, __.tree);\n if (matchValue == null) {\n return false;\n }\n else {\n const v = value_1(matchValue);\n value.contents = v;\n return true;\n }\n}\n\nexport function FSharpMap__get_Keys(__) {\n return map_2((kvp) => kvp[0], MapTreeModule_toArray(__.tree));\n}\n\nexport function FSharpMap__get_Values(__) {\n return map_2((kvp) => kvp[1], MapTreeModule_toArray(__.tree));\n}\n\nexport function FSharpMap__TryFind(m, key) {\n return MapTreeModule_tryFind(m.comparer, key, m.tree);\n}\n\nexport function FSharpMap__ToList(m) {\n return MapTreeModule_toList(m.tree);\n}\n\nexport function FSharpMap__ToArray(m) {\n return MapTreeModule_toArray(m.tree);\n}\n\nexport function FSharpMap__ComputeHashCode(this$) {\n const combineHash = (x, y) => (((x << 1) + y) + 631);\n let res = 0;\n const enumerator = getEnumerator(this$);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const activePatternResult = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n res = (combineHash(res, structuralHash(activePatternResult[0])) | 0);\n res = (combineHash(res, structuralHash(activePatternResult[1])) | 0);\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n return res | 0;\n}\n\nexport function isEmpty(table) {\n return FSharpMap__get_IsEmpty(table);\n}\n\nexport function add(key, value, table) {\n return FSharpMap__Add(table, key, value);\n}\n\nexport function change(key, f, table) {\n return FSharpMap__Change(table, key, f);\n}\n\nexport function find(key, table) {\n return FSharpMap__get_Item(table, key);\n}\n\nexport function tryFind(key, table) {\n return FSharpMap__TryFind(table, key);\n}\n\nexport function remove(key, table) {\n return FSharpMap__Remove(table, key);\n}\n\nexport function containsKey(key, table) {\n return FSharpMap__ContainsKey(table, key);\n}\n\nexport function iterate(action, table) {\n FSharpMap__Iterate(table, action);\n}\n\nexport function tryPick(chooser, table) {\n return FSharpMap__TryPick(table, chooser);\n}\n\nexport function pick(chooser, table) {\n const matchValue = tryPick(chooser, table);\n if (matchValue != null) {\n return value_1(matchValue);\n }\n else {\n throw (new Error());\n }\n}\n\nexport function exists(predicate, table) {\n return FSharpMap__Exists(table, predicate);\n}\n\nexport function filter(predicate, table) {\n return FSharpMap__Filter(table, predicate);\n}\n\nexport function partition(predicate, table) {\n return FSharpMap__Partition(table, predicate);\n}\n\nexport function forAll(predicate, table) {\n return FSharpMap__ForAll(table, predicate);\n}\n\nexport function map(mapping, table) {\n return FSharpMap__Map(table, mapping);\n}\n\nexport function fold(folder, state, table) {\n return MapTreeModule_fold(folder, state, FSharpMap__get_Tree(table));\n}\n\nexport function foldBack(folder, table, state) {\n return MapTreeModule_foldBack(folder, FSharpMap__get_Tree(table), state);\n}\n\nexport function toSeq(table) {\n return map_1((kvp) => [kvp[0], kvp[1]], table);\n}\n\nexport function findKey(predicate, table) {\n return pick_1((kvp) => {\n const k = kvp[0];\n if (predicate(k, kvp[1])) {\n return some(k);\n }\n else {\n return void 0;\n }\n }, table);\n}\n\nexport function tryFindKey(predicate, table) {\n return tryPick_1((kvp) => {\n const k = kvp[0];\n if (predicate(k, kvp[1])) {\n return some(k);\n }\n else {\n return void 0;\n }\n }, table);\n}\n\nexport function ofList(elements) {\n return FSharpMap_Create(elements);\n}\n\nexport function ofSeq(elements) {\n return FSharpMap_Create(elements);\n}\n\nexport function ofArray(elements) {\n const comparer = LanguagePrimitives_FastGenericComparer();\n return FSharpMap_$ctor(comparer, MapTreeModule_ofArray(comparer, elements));\n}\n\nexport function toList(table) {\n return FSharpMap__ToList(table);\n}\n\nexport function toArray(table) {\n return FSharpMap__ToArray(table);\n}\n\nexport function keys(table) {\n return FSharpMap__get_Keys(table);\n}\n\nexport function values(table) {\n return FSharpMap__get_Values(table);\n}\n\nexport function empty() {\n return FSharpMap_get_Empty();\n}\n\nexport function count(table) {\n return FSharpMap__get_Count(table);\n}\n\n","namespace Fable.SimpleJson\n\nopen Fable.Parsimmon\n\n#nowarn \"40\"\n\nmodule Parser =\n\n let digits = \n Parsimmon.digit \n |> Parsimmon.atLeastOneOrMany\n |> Parsimmon.concat\n\n let jint = digits |> Parsimmon.map float\n\n let negJint = \n Parsimmon.seq2 (Parsimmon.str \"-\") jint \n |> Parsimmon.map (fun (sign, number) -> -number)\n\n let jfloat =\n let floatWithComma =\n Parsimmon.regex \"-?(0|[1-9][0-9]*)?[.][0-9]+([eE][+-]?[0-9]+)?\"\n let floatWithoutComma =\n Parsimmon.regex \"-?[1-9][0-9]*[eE][+-]?[0-9]+\"\n\n [ floatWithComma; floatWithoutComma ]\n |> Parsimmon.choose\n |> Parsimmon.map float\n\n let jnumber = \n [jfloat; jint; negJint] \n |> Parsimmon.choose\n |> Parsimmon.map JNumber\n\n let jbool = \n [ Parsimmon.stringReturn \"true\" (JBool true)\n Parsimmon.stringReturn \"false\" (JBool false)]\n |> Parsimmon.choose\n\n let jnull = Parsimmon.stringReturn \"null\" JNull\n\n let stringLiteral =\n let escape = \n Parsimmon.oneOf \"\\\"\\\\/bfnrt\"\n |> Parsimmon.map(function\n | \"b\" -> \"\\b\"\n | \"f\" -> \"\\u000C\"\n | \"n\" -> \"\\n\"\n | \"r\" -> \"\\r\"\n | \"t\" -> \"\\t\"\n | c -> c) // every other char is mapped to itself\n\n let escapedCharSnippet = \n Parsimmon.seq2 (Parsimmon.str \"\\\\\") escape\n |> Parsimmon.map snd\n\n let normalCharSnippet = Parsimmon.satisfy (fun c -> c <> \"\\\"\" && c <> \"\\\\\")\n\n let anyCharSnippet = \n normalCharSnippet\n |> Parsimmon.orTry escapedCharSnippet\n |> Parsimmon.many\n |> Parsimmon.concat\n\n anyCharSnippet\n |> Parsimmon.between (Parsimmon.str \"\\\"\") (Parsimmon.str \"\\\"\")\n \n let jstring = stringLiteral.map JString\n\n let withWhitespace p = \n Parsimmon.between (Parsimmon.optionalWhitespace) (Parsimmon.optionalWhitespace) p\n \n let jvalue = \n [ jnull; jbool; jnumber; jstring ]\n |> List.map withWhitespace\n |> Parsimmon.choose\n \n let comma = withWhitespace (Parsimmon.str \",\")\n \n let rec json = Parsimmon.ofLazy <| fun () ->\n \n let leftBracket = withWhitespace (Parsimmon.str \"[\")\n let rightBracket = withWhitespace (Parsimmon.str \"]\")\n \n let arrayValue = Parsimmon.seperateBy comma json\n \n let jarray = \n arrayValue\n |> Parsimmon.between leftBracket rightBracket\n |> Parsimmon.map (List.ofArray >> JArray)\n\n let leftBrace = withWhitespace (Parsimmon.str \"{\")\n let rightBrace = withWhitespace (Parsimmon.str \"}\")\n \n let keyValues = \n Parsimmon.seq3 \n (withWhitespace stringLiteral)\n (withWhitespace (Parsimmon.str \":\"))\n (withWhitespace json)\n |> Parsimmon.map (fun (key, _ , value) -> key,value)\n |> Parsimmon.seperateBy comma\n\n let jobject = \n keyValues\n |> Parsimmon.between leftBrace rightBrace\n |> Parsimmon.map (List.ofArray >> Map.ofList >> JObject)\n\n [jvalue; jarray; jobject]\n |> Parsimmon.choose\n \n let jsonParser = withWhitespace json\n","// Adapted from https://github.com/MikeMcl/big.js/blob/0f94dc9110d55c4f324a47ba6a2e832ce23ac589/big.mjs\n/* tslint:disable */\nimport { combineHashCodes } from \"../Util.js\";\nimport { symbol } from \"../Numeric.js\";\n// The shared prototype object.\nvar P = {\n GetHashCode() { return combineHashCodes([this.s, this.e].concat(this.c)); },\n Equals(x) { return !this.cmp(x); },\n CompareTo(x) { return this.cmp(x); },\n [symbol]() {\n const _this = this;\n return {\n multiply: y => _this.mul(y),\n toPrecision: sd => _this.toPrecision(sd),\n toExponential: dp => _this.toExponential(dp),\n toFixed: dp => _this.toFixed(dp),\n toHex: () => (Number(_this) >>> 0).toString(16),\n };\n }\n};\n/*\n * big.js v6.0.3\n * A small, fast, easy-to-use library for arbitrary-precision decimal arithmetic.\n * Copyright (c) 2020 Michael Mclaughlin\n * https://github.com/MikeMcl/big.js/LICENCE.md\n */\n/************************************** EDITABLE DEFAULTS *****************************************/\n// The default values below must be integers within the stated ranges.\n/*\n * The maximum number of decimal places (DP) of the results of operations involving division:\n * div and sqrt, and pow with negative exponents.\n */\nvar DP = 28, // 0 to MAX_DP\n/*\n * The rounding mode (RM) used when rounding to the above decimal places.\n *\n * 0 Towards zero (i.e. truncate, no rounding). (ROUND_DOWN)\n * 1 To nearest neighbour. If equidistant, round up. (ROUND_HALF_UP)\n * 2 To nearest neighbour. If equidistant, to even. (ROUND_HALF_EVEN)\n * 3 Away from zero. (ROUND_UP)\n */\nRM = 1, // 0, 1, 2 or 3\n// The maximum value of DP and Big.DP.\nMAX_DP = 1E6, // 0 to 1000000\n// The maximum magnitude of the exponent argument to the pow method.\nMAX_POWER = 1E6, // 1 to 1000000\n/*\n * The negative exponent (NE) at and beneath which toString returns exponential notation.\n * (JavaScript numbers: -7)\n * -1000000 is the minimum recommended exponent value of a Big.\n */\nNE = -29, // 0 to -1000000\n/*\n * The positive exponent (PE) at and above which toString returns exponential notation.\n * (JavaScript numbers: 21)\n * 1000000 is the maximum recommended exponent value of a Big, but this limit is not enforced.\n */\nPE = 29, // 0 to 1000000\n/*\n * When true, an error will be thrown if a primitive number is passed to the Big constructor,\n * or if valueOf is called, or if toNumber is called on a Big which cannot be converted to a\n * primitive number without a loss of precision.\n */\nSTRICT = false, // true or false\n/**************************************************************************************************/\n// Error messages.\nNAME = '[big.js] ', INVALID = NAME + 'Invalid ', INVALID_DP = INVALID + 'decimal places', INVALID_RM = INVALID + 'rounding mode', DIV_BY_ZERO = NAME + 'Division by zero', UNDEFINED = void 0, NUMERIC = /^-?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i;\n/*\n * Create and return a Big constructor.\n */\nfunction _Big_() {\n /*\n * The Big constructor and exported function.\n * Create and return a new instance of a Big number object.\n *\n * n {number|string|Big} A numeric value.\n */\n function Big(n) {\n var x = this;\n // Enable constructor usage without new.\n if (!(x instanceof Big))\n return n === UNDEFINED ? _Big_() : new Big(n);\n // Duplicate.\n if (n instanceof Big) {\n x.s = n.s;\n x.e = n.e;\n x.c = n.c.slice();\n normalize(x);\n }\n else {\n if (typeof n !== 'string') {\n if (Big.strict === true) {\n throw TypeError(INVALID + 'number');\n }\n // Minus zero?\n n = n === 0 && 1 / n < 0 ? '-0' : String(n);\n }\n parse(x, n);\n }\n // Retain a reference to this Big constructor.\n // Shadow Big.prototype.constructor which points to Object.\n x.constructor = Big;\n }\n Big.prototype = P;\n Big.DP = DP;\n Big.RM = RM;\n Big.NE = NE;\n Big.PE = PE;\n Big.strict = STRICT;\n return Big;\n}\nfunction normalize(x) {\n // x = round(x, DP, 0);\n if (x.c.length > 1 && !x.c[0]) {\n let i = x.c.findIndex(x => x);\n x.c = x.c.slice(i);\n x.e = x.e - i;\n }\n}\n/*\n * Parse the number or string value passed to a Big constructor.\n *\n * x {Big} A Big number instance.\n * n {number|string} A numeric value.\n */\nfunction parse(x, n) {\n var e, i, nl;\n if (!NUMERIC.test(n)) {\n throw Error(INVALID + 'number');\n }\n // Determine sign.\n x.s = n.charAt(0) == '-' ? (n = n.slice(1), -1) : 1;\n // Decimal point?\n if ((e = n.indexOf('.')) > -1)\n n = n.replace('.', '');\n // Exponential form?\n if ((i = n.search(/e/i)) > 0) {\n // Determine exponent.\n if (e < 0)\n e = i;\n e += +n.slice(i + 1);\n n = n.substring(0, i);\n }\n else if (e < 0) {\n // Integer.\n e = n.length;\n }\n nl = n.length;\n // Determine leading zeros before decimal point.\n for (i = 0; i < e && i < nl && n.charAt(i) == '0';)\n ++i;\n // original version (ignores decimal point).\n // // Determine leading zeros.\n // for (i = 0; i < nl && n.charAt(i) == '0';) ++i;\n if (i == nl) {\n // Zero.\n x.c = [x.e = 0];\n }\n else {\n x.e = e - i - 1;\n x.c = [];\n // Convert string to array of digits without leading zeros\n for (e = 0; i < nl;)\n x.c[e++] = +n.charAt(i++);\n // older version (doesn't keep trailing zeroes).\n // // Determine trailing zeros.\n // for (; nl > 0 && n.charAt(--nl) == '0';);\n // // Convert string to array of digits without leading/trailing zeros.\n // for (e = 0; i <= nl;) x.c[e++] = +n.charAt(i++);\n }\n x = round(x, Big.DP + 1, Big.RM);\n return x;\n}\n/*\n * Round Big x to a maximum of sd significant digits using rounding mode rm.\n *\n * x {Big} The Big to round.\n * sd {number} Significant digits: integer, 0 to MAX_DP inclusive.\n * rm {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).\n * [more] {boolean} Whether the result of division was truncated.\n */\nfunction round(x, sd, rm, more) {\n var xc = x.c;\n if (rm === UNDEFINED)\n rm = Big.RM;\n if (rm !== 0 && rm !== 1 && rm !== 2 && rm !== 3) {\n throw Error(INVALID_RM);\n }\n if (sd < 1) {\n more =\n rm === 3 && (more || !!xc[0]) || sd === 0 && (rm === 1 && xc[0] >= 5 ||\n rm === 2 && (xc[0] > 5 || xc[0] === 5 && (more || xc[1] !== UNDEFINED)));\n xc.length = 1;\n if (more) {\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\n x.e = x.e - sd + 1;\n xc[0] = 1;\n }\n else {\n // Zero.\n xc[0] = x.e = 0;\n }\n }\n else if (sd < xc.length) {\n // xc[sd] is the digit after the digit that may be rounded up.\n const isZero = xc.findIndex((xci, idx) => idx >= sd && xci > 0) < 0;\n more =\n rm === 1 && xc[sd] >= 5 ||\n rm === 2 && (xc[sd] > 5 || xc[sd] === 5 &&\n (more || xc[sd + 1] !== UNDEFINED || xc[sd - 1] & 1)) ||\n rm === 3 && (more || !isZero);\n // Remove any digits after the required precision.\n xc.length = sd--;\n // Round up?\n if (more) {\n // Rounding up may mean the previous digit has to be rounded up.\n for (; ++xc[sd] > 9;) {\n xc[sd] = 0;\n if (!sd--) {\n ++x.e;\n xc.unshift(1);\n }\n }\n }\n // Remove trailing zeros.\n for (sd = xc.length; !xc[--sd];)\n xc.pop();\n }\n return x;\n}\n/*\n * Return a string representing the value of Big x in normal or exponential notation.\n * Handles P.toExponential, P.toFixed, P.toJSON, P.toPrecision, P.toString and P.valueOf.\n */\nfunction stringify(x, doExponential, isNonzero) {\n var e = x.e, s = x.c.join(''), n = s.length;\n // Exponential notation?\n if (doExponential) {\n s = s.charAt(0) + (n > 1 ? '.' + s.slice(1) : '') + (e < 0 ? 'e' : 'e+') + e;\n // Normal notation.\n }\n else if (e < 0) {\n for (; ++e;)\n s = '0' + s;\n s = '0.' + s;\n }\n else if (e > 0) {\n if (++e > n) {\n for (e -= n; e--;)\n s += '0';\n }\n else if (e < n) {\n s = s.slice(0, e) + '.' + s.slice(e);\n }\n }\n else if (n > 1) {\n s = s.charAt(0) + '.' + s.slice(1);\n }\n return x.s < 0 && isNonzero ? '-' + s : s;\n}\n// Prototype/instance methods\n/*\n * Return a new Big whose value is the absolute value of this Big.\n */\nP.abs = function () {\n var x = new this.constructor(this);\n x.s = 1;\n return x;\n};\n/*\n * Return 1 if the value of this Big is greater than the value of Big y,\n * -1 if the value of this Big is less than the value of Big y, or\n * 0 if they have the same value.\n */\nP.cmp = function (y) {\n var isneg, Big = this.constructor, x = new Big(this), y = new Big(y), xc = x.c, yc = y.c, i = x.s, j = y.s, k = x.e, l = y.e;\n // Either zero?\n if (!xc[0] || !yc[0])\n return !xc[0] ? !yc[0] ? 0 : -j : i;\n // Signs differ?\n if (i != j)\n return i;\n isneg = i < 0;\n // Compare exponents.\n if (k != l)\n return k > l ^ isneg ? 1 : -1;\n // Compare digit by digit.\n j = Math.max(xc.length, yc.length);\n for (i = 0; i < j; i++) {\n k = i < xc.length ? xc[i] : 0;\n l = i < yc.length ? yc[i] : 0;\n if (k != l)\n return k > l ^ isneg ? 1 : -1;\n }\n return 0;\n // original version (doesn't compare well trailing zeroes, e.g. 1.0 with 1.00)\n // j = (k = xc.length) < (l = yc.length) ? k : l;\n // // Compare digit by digit.\n // for (i = -1; ++i < j;) {\n // if (xc[i] != yc[i]) return xc[i] > yc[i] ^ isneg ? 1 : -1;\n // }\n // // Compare lengths.\n // return k == l ? 0 : k > l ^ isneg ? 1 : -1;\n};\n/*\n * Return a new Big whose value is the value of this Big divided by the value of Big y, rounded,\n * if necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM.\n */\nP.div = function (y) {\n var Big = this.constructor, x = new Big(this), y = new Big(y), a = x.c, // dividend\n b = y.c, // divisor\n k = x.s == y.s ? 1 : -1, dp = Big.DP;\n if (dp !== ~~dp || dp < 0 || dp > MAX_DP) {\n throw Error(INVALID_DP);\n }\n // Divisor is zero?\n if (!b[0]) {\n throw Error(DIV_BY_ZERO);\n }\n // Dividend is 0? Return +-0.\n if (!a[0]) {\n y.s = k;\n y.c = [y.e = 0];\n return y;\n }\n var bl, bt, n, cmp, ri, bz = b.slice(), ai = bl = b.length, al = a.length, r = a.slice(0, bl), // remainder\n rl = r.length, q = y, // quotient\n qc = q.c = [], qi = 0, p = dp + (q.e = x.e - y.e) + 1; // precision of the result\n q.s = k;\n k = p < 0 ? 0 : p;\n // Create version of divisor with leading zero.\n bz.unshift(0);\n // Add zeros to make remainder as long as divisor.\n for (; rl++ < bl;)\n r.push(0);\n do {\n // n is how many times the divisor goes into current remainder.\n for (n = 0; n < 10; n++) {\n // Compare divisor and remainder.\n if (bl != (rl = r.length)) {\n cmp = bl > rl ? 1 : -1;\n }\n else {\n for (ri = -1, cmp = 0; ++ri < bl;) {\n if (b[ri] != r[ri]) {\n cmp = b[ri] > r[ri] ? 1 : -1;\n break;\n }\n }\n }\n // If divisor < remainder, subtract divisor from remainder.\n if (cmp < 0) {\n // Remainder can't be more than 1 digit longer than divisor.\n // Equalise lengths using divisor with extra leading zero?\n for (bt = rl == bl ? b : bz; rl;) {\n if (r[--rl] < bt[rl]) {\n ri = rl;\n for (; ri && !r[--ri];)\n r[ri] = 9;\n --r[ri];\n r[rl] += 10;\n }\n r[rl] -= bt[rl];\n }\n for (; !r[0];)\n r.shift();\n }\n else {\n break;\n }\n }\n // Add the digit n to the result array.\n qc[qi++] = cmp ? n : ++n;\n // Update the remainder.\n if (r[0] && cmp)\n r[rl] = a[ai] || 0;\n else\n r = [a[ai]];\n } while ((ai++ < al || r[0] !== UNDEFINED) && k--);\n // Leading zero? Do not remove if result is simply zero (qi == 1).\n if (!qc[0] && qi != 1) {\n // There can't be more than one zero.\n qc.shift();\n q.e--;\n p--;\n }\n // Round?\n if (qi > p)\n round(q, p, Big.RM, r[0] !== UNDEFINED);\n return q;\n};\n/*\n * Return true if the value of this Big is equal to the value of Big y, otherwise return false.\n */\nP.eq = function (y) {\n return this.cmp(y) === 0;\n};\n/*\n * Return true if the value of this Big is greater than the value of Big y, otherwise return\n * false.\n */\nP.gt = function (y) {\n return this.cmp(y) > 0;\n};\n/*\n * Return true if the value of this Big is greater than or equal to the value of Big y, otherwise\n * return false.\n */\nP.gte = function (y) {\n return this.cmp(y) > -1;\n};\n/*\n * Return true if the value of this Big is less than the value of Big y, otherwise return false.\n */\nP.lt = function (y) {\n return this.cmp(y) < 0;\n};\n/*\n * Return true if the value of this Big is less than or equal to the value of Big y, otherwise\n * return false.\n */\nP.lte = function (y) {\n return this.cmp(y) < 1;\n};\n/*\n * Return a new Big whose value is the value of this Big minus the value of Big y.\n */\nP.minus = P.sub = function (y) {\n var i, j, t, xlty, Big = this.constructor, x = new Big(this), y = new Big(y), a = x.s, b = y.s;\n // Signs differ?\n if (a != b) {\n y.s = -b;\n return x.plus(y);\n }\n var xc = x.c.slice(), xe = x.e, yc = y.c, ye = y.e;\n // Either zero?\n if (!xc[0] || !yc[0]) {\n if (yc[0]) {\n y.s = -b;\n }\n else if (xc[0]) {\n y = new Big(x);\n }\n else {\n y.s = 1;\n }\n return y;\n }\n // Determine which is the bigger number. Prepend zeros to equalise exponents.\n if (a = xe - ye) {\n if (xlty = a < 0) {\n a = -a;\n t = xc;\n }\n else {\n ye = xe;\n t = yc;\n }\n t.reverse();\n for (b = a; b--;)\n t.push(0);\n t.reverse();\n }\n else {\n // Exponents equal. Check digit by digit.\n j = ((xlty = xc.length < yc.length) ? xc : yc).length;\n for (a = b = 0; b < j; b++) {\n if (xc[b] != yc[b]) {\n xlty = xc[b] < yc[b];\n break;\n }\n }\n }\n // x < y? Point xc to the array of the bigger number.\n if (xlty) {\n t = xc;\n xc = yc;\n yc = t;\n y.s = -y.s;\n }\n /*\n * Append zeros to xc if shorter. No need to add zeros to yc if shorter as subtraction only\n * needs to start at yc.length.\n */\n if ((b = (j = yc.length) - (i = xc.length)) > 0)\n for (; b--;)\n xc[i++] = 0;\n // Subtract yc from xc.\n for (b = i; j > a;) {\n if (xc[--j] < yc[j]) {\n for (i = j; i && !xc[--i];)\n xc[i] = 9;\n --xc[i];\n xc[j] += 10;\n }\n xc[j] -= yc[j];\n }\n // Remove trailing zeros.\n for (; xc[--b] === 0;)\n xc.pop();\n // Remove leading zeros and adjust exponent accordingly.\n for (; xc[0] === 0;) {\n xc.shift();\n --ye;\n }\n if (!xc[0]) {\n // n - n = +0\n y.s = 1;\n // Result must be zero.\n xc = [ye = 0];\n }\n y.c = xc;\n y.e = ye;\n return y;\n};\n/*\n * Return a new Big whose value is the value of this Big modulo the value of Big y.\n */\nP.mod = function (y) {\n var ygtx, Big = this.constructor, x = new Big(this), y = new Big(y), a = x.s, b = y.s;\n if (!y.c[0]) {\n throw Error(DIV_BY_ZERO);\n }\n x.s = y.s = 1;\n ygtx = y.cmp(x) == 1;\n x.s = a;\n y.s = b;\n if (ygtx)\n return new Big(x);\n a = Big.DP;\n b = Big.RM;\n Big.DP = Big.RM = 0;\n x = x.div(y);\n Big.DP = a;\n Big.RM = b;\n return this.minus(x.times(y));\n};\n/*\n * Return a new Big whose value is the value of this Big plus the value of Big y.\n */\nP.plus = P.add = function (y) {\n var e, k, t, Big = this.constructor, x = new Big(this), y = new Big(y);\n // Signs differ?\n if (x.s != y.s) {\n y.s = -y.s;\n return x.minus(y);\n }\n var xe = x.e, xc = x.c, ye = y.e, yc = y.c;\n // Either zero?\n if (!xc[0] || !yc[0]) {\n if (!yc[0]) {\n if (xc[0]) {\n y = new Big(x);\n }\n else {\n y.s = x.s;\n }\n }\n return y;\n }\n xc = xc.slice();\n // Prepend zeros to equalise exponents.\n // Note: reverse faster than unshifts.\n if (e = xe - ye) {\n if (e > 0) {\n ye = xe;\n t = yc;\n }\n else {\n e = -e;\n t = xc;\n }\n t.reverse();\n for (; e--;)\n t.push(0);\n t.reverse();\n }\n // Point xc to the longer array.\n if (xc.length - yc.length < 0) {\n t = yc;\n yc = xc;\n xc = t;\n }\n e = yc.length;\n // Only start adding at yc.length - 1 as the further digits of xc can be left as they are.\n for (k = 0; e; xc[e] %= 10)\n k = (xc[--e] = xc[e] + yc[e] + k) / 10 | 0;\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\n if (k) {\n xc.unshift(k);\n ++ye;\n }\n // Remove trailing zeros.\n for (e = xc.length; xc[--e] === 0;)\n xc.pop();\n y.c = xc;\n y.e = ye;\n return y;\n};\n/*\n * Return a Big whose value is the value of this Big raised to the power n.\n * If n is negative, round to a maximum of Big.DP decimal places using rounding\n * mode Big.RM.\n *\n * n {number} Integer, -MAX_POWER to MAX_POWER inclusive.\n */\nP.pow = function (n) {\n var Big = this.constructor, x = new Big(this), y = new Big('1'), one = new Big('1'), isneg = n < 0;\n if (n !== ~~n || n < -MAX_POWER || n > MAX_POWER) {\n throw Error(INVALID + 'exponent');\n }\n if (isneg)\n n = -n;\n for (;;) {\n if (n & 1)\n y = y.times(x);\n n >>= 1;\n if (!n)\n break;\n x = x.times(x);\n }\n return isneg ? one.div(y) : y;\n};\n/*\n * Return a new Big whose value is the value of this Big rounded to a maximum precision of sd\n * significant digits using rounding mode rm, or Big.RM if rm is not specified.\n *\n * sd {number} Significant digits: integer, 1 to MAX_DP inclusive.\n * rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).\n */\nP.prec = function (sd, rm) {\n if (sd !== ~~sd || sd < 1 || sd > MAX_DP) {\n throw Error(INVALID + 'precision');\n }\n return round(new this.constructor(this), sd, rm);\n};\n/*\n * Return a new Big whose value is the value of this Big rounded to a maximum of dp decimal places\n * using rounding mode rm, or Big.RM if rm is not specified.\n * If dp is negative, round to an integer which is a multiple of 10**-dp.\n * If dp is not specified, round to 0 decimal places.\n *\n * dp? {number} Integer, -MAX_DP to MAX_DP inclusive.\n * rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).\n */\nP.round = function (dp, rm) {\n if (dp === UNDEFINED)\n dp = 0;\n else if (dp !== ~~dp || dp < -MAX_DP || dp > MAX_DP) {\n throw Error(INVALID_DP);\n }\n return round(new this.constructor(this), dp + this.e + 1, rm);\n};\n/*\n * Return a new Big whose value is the square root of the value of this Big, rounded, if\n * necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM.\n */\nP.sqrt = function () {\n var r, c, t, Big = this.constructor, x = new Big(this), s = x.s, e = x.e, half = new Big('0.5');\n // Zero?\n if (!x.c[0])\n return new Big(x);\n // Negative?\n if (s < 0) {\n throw Error(NAME + 'No square root');\n }\n // Estimate.\n s = Math.sqrt(x + '');\n // Math.sqrt underflow/overflow?\n // Re-estimate: pass x coefficient to Math.sqrt as integer, then adjust the result exponent.\n if (s === 0 || s === 1 / 0) {\n c = x.c.join('');\n if (!(c.length + e & 1))\n c += '0';\n s = Math.sqrt(c);\n e = ((e + 1) / 2 | 0) - (e < 0 || e & 1);\n r = new Big((s == 1 / 0 ? '5e' : (s = s.toExponential()).slice(0, s.indexOf('e') + 1)) + e);\n }\n else {\n r = new Big(s + '');\n }\n e = r.e + (Big.DP += 4);\n // Newton-Raphson iteration.\n do {\n t = r;\n r = half.times(t.plus(x.div(t)));\n } while (t.c.slice(0, e).join('') !== r.c.slice(0, e).join(''));\n return round(r, (Big.DP -= 4) + r.e + 1, Big.RM);\n};\n/*\n * Return a new Big whose value is the value of this Big times the value of Big y.\n */\nP.times = P.mul = function (y) {\n var c, Big = this.constructor, x = new Big(this), y = new Big(y), xc = x.c, yc = y.c, a = xc.length, b = yc.length, i = x.e, j = y.e;\n // Determine sign of result.\n y.s = x.s == y.s ? 1 : -1;\n // Return signed 0 if either 0.\n if (!xc[0] || !yc[0]) {\n y.c = [y.e = 0];\n return y;\n }\n // Initialise exponent of result as x.e + y.e.\n y.e = i + j;\n // If array xc has fewer digits than yc, swap xc and yc, and lengths.\n if (a < b) {\n c = xc;\n xc = yc;\n yc = c;\n j = a;\n a = b;\n b = j;\n }\n // Initialise coefficient array of result with zeros.\n for (c = new Array(j = a + b); j--;)\n c[j] = 0;\n // Multiply.\n // i is initially xc.length.\n for (i = b; i--;) {\n b = 0;\n // a is yc.length.\n for (j = a + i; j > i;) {\n // Current sum of products at this digit position, plus carry.\n b = c[j] + yc[i] * xc[j - i - 1] + b;\n c[j--] = b % 10;\n // carry\n b = b / 10 | 0;\n }\n c[j] = b;\n }\n // Increment result exponent if there is a final carry, otherwise remove leading zero.\n if (b)\n ++y.e;\n else\n c.shift();\n // Remove trailing zeros.\n for (i = c.length; !c[--i];)\n c.pop();\n y.c = c;\n return y;\n};\n/*\n * Return a string representing the value of this Big in exponential notation rounded to dp fixed\n * decimal places using rounding mode rm, or Big.RM if rm is not specified.\n *\n * dp? {number} Decimal places: integer, 0 to MAX_DP inclusive.\n * rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).\n */\nP.toExponential = function (dp, rm) {\n var x = this, n = x.c[0];\n if (dp !== UNDEFINED) {\n if (dp !== ~~dp || dp < 0 || dp > MAX_DP) {\n throw Error(INVALID_DP);\n }\n x = round(new x.constructor(x), ++dp, rm);\n for (; x.c.length < dp;)\n x.c.push(0);\n }\n return stringify(x, true, !!n);\n};\n/*\n * Return a string representing the value of this Big in normal notation rounded to dp fixed\n * decimal places using rounding mode rm, or Big.RM if rm is not specified.\n *\n * dp? {number} Decimal places: integer, 0 to MAX_DP inclusive.\n * rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).\n *\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\n */\nP.toFixed = function (dp, rm) {\n var x = this, n = x.c[0];\n if (dp !== UNDEFINED) {\n if (dp !== ~~dp || dp < 0 || dp > MAX_DP) {\n throw Error(INVALID_DP);\n }\n x = round(new x.constructor(x), dp + x.e + 1, rm);\n // x.e may have changed if the value is rounded up.\n for (dp = dp + x.e + 1; x.c.length < dp;)\n x.c.push(0);\n }\n return stringify(x, false, !!n);\n};\n/*\n * Return a string representing the value of this Big.\n * Return exponential notation if this Big has a positive exponent equal to or greater than\n * Big.PE, or a negative exponent equal to or less than Big.NE.\n * Omit the sign for negative zero.\n */\nP.toJSON = P.toString = function () {\n var x = this, Big = x.constructor;\n return stringify(x, x.e <= Big.NE || x.e >= Big.PE, !!x.c[0]);\n};\n/*\n * Return the value of this Big as a primitve number.\n */\nP.toNumber = function () {\n var n = Number(stringify(this, true, true));\n if (this.constructor.strict === true && !this.eq(n.toString())) {\n throw Error(NAME + 'Imprecise conversion');\n }\n return n;\n};\n/*\n * Return a string representing the value of this Big rounded to sd significant digits using\n * rounding mode rm, or Big.RM if rm is not specified.\n * Use exponential notation if sd is less than the number of digits necessary to represent\n * the integer part of the value in normal notation.\n *\n * sd {number} Significant digits: integer, 1 to MAX_DP inclusive.\n * rm? {number} Rounding mode: 0 (down), 1 (half-up), 2 (half-even) or 3 (up).\n */\nP.toPrecision = function (sd, rm) {\n var x = this, Big = x.constructor, n = x.c[0];\n if (sd !== UNDEFINED) {\n if (sd !== ~~sd || sd < 1 || sd > MAX_DP) {\n throw Error(INVALID + 'precision');\n }\n x = round(new Big(x), sd, rm);\n for (; x.c.length < sd;)\n x.c.push(0);\n }\n return stringify(x, sd <= x.e || x.e <= Big.NE || x.e >= Big.PE, !!n);\n};\n/*\n * Return a string representing the value of this Big.\n * Return exponential notation if this Big has a positive exponent equal to or greater than\n * Big.PE, or a negative exponent equal to or less than Big.NE.\n * Include the sign for negative zero.\n */\nP.valueOf = function () {\n var x = this, Big = x.constructor;\n if (Big.strict === true) {\n throw Error(NAME + 'valueOf disallowed');\n }\n return stringify(x, x.e <= Big.NE || x.e >= Big.PE, true);\n};\n// Export\nexport var Big = _Big_();\n/// \nexport default Big;\n","import Decimal from \"./lib/big.js\";\nimport { FSharpRef } from \"./Types.js\";\nexport default Decimal;\nexport const get_Zero = new Decimal(0);\nexport const get_One = new Decimal(1);\nexport const get_MinusOne = new Decimal(-1);\nexport const get_MaxValue = new Decimal(\"79228162514264337593543950335\");\nexport const get_MinValue = new Decimal(\"-79228162514264337593543950335\");\nexport function compare(x, y) {\n return x.cmp(y);\n}\nexport function equals(x, y) {\n return !x.cmp(y);\n}\nexport function abs(x) {\n return x.abs();\n}\nexport function round(x, digits = 0) {\n return x.round(digits, 2 /* ROUND_HALF_EVEN */);\n}\nexport function truncate(x) {\n return x.round(0, 0 /* ROUND_DOWN */);\n}\nexport function ceiling(x) {\n return x.round(0, x.cmp(0) >= 0 ? 3 /* ROUND_UP */ : 0 /* ROUND_DOWN */);\n}\nexport function floor(x) {\n return x.round(0, x.cmp(0) >= 0 ? 0 /* ROUND_DOWN */ : 3 /* ROUND_UP */);\n}\nexport function pow(x, n) {\n return x.pow(n);\n}\nexport function sqrt(x) {\n return x.sqrt();\n}\nexport function op_Addition(x, y) {\n return x.add(y);\n}\nexport function op_Subtraction(x, y) {\n return x.sub(y);\n}\nexport function op_Multiply(x, y) {\n return x.mul(y);\n}\nexport function op_Division(x, y) {\n return x.div(y);\n}\nexport function op_Modulus(x, y) {\n return x.mod(y);\n}\nexport function op_UnaryNegation(x) {\n const x2 = new Decimal(x);\n x2.s = -x2.s || 0;\n return x2;\n}\nexport const add = op_Addition;\nexport const subtract = op_Subtraction;\nexport const multiply = op_Multiply;\nexport const divide = op_Division;\nexport const remainder = op_Modulus;\nexport const negate = op_UnaryNegation;\nexport function toString(x) {\n return x.toString();\n}\nexport function tryParse(str, defValue) {\n try {\n defValue.contents = new Decimal(str.trim());\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nexport function parse(str) {\n const defValue = new FSharpRef(get_Zero);\n if (tryParse(str, defValue)) {\n return defValue.contents;\n }\n else {\n throw new Error(\"Input string was not in a correct format.\");\n }\n}\nexport function toNumber(x) {\n return +x;\n}\nfunction decimalToHex(dec, bitSize) {\n const hex = new Uint8Array(bitSize / 4 | 0);\n let hexCount = 1;\n for (let d = 0; d < dec.length; d++) {\n let value = dec[d];\n for (let i = 0; i < hexCount; i++) {\n const digit = hex[i] * 10 + value | 0;\n hex[i] = digit & 0xF;\n value = digit >> 4;\n }\n if (value !== 0) {\n hex[hexCount++] = value;\n }\n }\n return hex.slice(0, hexCount); // digits in reverse order\n}\nfunction hexToDecimal(hex, bitSize) {\n const dec = new Uint8Array(bitSize * 301 / 1000 + 1 | 0);\n let decCount = 1;\n for (let d = hex.length - 1; d >= 0; d--) {\n let carry = hex[d];\n for (let i = 0; i < decCount; i++) {\n const val = dec[i] * 16 + carry | 0;\n dec[i] = (val % 10) | 0;\n carry = (val / 10) | 0;\n }\n while (carry > 0) {\n dec[decCount++] = (carry % 10) | 0;\n carry = (carry / 10) | 0;\n }\n }\n return dec.slice(0, decCount); // digits in reverse order\n}\nfunction setInt32Bits(hexDigits, bits, offset) {\n for (let i = 0; i < 8; i++) {\n hexDigits[offset + i] = (bits >> (i * 4)) & 0xF;\n }\n}\nfunction getInt32Bits(hexDigits, offset) {\n let bits = 0;\n for (let i = 0; i < 8; i++) {\n bits = bits | (hexDigits[offset + i] << (i * 4));\n }\n return bits;\n}\nexport function fromIntArray(bits) {\n return fromInts(bits[0], bits[1], bits[2], bits[3]);\n}\nexport function fromInts(low, mid, high, signExp) {\n const isNegative = signExp < 0;\n const scale = (signExp >> 16) & 0x7F;\n return fromParts(low, mid, high, isNegative, scale);\n}\nexport function fromParts(low, mid, high, isNegative, scale) {\n const bitSize = 96;\n const hexDigits = new Uint8Array(bitSize / 4);\n setInt32Bits(hexDigits, low, 0);\n setInt32Bits(hexDigits, mid, 8);\n setInt32Bits(hexDigits, high, 16);\n const decDigits = hexToDecimal(hexDigits, bitSize);\n scale = scale & 0x7F;\n const big = new Decimal(0);\n big.c = Array.from(decDigits.reverse());\n big.e = decDigits.length - scale - 1;\n big.s = isNegative ? -1 : 1;\n const d = new Decimal(big);\n return d;\n}\nexport function getBits(d) {\n const bitSize = 96;\n const decDigits = Uint8Array.from(d.c);\n const hexDigits = decimalToHex(decDigits, bitSize);\n const low = getInt32Bits(hexDigits, 0);\n const mid = getInt32Bits(hexDigits, 8);\n const high = getInt32Bits(hexDigits, 16);\n const decStr = d.toString();\n const dotPos = decStr.indexOf(\".\");\n const scale = dotPos < 0 ? 0 : decStr.length - dotPos - 1;\n const signExp = ((scale & 0x7F) << 16) | (d.s < 0 ? 0x80000000 : 0);\n return [low, mid, high, signExp];\n}\n// export function makeRangeStepFunction(step: Decimal, last: Decimal) {\n// const stepComparedWithZero = step.cmp(get_Zero);\n// if (stepComparedWithZero === 0) {\n// throw new Error(\"The step of a range cannot be zero\");\n// }\n// const stepGreaterThanZero = stepComparedWithZero > 0;\n// return (x: Decimal) => {\n// const comparedWithLast = x.cmp(last);\n// if ((stepGreaterThanZero && comparedWithLast <= 0)\n// || (!stepGreaterThanZero && comparedWithLast >= 0)) {\n// return [x, op_Addition(x, step)];\n// } else {\n// return undefined;\n// }\n// };\n// }\n","import { Record } from \"../Types.js\";\nimport { record_type, array_type, int32_type } from \"../Reflection.js\";\nimport { op_LeftShift, op_BitwiseAnd, op_Addition, compare, op_Subtraction, op_Division, equals, fromInteger, op_Multiply, op_Modulus, toInt, fromBits } from \"../Long.js\";\nimport { copy, initialize, map, fill } from \"../Array.js\";\nimport { toArray, empty, head, tail, isEmpty, cons } from \"../List.js\";\nimport { int32ToString } from \"../Util.js\";\nimport { isNullOrEmpty, join } from \"../String.js\";\n\nexport class BigNat extends Record {\n constructor(bound, digits) {\n super();\n this.bound = (bound | 0);\n this.digits = digits;\n }\n}\n\nexport function BigNat$reflection() {\n return record_type(\"BigInt.BigNat\", [], BigNat, () => [[\"bound\", int32_type], [\"digits\", array_type(int32_type)]]);\n}\n\nexport function BigNatModule_FFT_pow32(x_mut, n_mut) {\n BigNatModule_FFT_pow32:\n while (true) {\n const x = x_mut, n = n_mut;\n if (n === 0) {\n return 1;\n }\n else if ((n % 2) === 0) {\n x_mut = (x * x);\n n_mut = (~(~(n / 2)));\n continue BigNatModule_FFT_pow32;\n }\n else {\n return (x * BigNatModule_FFT_pow32(x * x, ~(~(n / 2)))) | 0;\n }\n break;\n }\n}\n\nexport function BigNatModule_FFT_leastBounding2Power(b) {\n const findBounding2Power = (b_1_mut, tp_mut, i_mut) => {\n findBounding2Power:\n while (true) {\n const b_1 = b_1_mut, tp = tp_mut, i = i_mut;\n if (b_1 <= tp) {\n return [tp, i];\n }\n else {\n b_1_mut = b_1;\n tp_mut = (tp * 2);\n i_mut = (i + 1);\n continue findBounding2Power;\n }\n break;\n }\n };\n return findBounding2Power(b, 1, 0);\n}\n\nexport const BigNatModule_FFT_p = fromBits(2013265921, 0, false);\n\nconst BigNatModule_FFT_patternInput$004075 = [27, 15, 31, 440564289];\n\nexport const BigNatModule_FFT_w = BigNatModule_FFT_patternInput$004075[3];\n\nexport const BigNatModule_FFT_m = BigNatModule_FFT_patternInput$004075[1];\n\nexport const BigNatModule_FFT_k = BigNatModule_FFT_patternInput$004075[0];\n\nexport const BigNatModule_FFT_g = BigNatModule_FFT_patternInput$004075[2];\n\nexport const BigNatModule_FFT_primeP = BigNatModule_FFT_p;\n\nexport const BigNatModule_FFT_maxBitsInsideFp = 30;\n\nexport const BigNatModule_FFT_Fp_p = 2013265921;\n\nexport const BigNatModule_FFT_Fp_p64 = fromBits(2013265921, 0, true);\n\nexport function BigNatModule_FFT_Fp_toInt(x) {\n return ~(~x);\n}\n\nexport function BigNatModule_FFT_Fp_ofInt32(x) {\n return x >>> 0;\n}\n\nexport const BigNatModule_FFT_Fp_mzero = 0;\n\nexport const BigNatModule_FFT_Fp_mone = 1;\n\nexport const BigNatModule_FFT_Fp_mtwo = 2;\n\nexport function BigNatModule_FFT_Fp_mpow(x_mut, n_mut) {\n BigNatModule_FFT_Fp_mpow:\n while (true) {\n const x = x_mut, n = n_mut;\n if (n === 0) {\n return BigNatModule_FFT_Fp_mone;\n }\n else if ((n % 2) === 0) {\n x_mut = (toInt(op_Modulus(op_Multiply(fromInteger(x, true, 6), fromInteger(x, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0);\n n_mut = (~(~(n / 2)));\n continue BigNatModule_FFT_Fp_mpow;\n }\n else {\n const y_2 = BigNatModule_FFT_Fp_mpow(toInt(op_Modulus(op_Multiply(fromInteger(x, true, 6), fromInteger(x, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0, ~(~(n / 2)));\n return toInt(op_Modulus(op_Multiply(fromInteger(x, true, 6), fromInteger(y_2, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0;\n }\n break;\n }\n}\n\nexport function BigNatModule_FFT_Fp_mpowL(x_mut, n_mut) {\n BigNatModule_FFT_Fp_mpowL:\n while (true) {\n const x = x_mut, n = n_mut;\n if (equals(n, fromBits(0, 0, false))) {\n return BigNatModule_FFT_Fp_mone;\n }\n else if (equals(op_Modulus(n, fromBits(2, 0, false)), fromBits(0, 0, false))) {\n x_mut = (toInt(op_Modulus(op_Multiply(fromInteger(x, true, 6), fromInteger(x, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0);\n n_mut = op_Division(n, fromBits(2, 0, false));\n continue BigNatModule_FFT_Fp_mpowL;\n }\n else {\n const y_2 = BigNatModule_FFT_Fp_mpowL(toInt(op_Modulus(op_Multiply(fromInteger(x, true, 6), fromInteger(x, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0, op_Division(n, fromBits(2, 0, false)));\n return toInt(op_Modulus(op_Multiply(fromInteger(x, true, 6), fromInteger(y_2, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0;\n }\n break;\n }\n}\n\nexport function BigNatModule_FFT_Fp_m2PowNthRoot(n) {\n return BigNatModule_FFT_Fp_mpow(BigNatModule_FFT_w >>> 0, BigNatModule_FFT_pow32(2, BigNatModule_FFT_k - n));\n}\n\nexport function BigNatModule_FFT_Fp_minv(x) {\n return BigNatModule_FFT_Fp_mpowL(x, op_Subtraction(BigNatModule_FFT_primeP, fromBits(2, 0, false)));\n}\n\nexport function BigNatModule_FFT_computeFFT(lambda, mu, n, w, u, res, offset) {\n let x_1, x_3, y_5;\n if (n === 1) {\n res[offset] = u[mu];\n }\n else {\n const halfN = (~(~(n / 2))) | 0;\n const ww = toInt(op_Modulus(op_Multiply(fromInteger(w, true, 6), fromInteger(w, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0;\n const offsetHalfN = (offset + halfN) | 0;\n BigNatModule_FFT_computeFFT(lambda * 2, mu, halfN, ww, u, res, offset);\n BigNatModule_FFT_computeFFT(lambda * 2, lambda + mu, halfN, ww, u, res, offsetHalfN);\n let wj = BigNatModule_FFT_Fp_mone;\n for (let j = 0; j <= (halfN - 1); j++) {\n const even = res[offset + j];\n const odd = res[offsetHalfN + j];\n res[offset + j] = ((even + ((x_1 = wj, toInt(op_Modulus(op_Multiply(fromInteger(x_1, true, 6), fromInteger(odd, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0))) % BigNatModule_FFT_Fp_p);\n res[offsetHalfN + j] = (((even + BigNatModule_FFT_Fp_p) - ((x_3 = wj, toInt(op_Modulus(op_Multiply(fromInteger(x_3, true, 6), fromInteger(odd, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0))) % BigNatModule_FFT_Fp_p);\n wj = ((y_5 = wj, toInt(op_Modulus(op_Multiply(fromInteger(w, true, 6), fromInteger(y_5, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0));\n }\n }\n}\n\nexport function BigNatModule_FFT_computFftInPlace(n, w, u) {\n const res = fill(new Uint32Array(n), 0, n, BigNatModule_FFT_Fp_mzero);\n BigNatModule_FFT_computeFFT(1, 0, n, w, u, res, 0);\n return res;\n}\n\nexport function BigNatModule_FFT_computeInverseFftInPlace(n, w, uT) {\n const bigKInv = BigNatModule_FFT_Fp_minv(n >>> 0);\n return map((y) => (toInt(op_Modulus(op_Multiply(fromInteger(bigKInv, true, 6), fromInteger(y, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0), BigNatModule_FFT_computFftInPlace(n, BigNatModule_FFT_Fp_minv(w), uT), Uint32Array);\n}\n\nexport const BigNatModule_FFT_maxTwoPower = 29;\n\nexport const BigNatModule_FFT_twoPowerTable = initialize(BigNatModule_FFT_maxTwoPower - 1, (i) => BigNatModule_FFT_pow32(2, i), Int32Array);\n\nexport function BigNatModule_FFT_computeFftPaddedPolynomialProduct(bigK, k, u, v) {\n const w = BigNatModule_FFT_Fp_m2PowNthRoot(k);\n const n = bigK | 0;\n const uT = BigNatModule_FFT_computFftInPlace(n, w, u);\n const vT = BigNatModule_FFT_computFftInPlace(n, w, v);\n return BigNatModule_FFT_computeInverseFftInPlace(n, w, initialize(n, (i) => {\n const x = uT[i];\n const y = vT[i];\n return toInt(op_Modulus(op_Multiply(fromInteger(x, true, 6), fromInteger(y, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0;\n }, Uint32Array));\n}\n\nexport function BigNatModule_FFT_padTo(n, u) {\n const uBound = u.length | 0;\n return initialize(n, (i) => ((i < uBound) ? BigNatModule_FFT_Fp_ofInt32(u[i]) : BigNatModule_FFT_Fp_mzero), Uint32Array);\n}\n\nexport function BigNatModule_FFT_computeFftPolynomialProduct(degu, u, degv, v) {\n const patternInput = BigNatModule_FFT_leastBounding2Power((degu + degv) + 1);\n const bigK = patternInput[0] | 0;\n const w = BigNatModule_FFT_Fp_m2PowNthRoot(patternInput[1]);\n const u_1 = BigNatModule_FFT_padTo(bigK, u);\n const v_1 = BigNatModule_FFT_padTo(bigK, v);\n const n = bigK | 0;\n const uT = BigNatModule_FFT_computFftInPlace(n, w, u_1);\n const vT = BigNatModule_FFT_computFftInPlace(n, w, v_1);\n return map(BigNatModule_FFT_Fp_toInt, BigNatModule_FFT_computeInverseFftInPlace(n, w, initialize(n, (i) => {\n const x = uT[i];\n const y = vT[i];\n return toInt(op_Modulus(op_Multiply(fromInteger(x, true, 6), fromInteger(y, true, 6)), BigNatModule_FFT_Fp_p64)) >>> 0;\n }, Uint32Array)), Int32Array);\n}\n\nexport const BigNatModule_FFT_mzero = BigNatModule_FFT_Fp_mzero;\n\nexport const BigNatModule_FFT_mone = BigNatModule_FFT_Fp_mone;\n\nexport const BigNatModule_FFT_maxFp = ((BigNatModule_FFT_Fp_p + BigNatModule_FFT_Fp_p) - BigNatModule_FFT_mone) % BigNatModule_FFT_Fp_p;\n\nexport function BigNatModule_bound(n) {\n return n.bound;\n}\n\nexport function BigNatModule_setBound(n, v) {\n n.bound = (v | 0);\n}\n\nexport function BigNatModule_coeff(n, i) {\n return n.digits[i];\n}\n\nexport function BigNatModule_coeff64(n, i) {\n return fromInteger(BigNatModule_coeff(n, i), false, 2);\n}\n\nexport function BigNatModule_setCoeff(n, i, v) {\n n.digits[i] = (v | 0);\n}\n\nexport function BigNatModule_pow64(x_mut, n_mut) {\n BigNatModule_pow64:\n while (true) {\n const x = x_mut, n = n_mut;\n if (n === 0) {\n return fromBits(1, 0, false);\n }\n else if ((n % 2) === 0) {\n x_mut = op_Multiply(x, x);\n n_mut = (~(~(n / 2)));\n continue BigNatModule_pow64;\n }\n else {\n return op_Multiply(x, BigNatModule_pow64(op_Multiply(x, x), ~(~(n / 2))));\n }\n break;\n }\n}\n\nexport function BigNatModule_pow32(x_mut, n_mut) {\n BigNatModule_pow32:\n while (true) {\n const x = x_mut, n = n_mut;\n if (n === 0) {\n return 1;\n }\n else if ((n % 2) === 0) {\n x_mut = (x * x);\n n_mut = (~(~(n / 2)));\n continue BigNatModule_pow32;\n }\n else {\n return (x * BigNatModule_pow32(x * x, ~(~(n / 2)))) | 0;\n }\n break;\n }\n}\n\nexport function BigNatModule_hash(n) {\n let res = 0;\n for (let i = 0; i <= (n.bound - 1); i++) {\n res = ((n.digits[i] + (res << 3)) | 0);\n }\n return res | 0;\n}\n\nexport function BigNatModule_maxInt(a, b) {\n if (a < b) {\n return b | 0;\n }\n else {\n return a | 0;\n }\n}\n\nexport function BigNatModule_minInt(a, b) {\n if (a < b) {\n return a | 0;\n }\n else {\n return b | 0;\n }\n}\n\nexport const BigNatModule_baseBits = 24;\n\nexport const BigNatModule_baseN = 16777216;\n\nexport const BigNatModule_baseMask = 16777215;\n\nexport const BigNatModule_baseNi64 = fromBits(16777216, 0, false);\n\nexport const BigNatModule_baseMaski64 = fromBits(16777215, 0, false);\n\nexport const BigNatModule_baseMaskU = fromBits(16777215, 0, true);\n\nexport const BigNatModule_baseMask32A = 16777215;\n\nexport const BigNatModule_baseMask32B = 255;\n\nexport const BigNatModule_baseShift32B = 24;\n\nexport const BigNatModule_baseMask64A = 16777215;\n\nexport const BigNatModule_baseMask64B = 16777215;\n\nexport const BigNatModule_baseMask64C = 65535;\n\nexport const BigNatModule_baseShift64B = 24;\n\nexport const BigNatModule_baseShift64C = 48;\n\nexport function BigNatModule_divbase(x) {\n return ~(~((x >>> 0) >>> BigNatModule_baseBits));\n}\n\nexport function BigNatModule_modbase(x) {\n return x & BigNatModule_baseMask;\n}\n\nexport function BigNatModule_createN(b) {\n return new BigNat(b, new Int32Array(b));\n}\n\nexport function BigNatModule_copyN(x) {\n return new BigNat(x.bound, copy(x.digits));\n}\n\nexport function BigNatModule_normN(n) {\n const findLeastBound = (na_mut, i_mut) => {\n findLeastBound:\n while (true) {\n const na = na_mut, i = i_mut;\n if ((i === -1) ? true : (na[i] !== 0)) {\n return (i + 1) | 0;\n }\n else {\n na_mut = na;\n i_mut = (i - 1);\n continue findLeastBound;\n }\n break;\n }\n };\n const bound = findLeastBound(n.digits, n.bound - 1) | 0;\n n.bound = (bound | 0);\n return n;\n}\n\nexport const BigNatModule_boundInt = 2;\n\nexport const BigNatModule_boundInt64 = 3;\n\nexport const BigNatModule_boundBase = 1;\n\nexport function BigNatModule_embed(x) {\n const x_1 = ((x < 0) ? 0 : x) | 0;\n if (x_1 < BigNatModule_baseN) {\n const r = BigNatModule_createN(1);\n r.digits[0] = (x_1 | 0);\n return BigNatModule_normN(r);\n }\n else {\n const r_1 = BigNatModule_createN(BigNatModule_boundInt);\n for (let i = 0; i <= (BigNatModule_boundInt - 1); i++) {\n r_1.digits[i] = (((~(~(x_1 / BigNatModule_pow32(BigNatModule_baseN, i)))) % BigNatModule_baseN) | 0);\n }\n return BigNatModule_normN(r_1);\n }\n}\n\nexport function BigNatModule_embed64(x) {\n const x_1 = (compare(x, fromBits(0, 0, false)) < 0) ? fromBits(0, 0, false) : x;\n const r = BigNatModule_createN(BigNatModule_boundInt64);\n for (let i = 0; i <= (BigNatModule_boundInt64 - 1); i++) {\n r.digits[i] = ((~(~toInt(op_Modulus(op_Division(x_1, BigNatModule_pow64(BigNatModule_baseNi64, i)), BigNatModule_baseNi64)))) | 0);\n }\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_eval32(n) {\n if (n.bound === 1) {\n return n.digits[0] | 0;\n }\n else {\n let acc = 0;\n for (let i = n.bound - 1; i >= 0; i--) {\n acc = ((n.digits[i] + (BigNatModule_baseN * acc)) | 0);\n }\n return acc | 0;\n }\n}\n\nexport function BigNatModule_eval64(n) {\n if (n.bound === 1) {\n return fromInteger(n.digits[0], false, 2);\n }\n else {\n let acc = fromBits(0, 0, false);\n for (let i = n.bound - 1; i >= 0; i--) {\n acc = op_Addition(fromInteger(n.digits[i], false, 2), op_Multiply(BigNatModule_baseNi64, acc));\n }\n return acc;\n }\n}\n\nexport const BigNatModule_one = BigNatModule_embed(1);\n\nexport const BigNatModule_zero = BigNatModule_embed(0);\n\nexport function BigNatModule_restrictTo(d, n) {\n return new BigNat(BigNatModule_minInt(d, n.bound), n.digits);\n}\n\nexport function BigNatModule_shiftUp(d, n) {\n const m = BigNatModule_createN(n.bound + d);\n for (let i = 0; i <= (n.bound - 1); i++) {\n m.digits[i + d] = (n.digits[i] | 0);\n }\n return m;\n}\n\nexport function BigNatModule_shiftDown(d, n) {\n if ((n.bound - d) <= 0) {\n return BigNatModule_zero;\n }\n else {\n const m = BigNatModule_createN(n.bound - d);\n for (let i = 0; i <= (m.bound - 1); i++) {\n m.digits[i] = (n.digits[i + d] | 0);\n }\n return m;\n }\n}\n\nexport function BigNatModule_degree(n) {\n return n.bound - 1;\n}\n\nexport function BigNatModule_addP(i_mut, n_mut, c_mut, p_mut, q_mut, r_mut) {\n let z, i_1, z_1, i_2;\n BigNatModule_addP:\n while (true) {\n const i = i_mut, n = n_mut, c = c_mut, p = p_mut, q = q_mut, r = r_mut;\n if (i < n) {\n const x = ((((z = p, (i_1 = (i | 0), (i_1 < z.bound) ? z.digits[i_1] : 0))) + ((z_1 = q, (i_2 = (i | 0), (i_2 < z_1.bound) ? z_1.digits[i_2] : 0)))) + c) | 0;\n r.digits[i] = (BigNatModule_modbase(x) | 0);\n i_mut = (i + 1);\n n_mut = n;\n c_mut = BigNatModule_divbase(x);\n p_mut = p;\n q_mut = q;\n r_mut = r;\n continue BigNatModule_addP;\n }\n break;\n }\n}\n\nexport function BigNatModule_add(p, q) {\n const rbound = (1 + BigNatModule_maxInt(p.bound, q.bound)) | 0;\n const r = BigNatModule_createN(rbound);\n BigNatModule_addP(0, rbound, 0, p, q, r);\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_subP(i_mut, n_mut, c_mut, p_mut, q_mut, r_mut) {\n let z, i_1, z_1, i_2;\n BigNatModule_subP:\n while (true) {\n const i = i_mut, n = n_mut, c = c_mut, p = p_mut, q = q_mut, r = r_mut;\n if (i < n) {\n const x = ((((z = p, (i_1 = (i | 0), (i_1 < z.bound) ? z.digits[i_1] : 0))) - ((z_1 = q, (i_2 = (i | 0), (i_2 < z_1.bound) ? z_1.digits[i_2] : 0)))) + c) | 0;\n if (x > 0) {\n r.digits[i] = (BigNatModule_modbase(x) | 0);\n i_mut = (i + 1);\n n_mut = n;\n c_mut = BigNatModule_divbase(x);\n p_mut = p;\n q_mut = q;\n r_mut = r;\n continue BigNatModule_subP;\n }\n else {\n const x_1 = (x + BigNatModule_baseN) | 0;\n r.digits[i] = (BigNatModule_modbase(x_1) | 0);\n i_mut = (i + 1);\n n_mut = n;\n c_mut = (BigNatModule_divbase(x_1) - 1);\n p_mut = p;\n q_mut = q;\n r_mut = r;\n continue BigNatModule_subP;\n }\n }\n else {\n return c !== 0;\n }\n break;\n }\n}\n\nexport function BigNatModule_sub(p, q) {\n const rbound = BigNatModule_maxInt(p.bound, q.bound) | 0;\n const r = BigNatModule_createN(rbound);\n if (BigNatModule_subP(0, rbound, 0, p, q, r)) {\n return BigNatModule_embed(0);\n }\n else {\n return BigNatModule_normN(r);\n }\n}\n\nexport function BigNatModule_isZero(p) {\n return p.bound === 0;\n}\n\nexport function BigNatModule_IsZero(p) {\n return BigNatModule_isZero(p);\n}\n\nexport function BigNatModule_isOne(p) {\n if (p.bound === 1) {\n return p.digits[0] === 1;\n }\n else {\n return false;\n }\n}\n\nexport function BigNatModule_equal(p, q) {\n if (p.bound === q.bound) {\n const check = (pa_mut, qa_mut, i_mut) => {\n check:\n while (true) {\n const pa = pa_mut, qa = qa_mut, i = i_mut;\n if (i === -1) {\n return true;\n }\n else if (pa[i] === qa[i]) {\n pa_mut = pa;\n qa_mut = qa;\n i_mut = (i - 1);\n continue check;\n }\n else {\n return false;\n }\n break;\n }\n };\n return check(p.digits, q.digits, p.bound - 1);\n }\n else {\n return false;\n }\n}\n\nexport function BigNatModule_shiftCompare(p, pn, q, qn) {\n if ((p.bound + pn) < (q.bound + qn)) {\n return -1;\n }\n else if ((p.bound + pn) > (q.bound + pn)) {\n return 1;\n }\n else {\n const check = (pa_mut, qa_mut, i_mut) => {\n check:\n while (true) {\n const pa = pa_mut, qa = qa_mut, i = i_mut;\n if (i === -1) {\n return 0;\n }\n else {\n const pai = ((i < pn) ? 0 : pa[i - pn]) | 0;\n const qai = ((i < qn) ? 0 : qa[i - qn]) | 0;\n if (pai === qai) {\n pa_mut = pa;\n qa_mut = qa;\n i_mut = (i - 1);\n continue check;\n }\n else if (pai < qai) {\n return -1;\n }\n else {\n return 1;\n }\n }\n break;\n }\n };\n return check(p.digits, q.digits, (p.bound + pn) - 1) | 0;\n }\n}\n\nexport function BigNatModule_compare(p, q) {\n if (p.bound < q.bound) {\n return -1;\n }\n else if (p.bound > q.bound) {\n return 1;\n }\n else {\n const check = (pa_mut, qa_mut, i_mut) => {\n check:\n while (true) {\n const pa = pa_mut, qa = qa_mut, i = i_mut;\n if (i === -1) {\n return 0;\n }\n else if (pa[i] === qa[i]) {\n pa_mut = pa;\n qa_mut = qa;\n i_mut = (i - 1);\n continue check;\n }\n else if (pa[i] < qa[i]) {\n return -1;\n }\n else {\n return 1;\n }\n break;\n }\n };\n return check(p.digits, q.digits, p.bound - 1) | 0;\n }\n}\n\nexport function BigNatModule_lt(p, q) {\n return BigNatModule_compare(p, q) === -1;\n}\n\nexport function BigNatModule_gt(p, q) {\n return BigNatModule_compare(p, q) === 1;\n}\n\nexport function BigNatModule_lte(p, q) {\n return BigNatModule_compare(p, q) !== 1;\n}\n\nexport function BigNatModule_gte(p, q) {\n return BigNatModule_compare(p, q) !== -1;\n}\n\nexport function BigNatModule_min(a, b) {\n if (BigNatModule_lt(a, b)) {\n return a;\n }\n else {\n return b;\n }\n}\n\nexport function BigNatModule_max(a, b) {\n if (BigNatModule_lt(a, b)) {\n return b;\n }\n else {\n return a;\n }\n}\n\nexport function BigNatModule_contributeArr(a_mut, i_mut, c_mut) {\n BigNatModule_contributeArr:\n while (true) {\n const a = a_mut, i = i_mut, c = c_mut;\n const x = op_Addition(fromInteger(a[i], false, 2), c);\n const c_1 = op_Division(x, BigNatModule_baseNi64);\n const x_3 = (~(~toInt(op_BitwiseAnd(x, BigNatModule_baseMaski64)))) | 0;\n a[i] = (x_3 | 0);\n if (compare(c_1, fromBits(0, 0, false)) > 0) {\n a_mut = a;\n i_mut = (i + 1);\n c_mut = c_1;\n continue BigNatModule_contributeArr;\n }\n break;\n }\n}\n\nexport function BigNatModule_scale(k, p) {\n const r = BigNatModule_createN(p.bound + BigNatModule_boundInt);\n const k_1 = fromInteger(k, false, 2);\n for (let i = 0; i <= (p.bound - 1); i++) {\n BigNatModule_contributeArr(r.digits, i, op_Multiply(k_1, fromInteger(p.digits[i], false, 2)));\n }\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_mulSchoolBookBothSmall(p, q) {\n const r = BigNatModule_createN(2);\n const rak = op_Multiply(fromInteger(p, false, 2), fromInteger(q, false, 2));\n BigNatModule_setCoeff(r, 0, ~(~toInt(op_BitwiseAnd(rak, BigNatModule_baseMaski64))));\n BigNatModule_setCoeff(r, 1, ~(~toInt(op_Division(rak, BigNatModule_baseNi64))));\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_mulSchoolBookCarry(r_mut, c_mut, k_mut) {\n BigNatModule_mulSchoolBookCarry:\n while (true) {\n const r = r_mut, c = c_mut, k = k_mut;\n if (compare(c, fromBits(0, 0, false)) > 0) {\n const rak = op_Addition(BigNatModule_coeff64(r, k), c);\n BigNatModule_setCoeff(r, k, ~(~toInt(op_BitwiseAnd(rak, BigNatModule_baseMaski64))));\n r_mut = r;\n c_mut = op_Division(rak, BigNatModule_baseNi64);\n k_mut = (k + 1);\n continue BigNatModule_mulSchoolBookCarry;\n }\n break;\n }\n}\n\nexport function BigNatModule_mulSchoolBookOneSmall(p, q) {\n const bp = BigNatModule_bound(p) | 0;\n const r = BigNatModule_createN(bp + 1);\n const q_1 = fromInteger(q, false, 2);\n let c = fromBits(0, 0, false);\n for (let i = 0; i <= (bp - 1); i++) {\n const rak = op_Addition(op_Addition(c, BigNatModule_coeff64(r, i)), op_Multiply(BigNatModule_coeff64(p, i), q_1));\n BigNatModule_setCoeff(r, i, ~(~toInt(op_BitwiseAnd(rak, BigNatModule_baseMaski64))));\n c = op_Division(rak, BigNatModule_baseNi64);\n }\n BigNatModule_mulSchoolBookCarry(r, c, bp);\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_mulSchoolBookNeitherSmall(p, q) {\n const r = BigNatModule_createN(p.bound + q.bound);\n const ra = r.digits;\n for (let i = 0; i <= (p.bound - 1); i++) {\n const pai = fromInteger(p.digits[i], false, 2);\n let c = fromBits(0, 0, false);\n let k = i;\n for (let j = 0; j <= (q.bound - 1); j++) {\n const qaj = fromInteger(q.digits[j], false, 2);\n const rak = op_Addition(op_Addition(fromInteger(ra[k], false, 2), c), op_Multiply(pai, qaj));\n ra[k] = ((~(~toInt(op_BitwiseAnd(rak, BigNatModule_baseMaski64)))) | 0);\n c = op_Division(rak, BigNatModule_baseNi64);\n k = ((k + 1) | 0);\n }\n BigNatModule_mulSchoolBookCarry(r, c, k);\n }\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_mulSchoolBook(p, q) {\n const pSmall = BigNatModule_bound(p) === 1;\n const qSmall = BigNatModule_bound(q) === 1;\n if (pSmall && qSmall) {\n return BigNatModule_mulSchoolBookBothSmall(BigNatModule_coeff(p, 0), BigNatModule_coeff(q, 0));\n }\n else if (pSmall) {\n return BigNatModule_mulSchoolBookOneSmall(q, BigNatModule_coeff(p, 0));\n }\n else if (qSmall) {\n return BigNatModule_mulSchoolBookOneSmall(p, BigNatModule_coeff(q, 0));\n }\n else {\n return BigNatModule_mulSchoolBookNeitherSmall(p, q);\n }\n}\n\nexport class BigNatModule_encoding extends Record {\n constructor(bigL, twoToBigL, k, bigK, bigN, split, splits) {\n super();\n this.bigL = (bigL | 0);\n this.twoToBigL = (twoToBigL | 0);\n this.k = (k | 0);\n this.bigK = (bigK | 0);\n this.bigN = (bigN | 0);\n this.split = (split | 0);\n this.splits = splits;\n }\n}\n\nexport function BigNatModule_encoding$reflection() {\n return record_type(\"BigInt.BigNatModule.encoding\", [], BigNatModule_encoding, () => [[\"bigL\", int32_type], [\"twoToBigL\", int32_type], [\"k\", int32_type], [\"bigK\", int32_type], [\"bigN\", int32_type], [\"split\", int32_type], [\"splits\", array_type(int32_type)]]);\n}\n\nexport function BigNatModule_mkEncoding(bigL, k, bigK, bigN) {\n return new BigNatModule_encoding(bigL, BigNatModule_pow32(2, bigL), k, bigK, bigN, ~(~(BigNatModule_baseBits / bigL)), initialize(~(~(BigNatModule_baseBits / bigL)), (i) => BigNatModule_pow32(2, bigL * i), Int32Array));\n}\n\nexport const BigNatModule_table = [BigNatModule_mkEncoding(1, 28, 268435456, 268435456), BigNatModule_mkEncoding(2, 26, 67108864, 134217728), BigNatModule_mkEncoding(3, 24, 16777216, 50331648), BigNatModule_mkEncoding(4, 22, 4194304, 16777216), BigNatModule_mkEncoding(5, 20, 1048576, 5242880), BigNatModule_mkEncoding(6, 18, 262144, 1572864), BigNatModule_mkEncoding(7, 16, 65536, 458752), BigNatModule_mkEncoding(8, 14, 16384, 131072), BigNatModule_mkEncoding(9, 12, 4096, 36864), BigNatModule_mkEncoding(10, 10, 1024, 10240), BigNatModule_mkEncoding(11, 8, 256, 2816), BigNatModule_mkEncoding(12, 6, 64, 768), BigNatModule_mkEncoding(13, 4, 16, 208)];\n\nexport function BigNatModule_calculateTableTow(bigL) {\n const k = (BigNatModule_FFT_maxBitsInsideFp - (2 * bigL)) | 0;\n const bigK = BigNatModule_pow64(fromBits(2, 0, false), k);\n return [bigL, k, bigK, op_Multiply(bigK, fromInteger(bigL, false, 2))];\n}\n\nexport function BigNatModule_encodingGivenResultBits(bitsRes) {\n const selectFrom = (i_mut) => {\n selectFrom:\n while (true) {\n const i = i_mut;\n if (((i + 1) < BigNatModule_table.length) && (bitsRes < BigNatModule_table[i + 1].bigN)) {\n i_mut = (i + 1);\n continue selectFrom;\n }\n else {\n return BigNatModule_table[i];\n }\n break;\n }\n };\n if (bitsRes >= BigNatModule_table[0].bigN) {\n throw (new Error(\"Product is huge, around 268435456 bits, beyond quickmul\"));\n }\n else {\n return selectFrom(0);\n }\n}\n\nexport const BigNatModule_bitmask = initialize(BigNatModule_baseBits, (i) => (BigNatModule_pow32(2, i) - 1), Int32Array);\n\nexport const BigNatModule_twopowers = initialize(BigNatModule_baseBits, (i) => BigNatModule_pow32(2, i), Int32Array);\n\nexport const BigNatModule_twopowersI64 = initialize(BigNatModule_baseBits, (i) => BigNatModule_pow64(fromBits(2, 0, false), i));\n\nexport function BigNatModule_wordBits(word) {\n const hi = (k_mut) => {\n hi:\n while (true) {\n const k = k_mut;\n if (k === 0) {\n return 0;\n }\n else if ((word & BigNatModule_twopowers[k - 1]) !== 0) {\n return k | 0;\n }\n else {\n k_mut = (k - 1);\n continue hi;\n }\n break;\n }\n };\n return hi(BigNatModule_baseBits) | 0;\n}\n\nexport function BigNatModule_bits(u) {\n if (u.bound === 0) {\n return 0;\n }\n else {\n return ((BigNatModule_degree(u) * BigNatModule_baseBits) + BigNatModule_wordBits(u.digits[BigNatModule_degree(u)])) | 0;\n }\n}\n\nexport function BigNatModule_extractBits(n, enc, bi) {\n let z, i, z_1, i_1, z_2, i_2;\n const biw = (~(~(bi / BigNatModule_baseBits))) | 0;\n const bjw = (~(~(((bi + enc.bigL) - 1) / BigNatModule_baseBits))) | 0;\n if (biw !== bjw) {\n const xbit = (bi % BigNatModule_baseBits) | 0;\n return (((((z = n, (i = (biw | 0), (i < z.bound) ? z.digits[i] : 0))) >> xbit) | (((z_1 = n, (i_1 = (bjw | 0), (i_1 < z_1.bound) ? z_1.digits[i_1] : 0))) << (BigNatModule_baseBits - xbit))) & BigNatModule_bitmask[enc.bigL]) | 0;\n }\n else {\n return ((((z_2 = n, (i_2 = (biw | 0), (i_2 < z_2.bound) ? z_2.digits[i_2] : 0))) >> (bi % BigNatModule_baseBits)) & BigNatModule_bitmask[enc.bigL]) | 0;\n }\n}\n\nexport function BigNatModule_encodePoly(enc, n) {\n const poly = fill(new Uint32Array(enc.bigK), 0, enc.bigK, BigNatModule_FFT_Fp_ofInt32(0));\n const biMax = (n.bound * BigNatModule_baseBits) | 0;\n const encoder = (i_mut, bi_mut) => {\n encoder:\n while (true) {\n const i = i_mut, bi = bi_mut;\n if ((i === enc.bigK) ? true : (bi > biMax)) {\n }\n else {\n const pi = BigNatModule_extractBits(n, enc, bi) | 0;\n poly[i] = BigNatModule_FFT_Fp_ofInt32(pi);\n i_mut = (i + 1);\n bi_mut = (bi + enc.bigL);\n continue encoder;\n }\n break;\n }\n };\n encoder(0, 0);\n return poly;\n}\n\nexport function BigNatModule_decodeResultBits(enc, poly) {\n let n = 0;\n for (let i = 0; i <= (poly.length - 1); i++) {\n if (poly[i] !== BigNatModule_FFT_mzero) {\n n = (i | 0);\n }\n }\n return (((BigNatModule_FFT_maxBitsInsideFp + (enc.bigL * n)) + 1) + 1) | 0;\n}\n\nexport function BigNatModule_decodePoly(enc, poly) {\n const rbound = ((~(~(BigNatModule_decodeResultBits(enc, poly) / BigNatModule_baseBits))) + 1) | 0;\n const r = BigNatModule_createN(rbound);\n const evaluate = (i_mut, j_mut, d_mut) => {\n evaluate:\n while (true) {\n const i = i_mut, j = j_mut, d = d_mut;\n if (i === enc.bigK) {\n }\n else {\n if (j >= rbound) {\n }\n else {\n BigNatModule_contributeArr(r.digits, j, op_Multiply(fromInteger(BigNatModule_FFT_Fp_toInt(poly[i]), false, 2), BigNatModule_twopowersI64[d]));\n }\n const d_1 = (d + enc.bigL) | 0;\n const patternInput = (d_1 >= BigNatModule_baseBits) ? [j + 1, d_1 - BigNatModule_baseBits] : [j, d_1];\n i_mut = (i + 1);\n j_mut = patternInput[0];\n d_mut = patternInput[1];\n continue evaluate;\n }\n break;\n }\n };\n evaluate(0, 0, 0);\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_quickMulUsingFft(u, v) {\n const enc = BigNatModule_encodingGivenResultBits(BigNatModule_bits(u) + BigNatModule_bits(v));\n return BigNatModule_normN(BigNatModule_decodePoly(enc, BigNatModule_FFT_computeFftPaddedPolynomialProduct(enc.bigK, enc.k, BigNatModule_encodePoly(enc, u), BigNatModule_encodePoly(enc, v))));\n}\n\nexport const BigNatModule_minDigitsKaratsuba = 16;\n\nexport function BigNatModule_recMulKaratsuba(mul, p, q) {\n const bmax = BigNatModule_maxInt(p.bound, q.bound) | 0;\n if (bmax > BigNatModule_minDigitsKaratsuba) {\n const k = (~(~(bmax / 2))) | 0;\n const a0 = BigNatModule_restrictTo(k, p);\n const a1 = BigNatModule_shiftDown(k, p);\n const b0 = BigNatModule_restrictTo(k, q);\n const b1 = BigNatModule_shiftDown(k, q);\n const q0 = mul(a0, b0);\n const q1 = mul(BigNatModule_add(a0, a1), BigNatModule_add(b0, b1));\n const q2 = mul(a1, b1);\n return BigNatModule_add(q0, BigNatModule_shiftUp(k, BigNatModule_add(BigNatModule_sub(q1, BigNatModule_add(q0, q2)), BigNatModule_shiftUp(k, q2))));\n }\n else {\n return BigNatModule_mulSchoolBook(p, q);\n }\n}\n\nexport function BigNatModule_mulKaratsuba(x, y) {\n return BigNatModule_recMulKaratsuba(BigNatModule_mulKaratsuba, x, y);\n}\n\nexport const BigNatModule_productDigitsUpperSchoolBook = ~(~(64000 / BigNatModule_baseBits));\n\nexport const BigNatModule_singleDigitForceSchoolBook = ~(~(32000 / BigNatModule_baseBits));\n\nexport const BigNatModule_productDigitsUpperFft = ~(~(BigNatModule_table[0].bigN / BigNatModule_baseBits));\n\nexport function BigNatModule_mul(p, q) {\n return BigNatModule_mulSchoolBook(p, q);\n}\n\nexport function BigNatModule_scaleSubInPlace(x, f, a, n) {\n const patternInput = [x.digits, BigNatModule_degree(x)];\n const x_1 = patternInput[0];\n const patternInput_1 = [a.digits, BigNatModule_degree(a)];\n const ad = patternInput_1[1] | 0;\n const a_1 = patternInput_1[0];\n const f_1 = fromInteger(f, false, 2);\n let j = 0;\n let z = op_Multiply(f_1, fromInteger(a_1[0], false, 2));\n while ((compare(z, fromBits(0, 0, false)) > 0) ? true : (j < ad)) {\n if (j > patternInput[1]) {\n throw (new Error(\"scaleSubInPlace: pre-condition did not apply, result would be -ve\"));\n }\n let zLo = ~(~toInt(op_BitwiseAnd(z, BigNatModule_baseMaski64)));\n let zHi = op_Division(z, BigNatModule_baseNi64);\n if (zLo <= x_1[j + n]) {\n x_1[j + n] = ((x_1[j + n] - zLo) | 0);\n }\n else {\n x_1[j + n] = ((x_1[j + n] + (BigNatModule_baseN - zLo)) | 0);\n zHi = op_Addition(zHi, fromBits(1, 0, false));\n }\n if (j < ad) {\n z = op_Addition(zHi, op_Multiply(f_1, fromInteger(a_1[j + 1], false, 2)));\n }\n else {\n z = zHi;\n }\n j = ((j + 1) | 0);\n }\n BigNatModule_normN(x);\n}\n\nexport function BigNatModule_scaleSub(x, f, a, n) {\n const freshx = BigNatModule_add(x, BigNatModule_zero);\n BigNatModule_scaleSubInPlace(freshx, f, a, n);\n return BigNatModule_normN(freshx);\n}\n\nexport function BigNatModule_scaleAddInPlace(x, f, a, n) {\n const patternInput = [x.digits, BigNatModule_degree(x)];\n const x_1 = patternInput[0];\n const patternInput_1 = [a.digits, BigNatModule_degree(a)];\n const ad = patternInput_1[1] | 0;\n const a_1 = patternInput_1[0];\n const f_1 = fromInteger(f, false, 2);\n let j = 0;\n let z = op_Multiply(f_1, fromInteger(a_1[0], false, 2));\n while ((compare(z, fromBits(0, 0, false)) > 0) ? true : (j < ad)) {\n if (j > patternInput[1]) {\n throw (new Error(\"scaleSubInPlace: pre-condition did not apply, result would be -ve\"));\n }\n let zLo = ~(~toInt(op_BitwiseAnd(z, BigNatModule_baseMaski64)));\n let zHi = op_Division(z, BigNatModule_baseNi64);\n if (zLo < (BigNatModule_baseN - x_1[j + n])) {\n x_1[j + n] = ((x_1[j + n] + zLo) | 0);\n }\n else {\n x_1[j + n] = ((zLo - (BigNatModule_baseN - x_1[j + n])) | 0);\n zHi = op_Addition(zHi, fromBits(1, 0, false));\n }\n if (j < ad) {\n z = op_Addition(zHi, op_Multiply(f_1, fromInteger(a_1[j + 1], false, 2)));\n }\n else {\n z = zHi;\n }\n j = ((j + 1) | 0);\n }\n BigNatModule_normN(x);\n}\n\nexport function BigNatModule_scaleAdd(x, f, a, n) {\n const freshx = BigNatModule_add(x, BigNatModule_zero);\n BigNatModule_scaleAddInPlace(freshx, f, a, n);\n return BigNatModule_normN(freshx);\n}\n\nexport function BigNatModule_removeFactor(x, a, n) {\n const patternInput = [BigNatModule_degree(a), BigNatModule_degree(x)];\n const degx = patternInput[1] | 0;\n const dega = patternInput[0] | 0;\n if (degx < (dega + n)) {\n return 0;\n }\n else {\n const patternInput_1 = [a.digits, x.digits];\n const xa = patternInput_1[1];\n const aa = patternInput_1[0];\n const f = ((dega === 0) ? ((degx === n) ? (~(~(xa[n] / aa[0]))) : (~(~toInt(op_Division(op_Addition(op_Multiply(fromInteger(xa[degx], false, 2), BigNatModule_baseNi64), fromInteger(xa[degx - 1], false, 2)), fromInteger(aa[0], false, 2)))))) : ((degx === (dega + n)) ? (~(~(xa[degx] / (aa[dega] + 1)))) : (~(~toInt(op_Division(op_Addition(op_Multiply(fromInteger(xa[degx], false, 2), BigNatModule_baseNi64), fromInteger(xa[degx - 1], false, 2)), op_Addition(fromInteger(aa[dega], false, 2), fromBits(1, 0, false)))))))) | 0;\n if (f === 0) {\n if (BigNatModule_shiftCompare(a, n, x, 0) !== 1) {\n return 1;\n }\n else {\n return 0;\n }\n }\n else {\n return f | 0;\n }\n }\n}\n\nexport function BigNatModule_divmod(b, a) {\n if (BigNatModule_isZero(a)) {\n throw (new Error());\n }\n else if (BigNatModule_degree(b) < BigNatModule_degree(a)) {\n return [BigNatModule_zero, b];\n }\n else {\n const x = BigNatModule_copyN(b);\n const d = BigNatModule_createN(((BigNatModule_degree(b) - BigNatModule_degree(a)) + 1) + 1);\n let p = BigNatModule_degree(b);\n const m = BigNatModule_degree(a) | 0;\n let n = p - m;\n const Invariant = (tupledArg) => {\n };\n let finished = false;\n while (!finished) {\n Invariant([d, x, n, p]);\n const f = BigNatModule_removeFactor(x, a, n) | 0;\n if (f > 0) {\n BigNatModule_scaleSubInPlace(x, f, a, n);\n BigNatModule_scaleAddInPlace(d, f, BigNatModule_one, n);\n Invariant([d, x, n, p]);\n }\n else {\n finished = ((f === 0) && (n === 0));\n if (!finished) {\n if (p === (m + n)) {\n Invariant([d, x, n - 1, p]);\n n = ((n - 1) | 0);\n }\n else {\n Invariant([d, x, n - 1, p - 1]);\n n = ((n - 1) | 0);\n p = ((p - 1) | 0);\n }\n }\n }\n }\n return [BigNatModule_normN(d), BigNatModule_normN(x)];\n }\n}\n\nexport function BigNatModule_div(b, a) {\n return BigNatModule_divmod(b, a)[0];\n}\n\nexport function BigNatModule_rem(b, a) {\n return BigNatModule_divmod(b, a)[1];\n}\n\nexport function BigNatModule_bitAnd(a, b) {\n const r = BigNatModule_createN(BigNatModule_minInt(a.bound, b.bound));\n for (let i = 0; i <= (r.bound - 1); i++) {\n r.digits[i] = ((a.digits[i] & b.digits[i]) | 0);\n }\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_bitOr(a, b) {\n const r = BigNatModule_createN(BigNatModule_maxInt(a.bound, b.bound));\n for (let i = 0; i <= (a.bound - 1); i++) {\n r.digits[i] = ((r.digits[i] | a.digits[i]) | 0);\n }\n for (let i_1 = 0; i_1 <= (b.bound - 1); i_1++) {\n r.digits[i_1] = ((r.digits[i_1] | b.digits[i_1]) | 0);\n }\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_bitXor(a, b) {\n const r = BigNatModule_createN(BigNatModule_maxInt(a.bound, b.bound));\n for (let i = 0; i <= (a.bound - 1); i++) {\n r.digits[i] = ((r.digits[i] ^ a.digits[i]) | 0);\n }\n for (let i_1 = 0; i_1 <= (b.bound - 1); i_1++) {\n r.digits[i_1] = ((r.digits[i_1] ^ b.digits[i_1]) | 0);\n }\n return BigNatModule_normN(r);\n}\n\nexport function BigNatModule_hcf(a, b) {\n const hcfloop = (a_1_mut, b_1_mut) => {\n hcfloop:\n while (true) {\n const a_1 = a_1_mut, b_1 = b_1_mut;\n if (BigNatModule_equal(BigNatModule_zero, a_1)) {\n return b_1;\n }\n else {\n a_1_mut = BigNatModule_divmod(b_1, a_1)[1];\n b_1_mut = a_1;\n continue hcfloop;\n }\n break;\n }\n };\n if (BigNatModule_lt(a, b)) {\n return hcfloop(a, b);\n }\n else {\n return hcfloop(b, a);\n }\n}\n\nexport const BigNatModule_two = BigNatModule_embed(2);\n\nexport function BigNatModule_powi(x, n) {\n const power = (acc_mut, x_1_mut, n_1_mut) => {\n power:\n while (true) {\n const acc = acc_mut, x_1 = x_1_mut, n_1 = n_1_mut;\n if (n_1 === 0) {\n return acc;\n }\n else if ((n_1 % 2) === 0) {\n acc_mut = acc;\n x_1_mut = BigNatModule_mul(x_1, x_1);\n n_1_mut = (~(~(n_1 / 2)));\n continue power;\n }\n else {\n acc_mut = BigNatModule_mul(x_1, acc);\n x_1_mut = BigNatModule_mul(x_1, x_1);\n n_1_mut = (~(~(n_1 / 2)));\n continue power;\n }\n break;\n }\n };\n return power(BigNatModule_one, x, n);\n}\n\nexport function BigNatModule_pow(x, n) {\n const power = (acc_mut, x_1_mut, n_1_mut) => {\n power:\n while (true) {\n const acc = acc_mut, x_1 = x_1_mut, n_1 = n_1_mut;\n if (BigNatModule_isZero(n_1)) {\n return acc;\n }\n else {\n const patternInput = BigNatModule_divmod(n_1, BigNatModule_two);\n const ndiv2 = patternInput[0];\n if (BigNatModule_isZero(patternInput[1])) {\n acc_mut = acc;\n x_1_mut = BigNatModule_mul(x_1, x_1);\n n_1_mut = ndiv2;\n continue power;\n }\n else {\n acc_mut = BigNatModule_mul(x_1, acc);\n x_1_mut = BigNatModule_mul(x_1, x_1);\n n_1_mut = ndiv2;\n continue power;\n }\n }\n break;\n }\n };\n return power(BigNatModule_one, x, n);\n}\n\nexport function BigNatModule_toFloat(n) {\n const evalFloat = (acc_mut, k_mut, i_mut) => {\n evalFloat:\n while (true) {\n const acc = acc_mut, k = k_mut, i = i_mut;\n if (i === n.bound) {\n return acc;\n }\n else {\n acc_mut = (acc + (k * n.digits[i]));\n k_mut = (k * BigNatModule_baseN);\n i_mut = (i + 1);\n continue evalFloat;\n }\n break;\n }\n };\n return evalFloat(0, 1, 0);\n}\n\nexport function BigNatModule_ofInt32(n) {\n return BigNatModule_embed(n);\n}\n\nexport function BigNatModule_ofInt64(n) {\n return BigNatModule_embed64(n);\n}\n\nexport function BigNatModule_toUInt32(n) {\n const matchValue = n.bound | 0;\n switch (matchValue) {\n case 0: {\n return 0;\n }\n case 1: {\n const value = n.digits[0] | 0;\n return value >>> 0;\n }\n case 2: {\n const patternInput = [n.digits[0], n.digits[1]];\n const xB = patternInput[1] | 0;\n if (xB > BigNatModule_baseMask32B) {\n throw (new Error());\n }\n return ((patternInput[0] & BigNatModule_baseMask32A) >>> 0) + ((((xB & BigNatModule_baseMask32B) >>> 0) << BigNatModule_baseShift32B) >>> 0);\n }\n default: {\n throw (new Error());\n }\n }\n}\n\nexport function BigNatModule_toUInt64(n) {\n const matchValue = n.bound | 0;\n switch (matchValue) {\n case 0: {\n return fromBits(0, 0, true);\n }\n case 1: {\n return fromInteger(n.digits[0], true, 2);\n }\n case 2: {\n const patternInput = [n.digits[0], n.digits[1]];\n return op_Addition(fromInteger(patternInput[0] & BigNatModule_baseMask64A, true, 2), op_LeftShift(fromInteger(patternInput[1] & BigNatModule_baseMask64B, true, 2), BigNatModule_baseShift64B));\n }\n case 3: {\n const patternInput_1 = [n.digits[0], n.digits[1], n.digits[2]];\n const xC = patternInput_1[2] | 0;\n if (xC > BigNatModule_baseMask64C) {\n throw (new Error());\n }\n return op_Addition(op_Addition(fromInteger(patternInput_1[0] & BigNatModule_baseMask64A, true, 2), op_LeftShift(fromInteger(patternInput_1[1] & BigNatModule_baseMask64B, true, 2), BigNatModule_baseShift64B)), op_LeftShift(fromInteger(xC & BigNatModule_baseMask64C, true, 2), BigNatModule_baseShift64C));\n }\n default: {\n throw (new Error());\n }\n }\n}\n\nexport function BigNatModule_toString(n) {\n const degn = BigNatModule_degree(n) | 0;\n const route = (prior_mut, k_mut, ten2k_mut) => {\n route:\n while (true) {\n const prior = prior_mut, k = k_mut, ten2k = ten2k_mut;\n if (BigNatModule_degree(ten2k) > degn) {\n return cons([k, ten2k], prior);\n }\n else {\n prior_mut = cons([k, ten2k], prior);\n k_mut = (k + 1);\n ten2k_mut = BigNatModule_mul(ten2k, ten2k);\n continue route;\n }\n break;\n }\n };\n const collect = (isLeading_mut, digits_mut, n_1_mut, _arg_mut) => {\n collect:\n while (true) {\n const isLeading = isLeading_mut, digits = digits_mut, n_1 = n_1_mut, _arg = _arg_mut;\n if (!isEmpty(_arg)) {\n const prior_1 = tail(_arg);\n const patternInput = BigNatModule_divmod(n_1, head(_arg)[1]);\n const nL = patternInput[1];\n const nH = patternInput[0];\n if (isLeading && BigNatModule_isZero(nH)) {\n isLeading_mut = isLeading;\n digits_mut = digits;\n n_1_mut = nL;\n _arg_mut = prior_1;\n continue collect;\n }\n else {\n isLeading_mut = isLeading;\n digits_mut = collect(false, digits, nL, prior_1);\n n_1_mut = nH;\n _arg_mut = prior_1;\n continue collect;\n }\n }\n else {\n const n_2 = BigNatModule_eval32(n_1) | 0;\n if (isLeading && (n_2 === 0)) {\n return digits;\n }\n else {\n return cons(int32ToString(n_2), digits);\n }\n }\n break;\n }\n };\n const digits_4 = collect(true, empty(), n, route(empty(), 0, BigNatModule_embed(10)));\n if (isEmpty(digits_4)) {\n return \"0\";\n }\n else {\n return join(\"\", toArray(digits_4));\n }\n}\n\nexport function BigNatModule_ofString(str) {\n const len = str.length | 0;\n if (isNullOrEmpty(str)) {\n throw (new Error(\"empty string\\\\nParameter name: str\"));\n }\n const ten = BigNatModule_embed(10);\n const build = (acc_mut, i_mut) => {\n build:\n while (true) {\n const acc = acc_mut, i = i_mut;\n if (i === len) {\n return acc;\n }\n else {\n const c = str[i];\n const d = (c.charCodeAt(0) - 48) | 0;\n if ((0 <= d) && (d <= 9)) {\n acc_mut = BigNatModule_add(BigNatModule_mul(ten, acc), BigNatModule_embed(d));\n i_mut = (i + 1);\n continue build;\n }\n else {\n throw (new Error());\n }\n }\n break;\n }\n };\n return build(BigNatModule_embed(0), 0);\n}\n\nexport function BigNatModule_isSmall(n) {\n return n.bound <= 1;\n}\n\nexport function BigNatModule_getSmall(n) {\n const z = n;\n const i = 0;\n if (i < z.bound) {\n return z.digits[i] | 0;\n }\n else {\n return 0;\n }\n}\n\nexport function BigNatModule_factorial(n) {\n const productR = (a, b) => {\n if (BigNatModule_equal(a, b)) {\n return a;\n }\n else {\n const m = BigNatModule_div(BigNatModule_add(a, b), BigNatModule_ofInt32(2));\n return BigNatModule_mul(productR(a, m), productR(BigNatModule_add(m, BigNatModule_one), b));\n }\n };\n return productR(BigNatModule_one, n);\n}\n\n","import { BigNatModule_factorial, BigNatModule_ofString, BigNatModule_toFloat, BigNatModule_toUInt64, BigNatModule_toUInt32, BigNatModule_pow, BigNatModule_two, BigNatModule_rem, BigNatModule_lte, BigNatModule_hcf, BigNatModule_bitXor, BigNatModule_bitOr, BigNatModule_bitAnd, BigNatModule_divmod, BigNatModule_mul, BigNatModule_isOne, BigNatModule_sub, BigNatModule_gte, BigNatModule_scale, BigNatModule_one, BigNatModule_add, BigNatModule_ofInt64, BigNatModule_hash, BigNatModule_gt, BigNatModule_lt, BigNatModule_equal, BigNatModule_getSmall, BigNatModule_isSmall, BigNatModule_ofInt32, BigNatModule_toString, BigNatModule_isZero } from \"./n.js\";\nimport { Record, toString } from \"../Types.js\";\nimport { class_type } from \"../Reflection.js\";\nimport { initialize } from \"../Array.js\";\nimport { op_Addition, op_Multiply, fromValue, equals, fromBits, compare, fromInteger, op_UnaryNegation } from \"../Long.js\";\nimport { op_UnaryNegation_Int32 } from \"../Int32.js\";\nimport Decimal from \"../Decimal.js\";\n\nexport class BigInteger extends Record {\n constructor(signInt, v) {\n super();\n this.signInt = (signInt | 0);\n this.v = v;\n }\n toString() {\n const x = this;\n const matchValue = BigInteger__get_SignInt(x) | 0;\n switch (matchValue) {\n case -1: {\n return BigNatModule_isZero(BigInteger__get_V(x)) ? \"0\" : (\"-\" + BigNatModule_toString(BigInteger__get_V(x)));\n }\n case 0: {\n return \"0\";\n }\n case 1: {\n return BigNatModule_toString(BigInteger__get_V(x));\n }\n default: {\n throw (new Error(\"signs should be +/- 1 or 0\"));\n }\n }\n }\n Equals(obj) {\n const this$ = this;\n return (obj instanceof BigInteger) && BigInteger_op_Equality_56F059C0(this$, obj);\n }\n GetHashCode() {\n const x = this;\n return BigInteger_hash_Z665282C2(x) | 0;\n }\n toJSON(_key) {\n const this$ = this;\n return toString(this$);\n }\n CompareTo(obj) {\n const this$ = this;\n if (obj instanceof BigInteger) {\n return BigInteger_compare_56F059C0(this$, obj) | 0;\n }\n else {\n throw (new Error(\"the objects are not comparable\\\\nParameter name: obj\"));\n }\n }\n}\n\nexport function BigInteger$reflection() {\n return class_type(\"BigInt.BigInteger\", void 0, BigInteger, class_type(\"System.ValueType\"));\n}\n\nexport function BigInteger_$ctor_Z2BE94A1(signInt, v) {\n return new BigInteger(signInt, v);\n}\n\n(() => {\n BigInteger.smallLim = 4096;\n BigInteger.smallPosTab = initialize(BigInteger.smallLim, BigNatModule_ofInt32);\n BigInteger.one = BigInteger_$ctor_Z524259A4(1);\n BigInteger.two = BigInteger_$ctor_Z524259A4(2);\n BigInteger.zero = BigInteger_$ctor_Z524259A4(0);\n})();\n\nexport function BigInteger_nat_Z67CCE57D(n) {\n if (BigNatModule_isSmall(n) && (BigNatModule_getSmall(n) < BigInteger.smallLim)) {\n return BigInteger.smallPosTab[BigNatModule_getSmall(n)];\n }\n else {\n return n;\n }\n}\n\nexport function BigInteger_create_Z2BE94A1(s, n) {\n return BigInteger_$ctor_Z2BE94A1(s, BigInteger_nat_Z67CCE57D(n));\n}\n\nexport function BigInteger_posn_Z67CCE57D(n) {\n return BigInteger_$ctor_Z2BE94A1(1, BigInteger_nat_Z67CCE57D(n));\n}\n\nexport function BigInteger_negn_Z67CCE57D(n) {\n return BigInteger_$ctor_Z2BE94A1(-1, BigInteger_nat_Z67CCE57D(n));\n}\n\nexport function BigInteger__get_Sign(x) {\n if (BigInteger__get_IsZero(x)) {\n return 0;\n }\n else {\n return x.signInt | 0;\n }\n}\n\nexport function BigInteger__get_SignInt(x) {\n return x.signInt;\n}\n\nexport function BigInteger__get_V(x) {\n return x.v;\n}\n\nexport function BigInteger_op_Equality_56F059C0(x, y) {\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n let pattern_matching_result;\n if (matchValue[0] === -1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 1;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 8;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 3;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 0) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 6;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 4;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 5;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 2;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 7;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else {\n pattern_matching_result = 9;\n }\n switch (pattern_matching_result) {\n case 0: {\n return BigNatModule_equal(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 1: {\n return BigNatModule_equal(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 2: {\n if (BigNatModule_isZero(BigInteger__get_V(x))) {\n return BigNatModule_isZero(BigInteger__get_V(y));\n }\n else {\n return false;\n }\n }\n case 3: {\n if (BigNatModule_isZero(BigInteger__get_V(x))) {\n return BigNatModule_isZero(BigInteger__get_V(y));\n }\n else {\n return false;\n }\n }\n case 4: {\n return true;\n }\n case 5: {\n return BigNatModule_isZero(BigInteger__get_V(y));\n }\n case 6: {\n return BigNatModule_isZero(BigInteger__get_V(y));\n }\n case 7: {\n return BigNatModule_isZero(BigInteger__get_V(x));\n }\n case 8: {\n return BigNatModule_isZero(BigInteger__get_V(x));\n }\n case 9: {\n throw (new Error(\"signs should be +/- 1 or 0\\\\nParameter name: x\"));\n }\n }\n}\n\nexport function BigInteger_op_Inequality_56F059C0(x, y) {\n return !BigInteger_op_Equality_56F059C0(x, y);\n}\n\nexport function BigInteger_op_LessThan_56F059C0(x, y) {\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n let pattern_matching_result;\n if (matchValue[0] === -1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 1;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 8;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 3;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 0) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 6;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 4;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 5;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 2;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 7;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else {\n pattern_matching_result = 9;\n }\n switch (pattern_matching_result) {\n case 0: {\n return BigNatModule_lt(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 1: {\n return BigNatModule_lt(BigInteger__get_V(y), BigInteger__get_V(x));\n }\n case 2: {\n return false;\n }\n case 3: {\n if (!BigNatModule_isZero(BigInteger__get_V(x))) {\n return true;\n }\n else {\n return !BigNatModule_isZero(BigInteger__get_V(y));\n }\n }\n case 4: {\n return false;\n }\n case 5: {\n return !BigNatModule_isZero(BigInteger__get_V(y));\n }\n case 6: {\n return false;\n }\n case 7: {\n return false;\n }\n case 8: {\n return !BigNatModule_isZero(BigInteger__get_V(x));\n }\n case 9: {\n throw (new Error(\"signs should be +/- 1 or 0\\\\nParameter name: x\"));\n }\n }\n}\n\nexport function BigInteger_op_GreaterThan_56F059C0(x, y) {\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n let pattern_matching_result;\n if (matchValue[0] === -1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 1;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 8;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 3;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 0) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 6;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 4;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 5;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 2;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 7;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else {\n pattern_matching_result = 9;\n }\n switch (pattern_matching_result) {\n case 0: {\n return BigNatModule_gt(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 1: {\n return BigNatModule_gt(BigInteger__get_V(y), BigInteger__get_V(x));\n }\n case 2: {\n if (!BigNatModule_isZero(BigInteger__get_V(x))) {\n return true;\n }\n else {\n return !BigNatModule_isZero(BigInteger__get_V(y));\n }\n }\n case 3: {\n return false;\n }\n case 4: {\n return false;\n }\n case 5: {\n return false;\n }\n case 6: {\n return !BigNatModule_isZero(BigInteger__get_V(y));\n }\n case 7: {\n return !BigNatModule_isZero(BigInteger__get_V(x));\n }\n case 8: {\n return false;\n }\n case 9: {\n throw (new Error(\"signs should be +/- 1 or 0\\\\nParameter name: x\"));\n }\n }\n}\n\nexport function BigInteger_compare_56F059C0(n, nn) {\n if (BigInteger_op_LessThan_56F059C0(n, nn)) {\n return -1;\n }\n else if (BigInteger_op_Equality_56F059C0(n, nn)) {\n return 0;\n }\n else {\n return 1;\n }\n}\n\nexport function BigInteger_hash_Z665282C2(z) {\n if (BigInteger__get_SignInt(z) === 0) {\n return 1;\n }\n else {\n return (BigInteger__get_SignInt(z) + BigNatModule_hash(BigInteger__get_V(z))) | 0;\n }\n}\n\nexport function BigInteger__get_StructuredDisplayString(x) {\n return toString(x);\n}\n\nexport function BigInteger_$ctor_Z524259A4(n) {\n if (n >= 0) {\n return BigInteger_$ctor_Z2BE94A1(1, BigInteger_nat_Z67CCE57D(BigNatModule_ofInt32(n)));\n }\n else if (n === -2147483648) {\n return BigInteger_$ctor_Z2BE94A1(-1, BigInteger_nat_Z67CCE57D(BigNatModule_ofInt64(op_UnaryNegation(fromInteger(n, false, 2)))));\n }\n else {\n return BigInteger_$ctor_Z2BE94A1(-1, BigInteger_nat_Z67CCE57D(BigNatModule_ofInt32(op_UnaryNegation_Int32(n))));\n }\n}\n\nexport function BigInteger_$ctor_Z524259C1(n) {\n if (compare(n, fromBits(0, 0, false)) >= 0) {\n return BigInteger_$ctor_Z2BE94A1(1, BigInteger_nat_Z67CCE57D(BigNatModule_ofInt64(n)));\n }\n else if (equals(n, fromBits(0, 2147483648, false))) {\n return BigInteger_$ctor_Z2BE94A1(-1, BigInteger_nat_Z67CCE57D(BigNatModule_add(BigNatModule_ofInt64(fromBits(4294967295, 2147483647, false)), BigNatModule_one)));\n }\n else {\n return BigInteger_$ctor_Z2BE94A1(-1, BigInteger_nat_Z67CCE57D(BigNatModule_ofInt64(op_UnaryNegation(n))));\n }\n}\n\nexport function BigInteger_get_One() {\n return BigInteger.one;\n}\n\nexport function BigInteger_get_Two() {\n return BigInteger.two;\n}\n\nexport function BigInteger_get_Zero() {\n return BigInteger.zero;\n}\n\nexport function BigInteger_op_UnaryNegation_Z665282C2(z) {\n const matchValue = BigInteger__get_SignInt(z) | 0;\n if (matchValue === 0) {\n return BigInteger_get_Zero();\n }\n else {\n return BigInteger_create_Z2BE94A1(op_UnaryNegation_Int32(matchValue), BigInteger__get_V(z));\n }\n}\n\nexport function BigInteger_Scale_Z320F31E(k, z) {\n if (BigInteger__get_SignInt(z) === 0) {\n return BigInteger_get_Zero();\n }\n else if (k < 0) {\n return BigInteger_create_Z2BE94A1(op_UnaryNegation_Int32(BigInteger__get_SignInt(z)), BigNatModule_scale(op_UnaryNegation_Int32(k), BigInteger__get_V(z)));\n }\n else {\n return BigInteger_create_Z2BE94A1(BigInteger__get_SignInt(z), BigNatModule_scale(k, BigInteger__get_V(z)));\n }\n}\n\nexport function BigInteger_subnn_6A57060(nx, ny) {\n if (BigNatModule_gte(nx, ny)) {\n return BigInteger_posn_Z67CCE57D(BigNatModule_sub(nx, ny));\n }\n else {\n return BigInteger_negn_Z67CCE57D(BigNatModule_sub(ny, nx));\n }\n}\n\nexport function BigInteger_addnn_6A57060(nx, ny) {\n return BigInteger_posn_Z67CCE57D(BigNatModule_add(nx, ny));\n}\n\nexport function BigInteger__get_IsZero(x) {\n if (BigInteger__get_SignInt(x) === 0) {\n return true;\n }\n else {\n return BigNatModule_isZero(BigInteger__get_V(x));\n }\n}\n\nexport function BigInteger__get_IsOne(x) {\n if (BigInteger__get_SignInt(x) === 1) {\n return BigNatModule_isOne(BigInteger__get_V(x));\n }\n else {\n return false;\n }\n}\n\nexport function BigInteger_op_Addition_56F059C0(x, y) {\n if (BigInteger__get_IsZero(y)) {\n return x;\n }\n else if (BigInteger__get_IsZero(x)) {\n return y;\n }\n else {\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n let pattern_matching_result;\n if (matchValue[0] === -1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 1;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 3;\n }\n else {\n pattern_matching_result = 4;\n }\n }\n else if (matchValue[0] === 1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 2;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 4;\n }\n }\n else {\n pattern_matching_result = 4;\n }\n switch (pattern_matching_result) {\n case 0: {\n return BigInteger_addnn_6A57060(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 1: {\n return BigInteger_op_UnaryNegation_Z665282C2(BigInteger_addnn_6A57060(BigInteger__get_V(x), BigInteger__get_V(y)));\n }\n case 2: {\n return BigInteger_subnn_6A57060(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 3: {\n return BigInteger_subnn_6A57060(BigInteger__get_V(y), BigInteger__get_V(x));\n }\n case 4: {\n throw (new Error(\"signs should be +/- 1\\\\nParameter name: x\"));\n }\n }\n }\n}\n\nexport function BigInteger_op_Subtraction_56F059C0(x, y) {\n if (BigInteger__get_IsZero(y)) {\n return x;\n }\n else if (BigInteger__get_IsZero(x)) {\n return BigInteger_op_UnaryNegation_Z665282C2(y);\n }\n else {\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n let pattern_matching_result;\n if (matchValue[0] === -1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 1;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 3;\n }\n else {\n pattern_matching_result = 4;\n }\n }\n else if (matchValue[0] === 1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 2;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 4;\n }\n }\n else {\n pattern_matching_result = 4;\n }\n switch (pattern_matching_result) {\n case 0: {\n return BigInteger_subnn_6A57060(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 1: {\n return BigInteger_subnn_6A57060(BigInteger__get_V(y), BigInteger__get_V(x));\n }\n case 2: {\n return BigInteger_addnn_6A57060(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 3: {\n return BigInteger_op_UnaryNegation_Z665282C2(BigInteger_addnn_6A57060(BigInteger__get_V(x), BigInteger__get_V(y)));\n }\n case 4: {\n throw (new Error(\"signs should be +/- 1\\\\nParameter name: x\"));\n }\n }\n }\n}\n\nexport function BigInteger_op_Multiply_56F059C0(x, y) {\n if (BigInteger__get_IsZero(x)) {\n return x;\n }\n else if (BigInteger__get_IsZero(y)) {\n return y;\n }\n else if (BigInteger__get_IsOne(x)) {\n return y;\n }\n else if (BigInteger__get_IsOne(y)) {\n return x;\n }\n else {\n const m = BigNatModule_mul(BigInteger__get_V(x), BigInteger__get_V(y));\n return BigInteger_create_Z2BE94A1(BigInteger__get_SignInt(x) * BigInteger__get_SignInt(y), m);\n }\n}\n\nexport function BigInteger_DivRem_56F059C0(x, y) {\n if (BigInteger__get_IsZero(y)) {\n throw (new Error());\n }\n if (BigInteger__get_IsZero(x)) {\n return [BigInteger_get_Zero(), BigInteger_get_Zero()];\n }\n else {\n const patternInput = BigNatModule_divmod(BigInteger__get_V(x), BigInteger__get_V(y));\n const r = patternInput[1];\n const d = patternInput[0];\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n let pattern_matching_result;\n if (matchValue[0] === -1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 1;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 3;\n }\n else {\n pattern_matching_result = 4;\n }\n }\n else if (matchValue[0] === 1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 2;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 4;\n }\n }\n else {\n pattern_matching_result = 4;\n }\n switch (pattern_matching_result) {\n case 0: {\n return [BigInteger_posn_Z67CCE57D(d), BigInteger_posn_Z67CCE57D(r)];\n }\n case 1: {\n return [BigInteger_posn_Z67CCE57D(d), BigInteger_negn_Z67CCE57D(r)];\n }\n case 2: {\n return [BigInteger_negn_Z67CCE57D(d), BigInteger_posn_Z67CCE57D(r)];\n }\n case 3: {\n return [BigInteger_negn_Z67CCE57D(d), BigInteger_negn_Z67CCE57D(r)];\n }\n case 4: {\n throw (new Error(\"signs should be +/- 1\\\\nParameter name: x\"));\n }\n }\n }\n}\n\nexport function BigInteger_op_Division_56F059C0(x, y) {\n return BigInteger_DivRem_56F059C0(x, y)[0];\n}\n\nexport function BigInteger_op_Modulus_56F059C0(x, y) {\n return BigInteger_DivRem_56F059C0(x, y)[1];\n}\n\nexport function BigInteger_op_RightShift_62E082A2(x, y) {\n return BigInteger_op_Division_56F059C0(x, BigInteger_Pow_62E082A2(BigInteger_get_Two(), y));\n}\n\nexport function BigInteger_op_LeftShift_62E082A2(x, y) {\n return BigInteger_op_Multiply_56F059C0(x, BigInteger_Pow_62E082A2(BigInteger_get_Two(), y));\n}\n\nexport function BigInteger_op_BitwiseAnd_56F059C0(x, y) {\n return BigInteger_posn_Z67CCE57D(BigNatModule_bitAnd(BigInteger__get_V(x), BigInteger__get_V(y)));\n}\n\nexport function BigInteger_op_BitwiseOr_56F059C0(x, y) {\n return BigInteger_posn_Z67CCE57D(BigNatModule_bitOr(BigInteger__get_V(x), BigInteger__get_V(y)));\n}\n\nexport function BigInteger_op_ExclusiveOr_56F059C0(x, y) {\n return BigInteger_posn_Z67CCE57D(BigNatModule_bitXor(BigInteger__get_V(x), BigInteger__get_V(y)));\n}\n\nexport function BigInteger_GreatestCommonDivisor_56F059C0(x, y) {\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n if (matchValue[0] === 0) {\n if (matchValue[1] === 0) {\n return BigInteger_get_Zero();\n }\n else {\n return BigInteger_posn_Z67CCE57D(BigInteger__get_V(y));\n }\n }\n else if (matchValue[1] === 0) {\n return BigInteger_posn_Z67CCE57D(BigInteger__get_V(x));\n }\n else {\n return BigInteger_posn_Z67CCE57D(BigNatModule_hcf(BigInteger__get_V(x), BigInteger__get_V(y)));\n }\n}\n\nexport function BigInteger__get_IsNegative(x) {\n if (BigInteger__get_SignInt(x) === -1) {\n return !BigInteger__get_IsZero(x);\n }\n else {\n return false;\n }\n}\n\nexport function BigInteger__get_IsPositive(x) {\n if (BigInteger__get_SignInt(x) === 1) {\n return !BigInteger__get_IsZero(x);\n }\n else {\n return false;\n }\n}\n\nexport function BigInteger_Abs_Z665282C2(x) {\n if (BigInteger__get_SignInt(x) === -1) {\n return BigInteger_op_UnaryNegation_Z665282C2(x);\n }\n else {\n return x;\n }\n}\n\nexport function BigInteger_op_LessThanOrEqual_56F059C0(x, y) {\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n let pattern_matching_result;\n if (matchValue[0] === -1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 1;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 6;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 3;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 0) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 8;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 4;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 7;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 2;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 5;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else {\n pattern_matching_result = 9;\n }\n switch (pattern_matching_result) {\n case 0: {\n return BigNatModule_lte(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 1: {\n return BigNatModule_lte(BigInteger__get_V(y), BigInteger__get_V(x));\n }\n case 2: {\n if (BigNatModule_isZero(BigInteger__get_V(x))) {\n return BigNatModule_isZero(BigInteger__get_V(y));\n }\n else {\n return false;\n }\n }\n case 3: {\n return true;\n }\n case 4: {\n return true;\n }\n case 5: {\n return BigNatModule_isZero(BigInteger__get_V(x));\n }\n case 6: {\n return true;\n }\n case 7: {\n return true;\n }\n case 8: {\n return BigNatModule_isZero(BigInteger__get_V(y));\n }\n case 9: {\n throw (new Error(\"signs should be +/- 1 or 0\\\\nParameter name: x\"));\n }\n }\n}\n\nexport function BigInteger_op_GreaterThanOrEqual_56F059C0(x, y) {\n const matchValue = [BigInteger__get_SignInt(x), BigInteger__get_SignInt(y)];\n let pattern_matching_result;\n if (matchValue[0] === -1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 1;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 6;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 3;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 0) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 8;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 4;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 7;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else if (matchValue[0] === 1) {\n if (matchValue[1] === -1) {\n pattern_matching_result = 2;\n }\n else if (matchValue[1] === 0) {\n pattern_matching_result = 5;\n }\n else if (matchValue[1] === 1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 9;\n }\n }\n else {\n pattern_matching_result = 9;\n }\n switch (pattern_matching_result) {\n case 0: {\n return BigNatModule_gte(BigInteger__get_V(x), BigInteger__get_V(y));\n }\n case 1: {\n return BigNatModule_gte(BigInteger__get_V(y), BigInteger__get_V(x));\n }\n case 2: {\n return true;\n }\n case 3: {\n if (BigNatModule_isZero(BigInteger__get_V(x))) {\n return BigNatModule_isZero(BigInteger__get_V(y));\n }\n else {\n return false;\n }\n }\n case 4: {\n return true;\n }\n case 5: {\n return true;\n }\n case 6: {\n return BigNatModule_isZero(BigInteger__get_V(x));\n }\n case 7: {\n return BigNatModule_isZero(BigInteger__get_V(y));\n }\n case 8: {\n return true;\n }\n case 9: {\n throw (new Error(\"signs should be +/- 1 or 0\\\\nParameter name: x\"));\n }\n }\n}\n\nexport function BigInteger_Pow_62E082A2(x, y) {\n if (y < 0) {\n throw (new Error(\"y\"));\n }\n const matchValue = [BigInteger__get_IsZero(x), y];\n if (matchValue[0]) {\n if (matchValue[1] === 0) {\n return BigInteger_get_One();\n }\n else {\n return BigInteger_get_Zero();\n }\n }\n else {\n const yval = BigInteger_$ctor_Z524259A4(y);\n return BigInteger_create_Z2BE94A1(BigNatModule_isZero(BigNatModule_rem(BigInteger__get_V(yval), BigNatModule_two)) ? 1 : BigInteger__get_SignInt(x), BigNatModule_pow(BigInteger__get_V(x), BigInteger__get_V(yval)));\n }\n}\n\nexport function BigInteger__get_ToInt32(x) {\n if (BigInteger__get_IsZero(x)) {\n return 0;\n }\n else {\n const u = BigNatModule_toUInt32(BigInteger__get_V(x));\n if (u <= (2147483647 >>> 0)) {\n return (BigInteger__get_SignInt(x) * (~(~u))) | 0;\n }\n else if ((BigInteger__get_SignInt(x) === -1) && (u === ((2147483647 + 1) >>> 0))) {\n return -2147483648;\n }\n else {\n throw (new Error());\n }\n }\n}\n\nexport function BigInteger__get_ToUInt32(x) {\n if (BigInteger__get_IsZero(x)) {\n return 0;\n }\n else {\n return BigNatModule_toUInt32(BigInteger__get_V(x));\n }\n}\n\nexport function BigInteger__get_ToInt64(x) {\n if (BigInteger__get_IsZero(x)) {\n return fromBits(0, 0, false);\n }\n else {\n const u = BigNatModule_toUInt64(BigInteger__get_V(x));\n if (compare(u, fromValue(fromBits(4294967295, 2147483647, false), true)) <= 0) {\n return op_Multiply(fromInteger(BigInteger__get_SignInt(x), false, 2), fromValue(u, false));\n }\n else if ((BigInteger__get_SignInt(x) === -1) && equals(u, fromValue(op_Addition(fromBits(4294967295, 2147483647, false), fromBits(1, 0, false)), true))) {\n return fromBits(0, 2147483648, false);\n }\n else {\n throw (new Error());\n }\n }\n}\n\nexport function BigInteger__get_ToUInt64(x) {\n if (BigInteger__get_IsZero(x)) {\n return fromBits(0, 0, true);\n }\n else {\n return BigNatModule_toUInt64(BigInteger__get_V(x));\n }\n}\n\nexport function BigInteger__get_ToDouble(x) {\n const matchValue = BigInteger__get_SignInt(x) | 0;\n switch (matchValue) {\n case -1: {\n return -BigNatModule_toFloat(BigInteger__get_V(x));\n }\n case 0: {\n return 0;\n }\n case 1: {\n return BigNatModule_toFloat(BigInteger__get_V(x));\n }\n default: {\n throw (new Error(\"signs should be +/- 1 or 0\\\\nParameter name: x\"));\n }\n }\n}\n\nexport function BigInteger__get_ToSByte(x) {\n return (BigInteger__get_ToInt32(x) + 0x80 & 0xFF) - 0x80;\n}\n\nexport function BigInteger__get_ToByte(x) {\n return BigInteger__get_ToUInt32(x) & 0xFF;\n}\n\nexport function BigInteger__get_ToInt16(x) {\n return (BigInteger__get_ToInt32(x) + 0x8000 & 0xFFFF) - 0x8000;\n}\n\nexport function BigInteger__get_ToUInt16(x) {\n return BigInteger__get_ToUInt32(x) & 0xFFFF;\n}\n\nexport function BigInteger__get_ToSingle(x) {\n return BigInteger__get_ToDouble(x);\n}\n\nexport function BigInteger__get_ToDecimal(x) {\n return new Decimal(BigInteger__get_ToDouble(x));\n}\n\nexport function BigInteger_Parse_Z721C83C5(text) {\n if (text == null) {\n throw (new Error(\"text\"));\n }\n const text_1 = text.trim();\n const len = text_1.length | 0;\n if (len === 0) {\n throw (new Error());\n }\n const matchValue = [text_1[0], len];\n if (matchValue[0] === \"+\") {\n if (matchValue[1] === 1) {\n throw (new Error());\n }\n else {\n return BigInteger_posn_Z67CCE57D(BigNatModule_ofString(text_1.slice(1, (len - 1) + 1)));\n }\n }\n else if (matchValue[0] === \"-\") {\n if (matchValue[1] === 1) {\n throw (new Error());\n }\n else {\n return BigInteger_negn_Z67CCE57D(BigNatModule_ofString(text_1.slice(1, (len - 1) + 1)));\n }\n }\n else {\n return BigInteger_posn_Z67CCE57D(BigNatModule_ofString(text_1));\n }\n}\n\nexport function BigInteger__get_IsSmall(x) {\n if (BigInteger__get_IsZero(x)) {\n return true;\n }\n else {\n return BigNatModule_isSmall(BigInteger__get_V(x));\n }\n}\n\nexport function BigInteger_Factorial_Z665282C2(x) {\n if (BigInteger__get_IsNegative(x)) {\n throw (new Error(\"mustBeNonNegative\\\\nParameter name: x\"));\n }\n if (BigInteger__get_IsPositive(x)) {\n return BigInteger_posn_Z67CCE57D(BigNatModule_factorial(BigInteger__get_V(x)));\n }\n else {\n return BigInteger_get_One();\n }\n}\n\nexport function BigInteger_op_UnaryPlus_Z665282C2(n1) {\n return n1;\n}\n\nexport function BigInteger_FromInt64_Z524259C1(x) {\n return BigInteger_$ctor_Z524259C1(x);\n}\n\nexport function BigInteger_FromInt32_Z524259A4(x) {\n return BigInteger_$ctor_Z524259A4(x);\n}\n\n","import { BigInteger_op_Inequality_56F059C0, BigInteger_op_Equality_56F059C0, BigInteger_op_GreaterThanOrEqual_56F059C0, BigInteger_op_GreaterThan_56F059C0, BigInteger_op_LessThanOrEqual_56F059C0, BigInteger_op_LessThan_56F059C0, BigInteger_op_ExclusiveOr_56F059C0, BigInteger_op_BitwiseOr_56F059C0, BigInteger_op_BitwiseAnd_56F059C0, BigInteger_op_LeftShift_62E082A2, BigInteger_op_RightShift_62E082A2, BigInteger_op_UnaryPlus_Z665282C2, BigInteger_op_UnaryNegation_Z665282C2, BigInteger_op_Modulus_56F059C0, BigInteger_op_Division_56F059C0, BigInteger_op_Multiply_56F059C0, BigInteger_op_Subtraction_56F059C0, BigInteger_op_Addition_56F059C0, BigInteger__get_IsOne, BigInteger__get_IsZero, BigInteger__get_Sign, BigInteger__get_ToDecimal, BigInteger__get_ToDouble, BigInteger__get_ToSingle, BigInteger__get_ToUInt64, BigInteger__get_ToInt64, BigInteger__get_ToUInt32, BigInteger__get_ToInt32, BigInteger__get_ToUInt16, BigInteger__get_ToInt16, BigInteger__get_ToByte, BigInteger__get_ToSByte, BigInteger_$ctor_Z524259A4, BigInteger_$ctor_Z524259C1, BigInteger_get_Two, BigInteger_get_One, BigInteger_get_Zero, BigInteger_Abs_Z665282C2, BigInteger_Pow_62E082A2, BigInteger_GreatestCommonDivisor_56F059C0, BigInteger_DivRem_56F059C0, BigInteger_Parse_Z721C83C5, BigInteger } from \"./BigInt/z.js\";\nimport { fromInteger } from \"./Long.js\";\nimport { comparePrimitives, min, compare as compare_1, equals as equals_1, safeHash } from \"./Util.js\";\nimport { toString as toString_1 } from \"./Types.js\";\nimport { fold, empty, ofArrayWithTail, cons, toArray, head, skipWhile } from \"./List.js\";\nimport { fill, reverse } from \"./Array.js\";\n\nexport function isBigInt(x) {\n return x instanceof BigInteger;\n}\n\nexport function tryParse(str, res) {\n try {\n res.contents = BigInteger_Parse_Z721C83C5(str);\n return true;\n }\n catch (matchValue) {\n return false;\n }\n}\n\nexport function divRem(x, y, remainder) {\n const patternInput = BigInteger_DivRem_56F059C0(x, y);\n remainder.contents = patternInput[1];\n return patternInput[0];\n}\n\nexport function parse(arg) {\n return BigInteger_Parse_Z721C83C5(arg);\n}\n\nexport function greatestCommonDivisor(arg, arg_1) {\n return BigInteger_GreatestCommonDivisor_56F059C0(arg, arg_1);\n}\n\nexport function pow(arg, arg_1) {\n return BigInteger_Pow_62E082A2(arg, arg_1);\n}\n\nexport function abs(arg) {\n return BigInteger_Abs_Z665282C2(arg);\n}\n\nexport const zero = BigInteger_get_Zero();\n\nexport const one = BigInteger_get_One();\n\nexport const two = BigInteger_get_Two();\n\nexport function fromString(s) {\n return BigInteger_Parse_Z721C83C5(s);\n}\n\nexport function fromZero() {\n return BigInteger_get_Zero();\n}\n\nexport function fromOne() {\n return BigInteger_get_One();\n}\n\nexport function fromInt64(i) {\n return BigInteger_$ctor_Z524259C1(i);\n}\n\nexport function fromInt32(i) {\n if (i > 2147483647) {\n return BigInteger_$ctor_Z524259C1(fromInteger(i, false, 6));\n }\n else {\n return BigInteger_$ctor_Z524259A4(i);\n }\n}\n\nexport function toSByte(x) {\n return BigInteger__get_ToSByte(x);\n}\n\nexport function toByte(x) {\n return BigInteger__get_ToByte(x);\n}\n\nexport function toInt16(x) {\n return BigInteger__get_ToInt16(x);\n}\n\nexport function toUInt16(x) {\n return BigInteger__get_ToUInt16(x);\n}\n\nexport function toInt32(x) {\n return BigInteger__get_ToInt32(x);\n}\n\nexport function toUInt32(x) {\n return BigInteger__get_ToUInt32(x);\n}\n\nexport function toInt64(x) {\n return BigInteger__get_ToInt64(x);\n}\n\nexport function toUInt64(x) {\n return BigInteger__get_ToUInt64(x);\n}\n\nexport function toSingle(x) {\n return BigInteger__get_ToSingle(x);\n}\n\nexport function toDouble(x) {\n return BigInteger__get_ToDouble(x);\n}\n\nexport function toDecimal(x) {\n return BigInteger__get_ToDecimal(x);\n}\n\nexport function sign(x) {\n return BigInteger__get_Sign(x);\n}\n\nexport function isZero(x) {\n return BigInteger__get_IsZero(x);\n}\n\nexport function isOne(x) {\n return BigInteger__get_IsOne(x);\n}\n\nexport function hash(x) {\n return safeHash(x);\n}\n\nexport function compare(x, y) {\n return x.CompareTo(y);\n}\n\nexport function equals(x, y) {\n return equals_1(x, y);\n}\n\nexport function toString(x) {\n return toString_1(x);\n}\n\nexport const get_Zero = BigInteger_get_Zero();\n\nexport const get_One = BigInteger_get_One();\n\nexport function op_Addition(arg, arg_1) {\n return BigInteger_op_Addition_56F059C0(arg, arg_1);\n}\n\nexport function op_Subtraction(arg, arg_1) {\n return BigInteger_op_Subtraction_56F059C0(arg, arg_1);\n}\n\nexport function op_Multiply(arg, arg_1) {\n return BigInteger_op_Multiply_56F059C0(arg, arg_1);\n}\n\nexport function op_Division(arg, arg_1) {\n return BigInteger_op_Division_56F059C0(arg, arg_1);\n}\n\nexport function op_Modulus(arg, arg_1) {\n return BigInteger_op_Modulus_56F059C0(arg, arg_1);\n}\n\nexport function op_UnaryNegation(arg) {\n return BigInteger_op_UnaryNegation_Z665282C2(arg);\n}\n\nexport function op_UnaryPlus(arg) {\n return BigInteger_op_UnaryPlus_Z665282C2(arg);\n}\n\nexport function op_RightShift(arg, arg_1) {\n return BigInteger_op_RightShift_62E082A2(arg, arg_1);\n}\n\nexport function op_LeftShift(arg, arg_1) {\n return BigInteger_op_LeftShift_62E082A2(arg, arg_1);\n}\n\nexport function op_BitwiseAnd(arg, arg_1) {\n return BigInteger_op_BitwiseAnd_56F059C0(arg, arg_1);\n}\n\nexport function op_BitwiseOr(arg, arg_1) {\n return BigInteger_op_BitwiseOr_56F059C0(arg, arg_1);\n}\n\nexport function op_ExclusiveOr(arg, arg_1) {\n return BigInteger_op_ExclusiveOr_56F059C0(arg, arg_1);\n}\n\nexport function op_LessThan(arg, arg_1) {\n return BigInteger_op_LessThan_56F059C0(arg, arg_1);\n}\n\nexport function op_LessThanOrEqual(arg, arg_1) {\n return BigInteger_op_LessThanOrEqual_56F059C0(arg, arg_1);\n}\n\nexport function op_GreaterThan(arg, arg_1) {\n return BigInteger_op_GreaterThan_56F059C0(arg, arg_1);\n}\n\nexport function op_GreaterThanOrEqual(arg, arg_1) {\n return BigInteger_op_GreaterThanOrEqual_56F059C0(arg, arg_1);\n}\n\nexport function op_Equality(arg, arg_1) {\n return BigInteger_op_Equality_56F059C0(arg, arg_1);\n}\n\nexport function op_Inequality(arg, arg_1) {\n return BigInteger_op_Inequality_56F059C0(arg, arg_1);\n}\n\nfunction flipTwosComplement(currByte, lowBitFound) {\n let array;\n const matchValue = [currByte, lowBitFound];\n if (matchValue[1]) {\n return [(currByte ^ 255) & 255, true];\n }\n else if (matchValue[0] === 0) {\n return [0, false];\n }\n else {\n return [(currByte ^ (254 << ((array = (new Int32Array([0, 1, 2, 3, 4, 5, 6, 7])), array.find((i) => ((currByte & (1 << i)) > 0)))))) & 255, true];\n }\n}\n\nexport function toByteArray(value) {\n if (equals_1(value, zero)) {\n return new Uint8Array([0]);\n }\n else {\n const isPositive = compare_1(value, zero) > 0;\n const value_1 = isPositive ? value : BigInteger_op_Multiply_56F059C0(BigInteger_$ctor_Z524259A4(-1), value);\n const mask32 = fromInt64(fromInteger(4294967295, false, 6));\n const loop = (accumBytes_mut, consumeValue_mut, lowBitFound_mut) => {\n let value_6, value_8, value_9, value_10;\n loop:\n while (true) {\n const accumBytes = accumBytes_mut, consumeValue = consumeValue_mut, lowBitFound = lowBitFound_mut;\n if (compare_1(consumeValue, zero) <= 0) {\n const accumBytes_1 = isPositive ? skipWhile((b) => (b === 0), accumBytes) : skipWhile((b_1) => (b_1 === 255), accumBytes);\n const isHighBitOne = (head(accumBytes_1) & 128) !== 0;\n return reverse(toArray((isPositive && isHighBitOne) ? cons(0, accumBytes_1) : (((!isPositive) && (!isHighBitOne)) ? cons(255, accumBytes_1) : accumBytes_1)));\n }\n else {\n const currValue = toUInt32(BigInteger_op_BitwiseAnd_56F059C0(consumeValue, mask32));\n if (isPositive) {\n const b0 = currValue & 0xFF;\n let b1;\n const value_4 = currValue >>> 8;\n b1 = (value_4 & 0xFF);\n let b2;\n const value_5 = currValue >>> 16;\n b2 = (value_5 & 0xFF);\n accumBytes_mut = ofArrayWithTail([(value_6 = (currValue >>> 24), value_6 & 0xFF), b2, b1, b0], accumBytes);\n consumeValue_mut = BigInteger_op_RightShift_62E082A2(consumeValue, 32);\n lowBitFound_mut = false;\n continue loop;\n }\n else {\n const patternInput = flipTwosComplement(currValue & 0xFF, lowBitFound);\n const patternInput_1 = flipTwosComplement((value_8 = (currValue >>> 8), value_8 & 0xFF), patternInput[1]);\n const patternInput_2 = flipTwosComplement((value_9 = (currValue >>> 16), value_9 & 0xFF), patternInput_1[1]);\n const patternInput_3 = flipTwosComplement((value_10 = (currValue >>> 24), value_10 & 0xFF), patternInput_2[1]);\n accumBytes_mut = ofArrayWithTail([patternInput_3[0], patternInput_2[0], patternInput_1[0], patternInput[0]], accumBytes);\n consumeValue_mut = BigInteger_op_RightShift_62E082A2(consumeValue, 32);\n lowBitFound_mut = patternInput_3[1];\n continue loop;\n }\n }\n break;\n }\n };\n return loop(empty(), value_1, false);\n }\n}\n\nexport function fromByteArray(bytes) {\n if (bytes == null) {\n throw (new Error(\"bytes\"));\n }\n if (bytes.length === 0) {\n return zero;\n }\n else {\n const isPositive = (bytes[bytes.length - 1] & 128) === 0;\n const buffer = fill(new Uint8Array(4), 0, 4, 0);\n const loop = (accumUInt32_mut, currIndex_mut, bytesRemaining_mut, lowBitFound_mut) => {\n loop:\n while (true) {\n const accumUInt32 = accumUInt32_mut, currIndex = currIndex_mut, bytesRemaining = bytesRemaining_mut, lowBitFound = lowBitFound_mut;\n if (bytesRemaining === 0) {\n const value_2 = fold((acc, value) => BigInteger_op_Addition_56F059C0(BigInteger_op_LeftShift_62E082A2(acc, 32), fromInt64(fromInteger(value, false, 6))), zero, accumUInt32);\n if (isPositive) {\n return value_2;\n }\n else {\n return BigInteger_op_Multiply_56F059C0(BigInteger_$ctor_Z524259A4(-1), value_2);\n }\n }\n else {\n const bytesToProcess = min(comparePrimitives, bytesRemaining, 4) | 0;\n for (let i_1 = 0; i_1 <= (bytesToProcess - 1); i_1++) {\n buffer[i_1] = bytes[currIndex + i_1];\n }\n if (isPositive) {\n fill(buffer, bytesToProcess, 4 - bytesToProcess, 0);\n accumUInt32_mut = cons((((((buffer[0] | ((buffer[1] << 8) >>> 0)) >>> 0) | ((buffer[2] << 16) >>> 0)) >>> 0) | ((buffer[3] << 24) >>> 0)) >>> 0, accumUInt32);\n currIndex_mut = (currIndex + bytesToProcess);\n bytesRemaining_mut = (bytesRemaining - bytesToProcess);\n lowBitFound_mut = false;\n continue loop;\n }\n else {\n fill(buffer, bytesToProcess, 4 - bytesToProcess, 255);\n const patternInput = flipTwosComplement(buffer[0], lowBitFound);\n const patternInput_1 = flipTwosComplement(buffer[1], patternInput[1]);\n const patternInput_2 = flipTwosComplement(buffer[2], patternInput_1[1]);\n const patternInput_3 = flipTwosComplement(buffer[3], patternInput_2[1]);\n accumUInt32_mut = cons((((((patternInput[0] | ((patternInput_1[0] << 8) >>> 0)) >>> 0) | ((patternInput_2[0] << 16) >>> 0)) >>> 0) | ((patternInput_3[0] << 24) >>> 0)) >>> 0, accumUInt32);\n currIndex_mut = (currIndex + bytesToProcess);\n bytesRemaining_mut = (bytesRemaining - bytesToProcess);\n lowBitFound_mut = patternInput_3[1];\n continue loop;\n }\n }\n break;\n }\n };\n return loop(empty(), 0, bytes.length, false);\n }\n}\n\n","namespace Fable.SimpleJson\n\nopen Fable.Core\nopen Fable.Parsimmon\nopen Parser\nopen Fable.Import\nopen System\nopen Fable.Core.JsInterop\n\n[]\nmodule InteropUtil =\n []\n let arrayFrom (xs: obj) : obj = jsNative\n []\n let get<'a> (key: string) (x: obj) : 'a = jsNative\n []\n let isDate (x: obj) = jsNative\n []\n let hasKey (key: string) (x: 'a) = jsNative\n let isDateOffset (x: obj) = isDate x && hasKey \"offset\" x\n []\n let getTypeOf (x: obj) : string = jsNative\n let isObjectLiteral (x: obj) = getTypeOf x = \"object\"\n let isBigInt (x: obj) =\n not (isNull x)\n && isObjectLiteral x\n && hasKey \"signInt\" x\n && hasKey \"v\" x\n && hasKey \"digits\" (get \"v\" x)\n && hasKey \"bound\" (get \"v\" x)\n\n []\n let log (x: 'a) : unit = jsNative\n\n []\n let createEmptyObject() : obj = jsNative\n\nmodule SimpleJson =\n /// Tries to parse a string into a Json structured JSON data.\n let tryParse (input: string) : Option =\n Parsimmon.parse input jsonParser\n\n /// Parses the input string into a structured JSON data. Fails with an exception if parsing fails.\n let parse (input: string) : Json =\n match tryParse input with\n | Some result -> result\n | None -> failwithf \"Could not parse the JSON input: %s\" input\n\n /// Stringifies a Json object back to string representation\n let rec toString = function\n | JNull -> \"null\"\n | JBool true -> \"true\"\n | JBool false -> \"false\"\n | JNumber number -> string number\n | JString text -> sprintf \"\\\"%s\\\"\" text\n | JArray elements ->\n elements\n |> List.map toString\n |> String.concat \",\"\n |> sprintf \"[%s]\"\n | JObject map ->\n map\n |> Map.toList\n |> List.map (fun (key,value) -> sprintf \"\\\"%s\\\":%s\" key (toString value))\n |> String.concat \",\"\n |> sprintf \"{%s}\"\n\n []\n let private setValue (key: string) (value: obj) (destination: obj) = jsNative\n let rec toPlainObject (input: Json) : obj =\n match input with\n | JNull -> unbox null\n | JBool value -> unbox value\n | JNumber value -> unbox value\n | JString value -> unbox value\n | JArray values ->\n let array = new ResizeArray()\n for value in values do array.Add(toPlainObject value)\n unbox array\n | JObject map ->\n let jsObject = createEmptyObject()\n for (key, value) in Map.toList map do\n setValue key (toPlainObject value) jsObject\n unbox jsObject\n\n let stringify (value: 'a) : string =\n if isNullOrUndefined value\n then JS.JSON.stringify(null)\n else JS.JSON.stringify(value, (fun key jsonValue ->\n if isBigInt jsonValue then\n let bigInt : bigint = unbox(jsonValue)\n box (string (decimal bigInt))\n elif isDate jsonValue then\n let dateOffset : DateTimeOffset = unbox(jsonValue)\n box (dateOffset.ToString(\"o\"))\n else\n match jsonValue with\n | :? string -> jsonValue\n | :? System.Collections.IEnumerable ->\n if JS.Constructors.Array.isArray(jsonValue) then jsonValue\n else arrayFrom jsonValue\n | _ when isBigInt jsonValue -> box (string (decimal (unbox jsonValue)))\n | _ when isDateOffset jsonValue -> box ((unbox jsonValue).ToString(\"O\"))\n | _ -> jsonValue\n ), 0)\n\n let rec internal parseNative' (x: obj) =\n match x with\n | TypeCheck.NativeString str -> JString str\n | TypeCheck.NativeNumber number -> JNumber number\n | TypeCheck.NativeBool value -> JBool value\n | TypeCheck.Null _ -> JNull\n | TypeCheck.NativeArray arr -> JArray (List.ofArray (Array.map parseNative' arr))\n | TypeCheck.NativeObject object ->\n [ for key in JS.Constructors.Object.keys object -> key, parseNative' (get key object) ]\n |> Map.ofList\n |> JObject\n | _ -> JNull\n\n /// Parses and converts the input string to Json using Javascript's native parsing capabilities\n let parseNative (input: string) =\n let parsed = JS.JSON.parse input\n parseNative' parsed\n\n let tryParseNative (input: string) =\n try Some (parseNative input)\n with | ex -> None\n\n /// Tries to convert an object literal to the Json by calling JSON.stringify on the object first\n let fromObjectLiteral (x: 'a) =\n try Some (parseNative' x)\n with | _ -> None\n\n /// Transforms all keys of the objects within the Json structure\n let rec mapKeys f = function\n | JObject dictionary ->\n dictionary\n |> Map.toList\n |> List.map (fun (key, value) -> f key, mapKeys f value)\n |> Map.ofList\n |> JObject\n | JArray values ->\n values\n |> List.map (mapKeys f)\n |> JArray\n | otherJsonValue -> otherJsonValue\n\n /// Transforms object values recursively using function `f` that takes the key and value of the object and returns a new value\n let rec mapbyKey f = function\n | JObject dictionary ->\n dictionary\n |> Map.toList\n |> List.map (fun (key, value) -> key, f key value)\n |> Map.ofList\n |> JObject\n | JArray values ->\n values\n |> List.map (mapbyKey f)\n |> JArray\n | otherJsonValue -> otherJsonValue\n\n /// Transforms keys of object selectively by path segments\n let mapKeysByPath f json =\n let rec mapKey xs = function\n | JObject dictionary ->\n dictionary\n |> Map.toList\n |> List.map (fun (key, value) ->\n let keyPath = List.concat [xs; [key]]\n match f keyPath with\n | Some nextKey -> nextKey, mapKey keyPath value\n | None -> key, mapKey keyPath value)\n |> Map.ofList\n |> JObject\n | JArray values ->\n values\n |> List.map (mapKey xs)\n |> JArray\n | otherJsonValue -> otherJsonValue\n mapKey [] json\n\n let rec readPath (keys: string list) (input: Json) =\n match keys, input with\n | [ ], _ -> None\n | [ key ], JObject dict -> Map.tryFind key dict\n | firstKey :: rest, JObject dict ->\n match Map.tryFind firstKey dict with\n | Some (JObject nextDict) -> readPath rest (JObject nextDict)\n | _ -> None\n | _ -> None","namespace Fable.SimpleJson\n\nopen Fable.Core\nopen Fable.Core.JsInterop\n\nmodule TypeCheck =\n\n []\n let typeofString (x: obj) : bool = jsNative\n\n []\n let typeofBool (x: obj) : bool = jsNative\n\n []\n let typeofNumber (x: obj) : bool = jsNative\n []\n let typeofObject (x: obj) : bool = jsNative\n\n let (|NativeString|_|) (x: obj) =\n if typeofString x\n then Some (unbox x)\n else None\n\n let (|NativeBool|_|) (x: obj) =\n if typeofBool x\n then Some (unbox x)\n else None\n\n let (|NativeNumber|_|) (x: obj) =\n if typeofNumber x\n then Some (unbox x)\n else None\n\n let (|NativeObject|_|) (x: obj) =\n if typeofObject x\n then Some x\n else None\n\n let (|Null|_|) (x: obj) =\n if isNull x\n then Some x\n else None\n\n let (|NativeArray|_|) (x: obj) =\n if (JS.Constructors.Array.isArray x)\n then Some (unbox x)\n else None","const ok = (value) => ({\n tag: \"ok\",\n value,\n});\nconst error = (error) => ({ tag: \"error\", error });\nexport class Uri {\n constructor(state) {\n this.uri = state;\n }\n static isAbsoluteUri(uri) {\n try {\n // tslint:disable-next-line no-unused-expression\n new URL(uri);\n return true;\n }\n catch (_a) {\n return false;\n }\n }\n static tryCreateWithKind(uri, kind) {\n switch (kind) {\n case 1 /* Absolute */:\n return Uri.isAbsoluteUri(uri)\n ? ok(new Uri({ original: uri, value: new URL(uri), kind }))\n : error(\"Invalid URI: The format of the URI could not be determined.\");\n case 2 /* Relative */:\n return Uri.isAbsoluteUri(uri)\n ? error(\"URI is not a relative path.\")\n : ok(new Uri({ original: uri, value: uri, kind }));\n case 0 /* RelativeOrAbsolute */:\n return Uri.isAbsoluteUri(uri)\n ? ok(new Uri({ original: uri, value: new URL(uri), kind: 1 /* Absolute */ }))\n : ok(new Uri({ original: uri, value: uri, kind: 2 /* Relative */ }));\n default:\n const never = kind;\n return never;\n }\n }\n static tryCreateWithBase(baseUri, relativeUri) {\n return baseUri.uri.kind !== 1 /* Absolute */\n ? error(\"Base URI should have Absolute kind\")\n : typeof relativeUri === \"string\"\n ? ok(new Uri({\n original: new URL(relativeUri, baseUri.uri.value).toString(),\n value: new URL(relativeUri, baseUri.uri.value),\n kind: 1 /* Absolute */,\n }))\n : relativeUri.uri.kind === 2 /* Relative */\n ? ok(new Uri({\n original: new URL(relativeUri.uri.value, baseUri.uri.value).toString(),\n value: new URL(relativeUri.uri.value, baseUri.uri.value),\n kind: 1 /* Absolute */,\n }))\n : ok(baseUri);\n }\n static tryCreateImpl(value, kindOrUri = 1 /* Absolute */) {\n return typeof value === \"string\"\n ? typeof kindOrUri !== \"number\"\n ? error(\"Kind must be specified when the baseUri is a string.\")\n : Uri.tryCreateWithKind(value, kindOrUri)\n : typeof kindOrUri === \"number\"\n ? error(\"Kind should not be specified when the baseUri is an absolute Uri.\")\n : Uri.tryCreateWithBase(value, kindOrUri);\n }\n static create(value, kindOrUri = 1 /* Absolute */) {\n const result = Uri.tryCreateImpl(value, kindOrUri);\n switch (result.tag) {\n case \"ok\":\n return result.value;\n case \"error\":\n throw new Error(result.error);\n default:\n const never = result;\n return never;\n }\n }\n static tryCreate(value, kindOrUri = 1 /* Absolute */, out) {\n const result = Uri.tryCreateImpl(value, kindOrUri);\n switch (result.tag) {\n case \"ok\":\n out.contents = result.value;\n return true;\n case \"error\":\n return false;\n default:\n const never = result;\n return never;\n }\n }\n toString() {\n switch (this.uri.kind) {\n case 1 /* Absolute */:\n return decodeURIComponent(this.asUrl().toString());\n case 2 /* Relative */:\n return this.uri.value;\n default:\n const never = this.uri;\n return never;\n }\n }\n asUrl() {\n switch (this.uri.kind) {\n case 1 /* Absolute */:\n return this.uri.value;\n case 2 /* Relative */:\n throw new Error(\"This operation is not supported for a relative URI.\");\n default:\n const never = this.uri;\n return never;\n }\n }\n get isAbsoluteUri() {\n return this.uri.kind === 1 /* Absolute */;\n }\n get absoluteUri() {\n return this.asUrl().href;\n }\n get scheme() {\n const protocol = this.asUrl().protocol;\n return protocol.slice(0, protocol.length - 1);\n }\n get host() {\n return this.asUrl().host;\n }\n get absolutePath() {\n return this.asUrl().pathname;\n }\n get query() {\n return this.asUrl().search;\n }\n get pathAndQuery() {\n const url = this.asUrl();\n return url.pathname + url.search;\n }\n get fragment() {\n return this.asUrl().hash;\n }\n get originalString() {\n return this.uri.original;\n }\n}\nexport default Uri;\n","/**\n * DateTimeOffset functions.\n *\n * Note: DateOffset instances are always DateObjects in local\n * timezone (because JS dates are all kinds of messed up).\n * A local date returns UTC epoc when `.getTime()` is called.\n *\n * However, this means that in order to construct an UTC date\n * from a DateOffset with offset of +5 hours, you first need\n * to subtract those 5 hours, than add the \"local\" offset.\n * As said, all kinds of messed up.\n *\n * Basically; invariant: date.getTime() always return UTC time.\n */\nimport { create as createDate, dateOffsetToString, daysInMonth, parseRaw } from \"./Date.js\";\nimport { fromValue, ticksToUnixEpochMilliseconds, unixEpochMillisecondsToTicks } from \"./Long.js\";\nimport { compareDates, padWithZeros } from \"./Util.js\";\nexport default function DateTimeOffset(value, offset) {\n checkOffsetInRange(offset);\n const d = new Date(value);\n d.offset = offset != null ? offset : new Date().getTimezoneOffset() * -60000;\n return d;\n}\nfunction checkOffsetInRange(offset) {\n if (offset != null && offset !== 0) {\n if (offset % 60000 !== 0) {\n throw new Error(\"Offset must be specified in whole minutes.\");\n }\n if (Math.abs(offset / 3600000) > 14) {\n throw new Error(\"Offset must be within plus or minus 14 hours.\");\n }\n }\n}\nexport function fromDate(date, offset) {\n let offset2 = 0;\n switch (date.kind) {\n case 1 /* UTC */:\n if (offset != null && offset !== 0) {\n throw new Error(\"The UTC Offset for Utc DateTime instances must be 0.\");\n }\n offset2 = 0;\n break;\n case 2 /* Local */:\n offset2 = date.getTimezoneOffset() * -60000;\n if (offset != null && offset !== offset2) {\n throw new Error(\"The UTC Offset of the local dateTime parameter does not match the offset argument.\");\n }\n break;\n case 0 /* Unspecified */:\n default:\n if (offset == null) {\n offset2 = date.getTimezoneOffset() * -60000;\n }\n else {\n offset2 = offset;\n }\n break;\n }\n return DateTimeOffset(date.getTime(), offset2);\n}\nexport function fromTicks(ticks, offset) {\n ticks = fromValue(ticks);\n const epoc = ticksToUnixEpochMilliseconds(ticks) - offset;\n return DateTimeOffset(epoc, offset);\n}\nexport function getUtcTicks(date) {\n return unixEpochMillisecondsToTicks(date.getTime(), 0);\n}\nexport function minValue() {\n // This is \"0001-01-01T00:00:00.000Z\", actual JS min value is -8640000000000000\n return DateTimeOffset(-62135596800000, 0);\n}\nexport function maxValue() {\n // This is \"9999-12-31T23:59:59.999Z\", actual JS max value is 8640000000000000\n return DateTimeOffset(253402300799999, 0);\n}\nexport function parse(str) {\n const [date, offsetMatch] = parseRaw(str);\n const offset = offsetMatch == null\n ? date.getTimezoneOffset() * -60000\n : (offsetMatch === \"Z\" ? 0 : offsetMatch * 60000);\n return DateTimeOffset(date.getTime(), offset);\n}\nexport function tryParse(v, defValue) {\n try {\n defValue.contents = parse(v);\n return true;\n }\n catch (_err) {\n return false;\n }\n}\nexport function create(year, month, day, h, m, s, ms, offset) {\n if (offset == null) {\n offset = ms;\n ms = 0;\n }\n checkOffsetInRange(offset);\n let date;\n if (offset === 0) {\n date = new Date(Date.UTC(year, month - 1, day, h, m, s, ms));\n if (year <= 99) {\n date.setFullYear(year, month - 1, day);\n }\n }\n else {\n const str = padWithZeros(year, 4) + \"-\" +\n padWithZeros(month, 2) + \"-\" +\n padWithZeros(day, 2) + \"T\" +\n padWithZeros(h, 2) + \":\" +\n padWithZeros(m, 2) + \":\" +\n padWithZeros(s, 2) + \".\" +\n padWithZeros(ms, 3) +\n dateOffsetToString(offset);\n date = new Date(str);\n }\n const dateValue = date.getTime();\n if (isNaN(dateValue)) {\n throw new Error(\"The parameters describe an unrepresentable Date\");\n }\n return DateTimeOffset(dateValue, offset);\n}\nexport function now() {\n const date = new Date();\n const offset = date.getTimezoneOffset() * -60000;\n return DateTimeOffset(date.getTime(), offset);\n}\nexport function utcNow() {\n const date = now();\n return DateTimeOffset(date.getTime(), 0);\n}\nexport function toUniversalTime(date) {\n return DateTimeOffset(date.getTime(), 0);\n}\nexport function toLocalTime(date) {\n return DateTimeOffset(date.getTime(), date.getTimezoneOffset() * -60000);\n}\nexport function timeOfDay(d) {\n var _a;\n const d2 = new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n return d2.getUTCHours() * 3600000\n + d2.getUTCMinutes() * 60000\n + d2.getUTCSeconds() * 1000\n + d2.getUTCMilliseconds();\n}\nexport function date(d) {\n var _a;\n const d2 = new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n return createDate(d2.getUTCFullYear(), d2.getUTCMonth() + 1, d2.getUTCDate(), 0, 0, 0, 0);\n}\nexport function day(d) {\n var _a;\n return new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0)).getUTCDate();\n}\nexport function hour(d) {\n var _a;\n return new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0)).getUTCHours();\n}\nexport function millisecond(d) {\n var _a;\n return new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0)).getUTCMilliseconds();\n}\nexport function minute(d) {\n var _a;\n return new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0)).getUTCMinutes();\n}\nexport function month(d) {\n var _a;\n return new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0)).getUTCMonth() + 1;\n}\nexport function second(d) {\n var _a;\n return new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0)).getUTCSeconds();\n}\nexport function year(d) {\n var _a;\n return new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0)).getUTCFullYear();\n}\nexport function dayOfWeek(d) {\n var _a;\n return new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0)).getUTCDay();\n}\nexport function dayOfYear(d) {\n var _a;\n const d2 = new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n const _year = d2.getUTCFullYear();\n const _month = d2.getUTCMonth() + 1;\n let _day = d2.getUTCDate();\n for (let i = 1; i < _month; i++) {\n _day += daysInMonth(_year, i);\n }\n return _day;\n}\nexport function add(d, ts) {\n var _a;\n return DateTimeOffset(d.getTime() + ts, ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n}\nexport function addDays(d, v) {\n var _a;\n return DateTimeOffset(d.getTime() + v * 86400000, ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n}\nexport function addHours(d, v) {\n var _a;\n return DateTimeOffset(d.getTime() + v * 3600000, ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n}\nexport function addMinutes(d, v) {\n var _a;\n return DateTimeOffset(d.getTime() + v * 60000, ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n}\nexport function addSeconds(d, v) {\n var _a;\n return DateTimeOffset(d.getTime() + v * 1000, ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n}\nexport function addMilliseconds(d, v) {\n var _a;\n return DateTimeOffset(d.getTime() + v, ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n}\nexport function addYears(d, v) {\n var _a;\n const newMonth = d.getUTCMonth() + 1;\n const newYear = d.getUTCFullYear() + v;\n const _daysInMonth = daysInMonth(newYear, newMonth);\n const newDay = Math.min(_daysInMonth, d.getUTCDate());\n return create(newYear, newMonth, newDay, d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds(), ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n}\nexport function addMonths(d, v) {\n var _a, _b;\n const d2 = new Date(d.getTime() + ((_a = d.offset) !== null && _a !== void 0 ? _a : 0));\n let newMonth = d2.getUTCMonth() + 1 + v;\n let newMonth_ = 0;\n let yearOffset = 0;\n if (newMonth > 12) {\n newMonth_ = newMonth % 12;\n yearOffset = Math.floor(newMonth / 12);\n newMonth = newMonth_;\n }\n else if (newMonth < 1) {\n newMonth_ = 12 + newMonth % 12;\n yearOffset = Math.floor(newMonth / 12) + (newMonth_ === 12 ? -1 : 0);\n newMonth = newMonth_;\n }\n const newYear = d2.getUTCFullYear() + yearOffset;\n const _daysInMonth = daysInMonth(newYear, newMonth);\n const newDay = Math.min(_daysInMonth, d2.getUTCDate());\n return create(newYear, newMonth, newDay, d2.getUTCHours(), d2.getUTCMinutes(), d2.getUTCSeconds(), d2.getUTCMilliseconds(), ((_b = d.offset) !== null && _b !== void 0 ? _b : 0));\n}\nexport function subtract(d, that) {\n var _a;\n return typeof that === \"number\"\n ? DateTimeOffset(d.getTime() - that, ((_a = d.offset) !== null && _a !== void 0 ? _a : 0))\n : d.getTime() - that.getTime();\n}\nexport function equals(d1, d2) {\n return d1.getTime() === d2.getTime();\n}\nexport function equalsExact(d1, d2) {\n return d1.getTime() === d2.getTime() && d1.offset === d2.offset;\n}\nexport function compare(d1, d2) {\n return compareDates(d1, d2);\n}\nexport const compareTo = compare;\nexport function op_Addition(x, y) {\n return add(x, y);\n}\nexport function op_Subtraction(x, y) {\n return subtract(x, y);\n}\nexport function toOffset(d, offset) {\n return DateTimeOffset(d.getTime(), offset);\n}\n","import { DateTime, getTicks, dayOfYear as Date_dayOfYear, year as Date_year, month as Date_month, day as Date_day, daysInMonth as Date_daysInMonth } from \"./Date.js\";\nimport { padWithZeros } from \"./Util.js\";\nimport { toInt, fromNumber, op_Division as Long_op_Division, op_Multiply as Long_op_Multiply, ticksToUnixEpochMilliseconds } from \"./Long.js\";\nexport function fromUnixMilliseconds(value) {\n return DateTime(value, 1 /* UTC */);\n}\nexport function create(year, month, day) {\n const d = fromUnixMilliseconds(Date.UTC(year, month - 1, day));\n if (year <= 99) {\n d.setUTCFullYear(year);\n }\n return d;\n}\nexport function maxValue() {\n // This is \"9999-12-31T00:00:00.000Z\"\n return fromUnixMilliseconds(253402214400000);\n}\nexport function minValue() {\n // This is \"0001-01-01T00:00:00.000Z\"\n return fromUnixMilliseconds(-62135596800000);\n}\nexport function dayNumber(d) {\n return toInt(Long_op_Division(getTicks(d), 864000000000));\n}\nexport function fromDayNumber(dayNumber) {\n const ticks = Long_op_Multiply(fromNumber(864000000000), dayNumber);\n return fromUnixMilliseconds(ticksToUnixEpochMilliseconds(ticks));\n}\nexport function fromDateTime(d) {\n return create(Date_year(d), Date_month(d), Date_day(d));\n}\nexport function day(d) {\n return d.getUTCDate();\n}\nexport function month(d) {\n return d.getUTCMonth() + 1;\n}\nexport function year(d) {\n return d.getUTCFullYear();\n}\nexport function dayOfWeek(d) {\n return d.getUTCDay();\n}\nexport function dayOfYear(d) {\n return Date_dayOfYear(d);\n}\nexport function toDateTime(d, time, kind = 0 /* Unspecified */) {\n return DateTime(d.getTime() + time + (kind !== 1 /* UTC */ ? d.getTimezoneOffset() : 0) * 60000, kind);\n}\nexport function toString(d, format = \"d\", _provider) {\n if ([\"d\", \"o\", \"O\"].indexOf(format) === -1) {\n throw new Error(\"Custom formats are not supported\");\n }\n const y = padWithZeros(year(d), 4);\n const m = padWithZeros(month(d), 2);\n const dd = padWithZeros(day(d), 2);\n return format === \"d\" ? `${m}/${dd}/${y}` : `${y}-${m}-${dd}`;\n}\nexport function parse(str) {\n function fail() {\n throw new Error(`String '${str}' was not recognized as a valid DateOnly.`);\n }\n // Allowed separators: . , / -\n // TODO whitespace alone as the separator\n //\n // Whitespace around separators\n //\n // Allowed format types:\n // yyyy/mm/dd\n // mm/dd/yyyy\n // mm/dd\n // mm/yyyy\n // yyyy/mm\n const r = /^\\s*(\\d{1,4})(?:\\s*[.,-\\/]\\s*(\\d{1,2}))?\\s*[.,-\\/]\\s*(\\d{1,4})\\s*$/.exec(str);\n if (r != null) {\n let y = 0;\n let m = 0;\n let d = 1;\n if (r[2] == null) {\n if (r[1].length < 3) {\n if (r[3].length < 3) {\n // 12/30 = December 30, {CurrentYear}\n y = new Date().getFullYear();\n m = +r[1];\n d = +r[3];\n }\n else {\n // 12/2000 = December 1, 2000\n m = +r[1];\n y = +r[3];\n }\n }\n else {\n if (r[3].length > 2)\n fail();\n // 2000/12 = December 1, 2000\n y = +r[1];\n m = +r[3];\n }\n }\n else {\n // 2000/1/30 or 1/30/2000\n const yearFirst = r[1].length > 2;\n const yTmp = r[yearFirst ? 1 : 3];\n y = +yTmp;\n // year 0-29 is 2000-2029, 30-99 is 1930-1999\n if (yTmp.length < 3)\n y += y >= 30 ? 1900 : 2000;\n m = +r[yearFirst ? 2 : 1];\n d = +r[yearFirst ? 3 : 2];\n }\n if (y > 0 && m > 0 && m < 13 && d > 0 && d <= Date_daysInMonth(y, m))\n return create(y, m, d);\n }\n return fail();\n}\nexport function tryParse(v, defValue) {\n try {\n defValue.contents = parse(v);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\n","import { op_Division as Long_op_Division, toNumber as Long_toNumber } from \"./Long.js\";\nimport { hours, minutes, seconds, milliseconds } from \"./TimeSpan.js\";\nimport { padWithZeros } from \"./Util.js\";\nconst millisecondsPerDay = 86400000;\nexport function create(h = 0, m = 0, s = 0, ms = 0) {\n if (h < 0 || m < 0 || s < 0 || ms < 0)\n throw new Error(\"The parameters describe an unrepresentable TimeOnly.\");\n if (arguments.length === 1)\n // ticks\n return fromTicks(arguments[0]);\n else\n return h * 3600000 + m * 60000 + s * 1000 + ms;\n}\nexport function fromTicks(ticks) {\n return Long_toNumber(Long_op_Division(ticks, 10000));\n}\nexport function fromTimeSpan(timeSpan) {\n if (timeSpan < 0 || timeSpan >= millisecondsPerDay)\n throw new Error(\"The TimeSpan describes an unrepresentable TimeOnly.\");\n return timeSpan;\n}\nexport function fromDateTime(d) {\n return d.kind === 1 /* UTC */\n ? create(d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds())\n : create(d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds());\n}\nexport function maxValue() {\n // This is \"23:59:59.999\"\n return millisecondsPerDay - 1;\n}\nexport function add(t, ts, wrappedDays) {\n if (wrappedDays === undefined) {\n const t2 = (t + ts) % millisecondsPerDay;\n return t2 < 0 ? millisecondsPerDay + t2 : t2;\n }\n wrappedDays.contents = ts / millisecondsPerDay;\n let newMs = t + ts % millisecondsPerDay;\n if (newMs < 0) {\n wrappedDays.contents--;\n newMs += millisecondsPerDay;\n }\n else {\n if (newMs >= millisecondsPerDay) {\n wrappedDays.contents++;\n newMs -= millisecondsPerDay;\n }\n }\n return newMs;\n}\nexport function addHours(t, h) {\n return add(t, h * 3600000);\n}\nexport function addMinutes(t, m) {\n return add(t, m * 60000);\n}\nexport function isBetween(t, start, end) {\n return start <= end\n ? (start <= t && end > t)\n : (start <= t || end > t);\n}\nexport function toString(t, format = \"t\", _provider) {\n if ([\"r\", \"R\", \"o\", \"O\", \"t\", \"T\"].indexOf(format) === -1) {\n throw new Error(\"Custom formats are not supported\");\n }\n const base = `${padWithZeros(hours(t), 2)}:${padWithZeros(minutes(t), 2)}`;\n if (format === \"t\")\n return base;\n const s = padWithZeros(seconds(t), 2);\n // We're limited to millisecond precision, so the last 4 digits will always be 0\n return `${base}${format === \"o\" || format === \"O\" ? `:${s}.${padWithZeros(milliseconds(t), 3)}0000` : `:${s}`}`;\n}\nexport function parse(str) {\n // Allowed format types:\n // hh:mm\n // hh:mm:ss\n // hh:mm:ss.fffffff\n const r = /^\\s*([0-1]?\\d|2[0-3])\\s*:\\s*([0-5]?\\d)(\\s*:\\s*([0-5]?\\d)(\\.(\\d+))?)?\\s*$/.exec(str);\n if (r != null && r[1] != null && r[2] != null) {\n let ms = 0;\n let s = 0;\n const h = +r[1];\n const m = +r[2];\n if (r[4] != null) {\n s = +r[4];\n }\n if (r[6] != null) {\n // Depending on the number of decimals passed, we need to adapt the numbers\n switch (r[6].length) {\n case 1:\n ms = +r[6] * 100;\n break;\n case 2:\n ms = +r[6] * 10;\n break;\n case 3:\n ms = +r[6];\n break;\n case 4:\n ms = +r[6] / 10;\n break;\n case 5:\n ms = +r[6] / 100;\n break;\n case 6:\n ms = +r[6] / 1000;\n break;\n default:\n ms = +r[6].substring(0, 7) / 10000;\n break;\n }\n }\n return create(h, m, s, Math.trunc(ms));\n }\n throw new Error(`String '${str}' was not recognized as a valid TimeOnly.`);\n}\nexport function tryParse(v, defValue) {\n try {\n defValue.contents = parse(v);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nexport function op_Subtraction(left, right) {\n return add(left, -right);\n}\n","import { trim } from \"./String.js\";\n// RFC 4122 compliant. From https://stackoverflow.com/a/13653180/3922220\n// const guidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n// Relax GUID parsing, see #1637\nconst guidRegex = /^[\\(\\{]{0,2}[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[\\)\\}]{0,2}$/;\nconst guidRegexNoHyphen = /^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/;\nconst guidRegexHex = /^\\{0x[0-9a-f]{8},(0x[0-9a-f]{4},){2}\\{(0x[0-9a-f]{2},){7}0x[0-9a-f]{2}\\}\\}$/;\nconst guidHexCaptures = /^([0-9a-f]{8})-(([0-9a-f]{4})-)(([0-9a-f]{4})-)([0-9a-f]{2})([0-9a-f]{2})-([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/;\nexport function toString(str, format, _provider) {\n if (format && (format === null || format === void 0 ? void 0 : format.length) > 0) {\n switch (format) {\n case \"N\":\n return str.replace(/-/g, '');\n case \"D\":\n return str;\n case \"B\":\n return \"{\" + str + \"}\";\n case \"P\":\n return \"(\" + str + \")\";\n case \"X\":\n return str.replace(guidHexCaptures, \"{0x$1,0x$3,0x$5,{0x$6,0x$7,0x$8,0x$9,0x$10,0x$11,0x$12,0x$13}}\");\n default:\n throw new Error(\"Unrecognized Guid print format\");\n }\n }\n else {\n return str;\n }\n}\n/** Validates UUID as specified in RFC4122 (versions 1-5). */\nexport function parse(str) {\n function hyphenateGuid(str) {\n return str.replace(guidRegexNoHyphen, \"$1-$2-$3-$4-$5\");\n }\n const wsTrimAndLowered = str.trim().toLowerCase();\n if (guidRegex.test(wsTrimAndLowered)) {\n return trim(wsTrimAndLowered, \"{\", \"}\", \"(\", \")\");\n }\n else if (guidRegexNoHyphen.test(wsTrimAndLowered)) {\n return hyphenateGuid(wsTrimAndLowered);\n }\n else if (guidRegexHex.test(wsTrimAndLowered)) {\n return hyphenateGuid(wsTrimAndLowered.replace(/[\\{\\},]|0x/g, ''));\n }\n else {\n throw new Error(\"Guid should contain 32 digits with 4 dashes: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\");\n }\n}\nexport function tryParse(str, defValue) {\n try {\n defValue.contents = parse(str);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\n// From https://gist.github.com/LeverOne/1308368\nexport function newGuid() {\n let b = \"\";\n for (let a = 0; a++ < 36;) {\n b += a * 51 & 52\n ? (a ^ 15 ? 8 ^ Math.random() * (a ^ 20 ? 16 : 4) : 4).toString(16)\n : \"-\";\n }\n return b;\n}\n// Maps for number <-> hex string conversion\nlet _convertMapsInitialized = false;\nlet _byteToHex;\nlet _hexToByte;\nfunction initConvertMaps() {\n _byteToHex = new Array(256);\n _hexToByte = {};\n for (let i = 0; i < 256; i++) {\n _byteToHex[i] = (i + 0x100).toString(16).substr(1);\n _hexToByte[_byteToHex[i]] = i;\n }\n _convertMapsInitialized = true;\n}\n/** Parse a UUID into it's component bytes */\n// Adapted from https://github.com/zefferus/uuid-parse\nexport function guidToArray(s) {\n if (!_convertMapsInitialized) {\n initConvertMaps();\n }\n let i = 0;\n const buf = new Uint8Array(16);\n s.toLowerCase().replace(/[0-9a-f]{2}/g, ((oct) => {\n switch (i) {\n // .NET saves first three byte groups with different endianness\n // See https://stackoverflow.com/a/16722909/3922220\n case 0:\n case 1:\n case 2:\n case 3:\n buf[3 - i++] = _hexToByte[oct];\n break;\n case 4:\n case 5:\n buf[9 - i++] = _hexToByte[oct];\n break;\n case 6:\n case 7:\n buf[13 - i++] = _hexToByte[oct];\n break;\n case 8:\n case 9:\n case 10:\n case 11:\n case 12:\n case 13:\n case 14:\n case 15:\n buf[i++] = _hexToByte[oct];\n break;\n }\n }));\n // Zero out remaining bytes if string was short\n while (i < 16) {\n buf[i++] = 0;\n }\n return buf;\n}\n/** Convert UUID byte array into a string */\nexport function arrayToGuid(buf) {\n if (buf.length !== 16) {\n throw new Error(\"Byte array for GUID must be exactly 16 bytes long\");\n }\n if (!_convertMapsInitialized) {\n initConvertMaps();\n }\n const guid = _byteToHex[buf[3]] + _byteToHex[buf[2]] +\n _byteToHex[buf[1]] + _byteToHex[buf[0]] + \"-\" +\n _byteToHex[buf[5]] + _byteToHex[buf[4]] + \"-\" +\n _byteToHex[buf[7]] + _byteToHex[buf[6]] + \"-\" +\n _byteToHex[buf[8]] + _byteToHex[buf[9]] + \"-\" +\n _byteToHex[buf[10]] + _byteToHex[buf[11]] +\n _byteToHex[buf[12]] + _byteToHex[buf[13]] +\n _byteToHex[buf[14]] + _byteToHex[buf[15]];\n return guid;\n}\n","import { fromBits, getHighBits, getHighBitsUnsigned, getLowBits, getLowBitsUnsigned } from \"./Long.js\";\nconst littleEndian = true;\nexport function isLittleEndian() {\n return littleEndian;\n}\nexport function getBytesBoolean(value) {\n const bytes = new Uint8Array(1);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setUint8(0, value ? 1 : 0);\n return bytes;\n}\nexport function getBytesChar(value) {\n const bytes = new Uint8Array(2);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setUint16(0, value.charCodeAt(0), littleEndian);\n return bytes;\n}\nexport function getBytesInt16(value) {\n const bytes = new Uint8Array(2);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setInt16(0, value, littleEndian);\n return bytes;\n}\nexport function getBytesInt32(value) {\n const bytes = new Uint8Array(4);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setInt32(0, value, littleEndian);\n return bytes;\n}\nexport function getBytesInt64(value) {\n const bytes = new Uint8Array(8);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setInt32(littleEndian ? 0 : 4, getLowBits(value), littleEndian);\n view.setInt32(littleEndian ? 4 : 0, getHighBits(value), littleEndian);\n return bytes;\n}\nexport function getBytesUInt16(value) {\n const bytes = new Uint8Array(2);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setUint16(0, value, littleEndian);\n return bytes;\n}\nexport function getBytesUInt32(value) {\n const bytes = new Uint8Array(4);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setUint32(0, value, littleEndian);\n return bytes;\n}\nexport function getBytesUInt64(value) {\n const bytes = new Uint8Array(8);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setUint32(littleEndian ? 0 : 4, getLowBitsUnsigned(value), littleEndian);\n view.setUint32(littleEndian ? 4 : 0, getHighBitsUnsigned(value), littleEndian);\n return bytes;\n}\nexport function getBytesSingle(value) {\n const bytes = new Uint8Array(4);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setFloat32(0, value, littleEndian);\n return bytes;\n}\nexport function getBytesDouble(value) {\n const bytes = new Uint8Array(8);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n view.setFloat64(0, value, littleEndian);\n return bytes;\n}\nexport function int64BitsToDouble(value) {\n const buffer = new ArrayBuffer(8);\n const view = new DataView(buffer);\n view.setInt32(littleEndian ? 0 : 4, getLowBits(value), littleEndian);\n view.setInt32(littleEndian ? 4 : 0, getHighBits(value), littleEndian);\n return view.getFloat64(0, littleEndian);\n}\nexport function doubleToInt64Bits(value) {\n const buffer = new ArrayBuffer(8);\n const view = new DataView(buffer);\n view.setFloat64(0, value, littleEndian);\n const lowBits = view.getInt32(littleEndian ? 0 : 4, littleEndian);\n const highBits = view.getInt32(littleEndian ? 4 : 0, littleEndian);\n return fromBits(lowBits, highBits, false);\n}\nexport function toBoolean(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n return view.getUint8(offset) === 1 ? true : false;\n}\nexport function toChar(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n const code = view.getUint16(offset, littleEndian);\n return String.fromCharCode(code);\n}\nexport function toInt16(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n return view.getInt16(offset, littleEndian);\n}\nexport function toInt32(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n return view.getInt32(offset, littleEndian);\n}\nexport function toInt64(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n const lowBits = view.getInt32(offset + (littleEndian ? 0 : 4), littleEndian);\n const highBits = view.getInt32(offset + (littleEndian ? 4 : 0), littleEndian);\n return fromBits(lowBits, highBits, false);\n}\nexport function toUInt16(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n return view.getUint16(offset, littleEndian);\n}\nexport function toUInt32(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n return view.getUint32(offset, littleEndian);\n}\nexport function toUInt64(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n const lowBits = view.getUint32(offset + (littleEndian ? 0 : 4), littleEndian);\n const highBits = view.getUint32(offset + (littleEndian ? 4 : 0), littleEndian);\n return fromBits(lowBits, highBits, true);\n}\nexport function toSingle(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n return view.getFloat32(offset, littleEndian);\n}\nexport function toDouble(bytes, offset) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n return view.getFloat64(offset, littleEndian);\n}\nexport function toString(bytes, offset, count) {\n const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes);\n let buffer = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n if (offset != null && count != null) {\n buffer = buffer.subarray(offset, offset + count);\n }\n else if (offset != null) {\n buffer = buffer.subarray(offset);\n }\n return Array.from(buffer).map((b) => (\"0\" + b.toString(16)).slice(-2)).join(\"-\");\n}\n","import { record_type, bool_type, list_type, option_type, class_type } from \"./Reflection.js\";\nimport { some, value as value_1 } from \"./Option.js\";\nimport { toString, Record } from \"./Types.js\";\nimport { FSharpList, fold as fold_2, cons, singleton as singleton_1, empty as empty_1, ofArrayWithTail, tail, head, isEmpty as isEmpty_1 } from \"./List.js\";\nimport { fold as fold_1, fill } from \"./Array.js\";\nimport { structuralHash, toIterator, disposeSafe, getEnumerator, isArrayLike } from \"./Util.js\";\nimport { join } from \"./String.js\";\nimport { exists as exists_1, cache, forAll as forAll_1, fold as fold_3, reduce, iterate as iterate_1, map as map_1 } from \"./Seq.js\";\nimport { HashSet__get_Comparer, HashSet_$ctor_Z6150332D, HashSet } from \"./MutableSet.js\";\n\nexport class SetTreeLeaf$1 {\n constructor(k) {\n this.k = k;\n }\n}\n\nexport function SetTreeLeaf$1$reflection(gen0) {\n return class_type(\"Set.SetTreeLeaf`1\", [gen0], SetTreeLeaf$1);\n}\n\nexport function SetTreeLeaf$1_$ctor_2B595(k) {\n return new SetTreeLeaf$1(k);\n}\n\nexport function SetTreeLeaf$1__get_Key(_) {\n return _.k;\n}\n\nexport class SetTreeNode$1 extends SetTreeLeaf$1 {\n constructor(v, left, right, h) {\n super(v);\n this.left = left;\n this.right = right;\n this.h = (h | 0);\n }\n}\n\nexport function SetTreeNode$1$reflection(gen0) {\n return class_type(\"Set.SetTreeNode`1\", [gen0], SetTreeNode$1, SetTreeLeaf$1$reflection(gen0));\n}\n\nexport function SetTreeNode$1_$ctor_Z6E7BE5F7(v, left, right, h) {\n return new SetTreeNode$1(v, left, right, h);\n}\n\nexport function SetTreeNode$1__get_Left(_) {\n return _.left;\n}\n\nexport function SetTreeNode$1__get_Right(_) {\n return _.right;\n}\n\nexport function SetTreeNode$1__get_Height(_) {\n return _.h;\n}\n\nexport function SetTreeModule_empty() {\n return void 0;\n}\n\nexport function SetTreeModule_countAux(t_mut, acc_mut) {\n SetTreeModule_countAux:\n while (true) {\n const t = t_mut, acc = acc_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n t_mut = SetTreeNode$1__get_Left(t2);\n acc_mut = SetTreeModule_countAux(SetTreeNode$1__get_Right(t2), acc + 1);\n continue SetTreeModule_countAux;\n }\n else {\n return (acc + 1) | 0;\n }\n }\n else {\n return acc | 0;\n }\n break;\n }\n}\n\nexport function SetTreeModule_count(s) {\n return SetTreeModule_countAux(s, 0);\n}\n\nexport function SetTreeModule_mk(l, k, r) {\n let hl;\n const t = l;\n if (t != null) {\n const t2 = t;\n hl = ((t2 instanceof SetTreeNode$1) ? SetTreeNode$1__get_Height(t2) : 1);\n }\n else {\n hl = 0;\n }\n let hr;\n const t_1 = r;\n if (t_1 != null) {\n const t2_1 = t_1;\n hr = ((t2_1 instanceof SetTreeNode$1) ? SetTreeNode$1__get_Height(t2_1) : 1);\n }\n else {\n hr = 0;\n }\n const m = ((hl < hr) ? hr : hl) | 0;\n if (m === 0) {\n return SetTreeLeaf$1_$ctor_2B595(k);\n }\n else {\n return SetTreeNode$1_$ctor_Z6E7BE5F7(k, l, r, m + 1);\n }\n}\n\nexport function SetTreeModule_rebalance(t1, v, t2) {\n let t_2, t2_3, t_3, t2_4;\n let t1h;\n const t = t1;\n if (t != null) {\n const t2_1 = t;\n t1h = ((t2_1 instanceof SetTreeNode$1) ? SetTreeNode$1__get_Height(t2_1) : 1);\n }\n else {\n t1h = 0;\n }\n let t2h;\n const t_1 = t2;\n if (t_1 != null) {\n const t2_2 = t_1;\n t2h = ((t2_2 instanceof SetTreeNode$1) ? SetTreeNode$1__get_Height(t2_2) : 1);\n }\n else {\n t2h = 0;\n }\n if (t2h > (t1h + 2)) {\n const matchValue = value_1(t2);\n if (matchValue instanceof SetTreeNode$1) {\n if (((t_2 = SetTreeNode$1__get_Left(matchValue), (t_2 != null) ? ((t2_3 = t_2, (t2_3 instanceof SetTreeNode$1) ? SetTreeNode$1__get_Height(t2_3) : 1)) : 0)) > (t1h + 1)) {\n const matchValue_1 = value_1(SetTreeNode$1__get_Left(matchValue));\n if (matchValue_1 instanceof SetTreeNode$1) {\n return SetTreeModule_mk(SetTreeModule_mk(t1, v, SetTreeNode$1__get_Left(matchValue_1)), SetTreeLeaf$1__get_Key(matchValue_1), SetTreeModule_mk(SetTreeNode$1__get_Right(matchValue_1), SetTreeLeaf$1__get_Key(matchValue), SetTreeNode$1__get_Right(matchValue)));\n }\n else {\n throw (new Error(\"internal error: Set.rebalance\"));\n }\n }\n else {\n return SetTreeModule_mk(SetTreeModule_mk(t1, v, SetTreeNode$1__get_Left(matchValue)), SetTreeLeaf$1__get_Key(matchValue), SetTreeNode$1__get_Right(matchValue));\n }\n }\n else {\n throw (new Error(\"internal error: Set.rebalance\"));\n }\n }\n else if (t1h > (t2h + 2)) {\n const matchValue_2 = value_1(t1);\n if (matchValue_2 instanceof SetTreeNode$1) {\n if (((t_3 = SetTreeNode$1__get_Right(matchValue_2), (t_3 != null) ? ((t2_4 = t_3, (t2_4 instanceof SetTreeNode$1) ? SetTreeNode$1__get_Height(t2_4) : 1)) : 0)) > (t2h + 1)) {\n const matchValue_3 = value_1(SetTreeNode$1__get_Right(matchValue_2));\n if (matchValue_3 instanceof SetTreeNode$1) {\n return SetTreeModule_mk(SetTreeModule_mk(SetTreeNode$1__get_Left(matchValue_2), SetTreeLeaf$1__get_Key(matchValue_2), SetTreeNode$1__get_Left(matchValue_3)), SetTreeLeaf$1__get_Key(matchValue_3), SetTreeModule_mk(SetTreeNode$1__get_Right(matchValue_3), v, t2));\n }\n else {\n throw (new Error(\"internal error: Set.rebalance\"));\n }\n }\n else {\n return SetTreeModule_mk(SetTreeNode$1__get_Left(matchValue_2), SetTreeLeaf$1__get_Key(matchValue_2), SetTreeModule_mk(SetTreeNode$1__get_Right(matchValue_2), v, t2));\n }\n }\n else {\n throw (new Error(\"internal error: Set.rebalance\"));\n }\n }\n else {\n return SetTreeModule_mk(t1, v, t2);\n }\n}\n\nexport function SetTreeModule_add(comparer, k, t) {\n if (t != null) {\n const t2 = t;\n const c = comparer.Compare(k, SetTreeLeaf$1__get_Key(t2)) | 0;\n if (t2 instanceof SetTreeNode$1) {\n if (c < 0) {\n return SetTreeModule_rebalance(SetTreeModule_add(comparer, k, SetTreeNode$1__get_Left(t2)), SetTreeLeaf$1__get_Key(t2), SetTreeNode$1__get_Right(t2));\n }\n else if (c === 0) {\n return t;\n }\n else {\n return SetTreeModule_rebalance(SetTreeNode$1__get_Left(t2), SetTreeLeaf$1__get_Key(t2), SetTreeModule_add(comparer, k, SetTreeNode$1__get_Right(t2)));\n }\n }\n else {\n const c_1 = comparer.Compare(k, SetTreeLeaf$1__get_Key(t2)) | 0;\n if (c_1 < 0) {\n return SetTreeNode$1_$ctor_Z6E7BE5F7(k, SetTreeModule_empty(), t, 2);\n }\n else if (c_1 === 0) {\n return t;\n }\n else {\n return SetTreeNode$1_$ctor_Z6E7BE5F7(k, t, SetTreeModule_empty(), 2);\n }\n }\n }\n else {\n return SetTreeLeaf$1_$ctor_2B595(k);\n }\n}\n\nexport function SetTreeModule_balance(comparer, t1, k, t2) {\n if (t1 != null) {\n const t1$0027 = t1;\n if (t2 != null) {\n const t2$0027 = t2;\n if (t1$0027 instanceof SetTreeNode$1) {\n if (t2$0027 instanceof SetTreeNode$1) {\n if ((SetTreeNode$1__get_Height(t1$0027) + 2) < SetTreeNode$1__get_Height(t2$0027)) {\n return SetTreeModule_rebalance(SetTreeModule_balance(comparer, t1, k, SetTreeNode$1__get_Left(t2$0027)), SetTreeLeaf$1__get_Key(t2$0027), SetTreeNode$1__get_Right(t2$0027));\n }\n else if ((SetTreeNode$1__get_Height(t2$0027) + 2) < SetTreeNode$1__get_Height(t1$0027)) {\n return SetTreeModule_rebalance(SetTreeNode$1__get_Left(t1$0027), SetTreeLeaf$1__get_Key(t1$0027), SetTreeModule_balance(comparer, SetTreeNode$1__get_Right(t1$0027), k, t2));\n }\n else {\n return SetTreeModule_mk(t1, k, t2);\n }\n }\n else {\n return SetTreeModule_add(comparer, k, SetTreeModule_add(comparer, SetTreeLeaf$1__get_Key(t2$0027), t1));\n }\n }\n else {\n return SetTreeModule_add(comparer, k, SetTreeModule_add(comparer, SetTreeLeaf$1__get_Key(t1$0027), t2));\n }\n }\n else {\n return SetTreeModule_add(comparer, k, t1);\n }\n }\n else {\n return SetTreeModule_add(comparer, k, t2);\n }\n}\n\nexport function SetTreeModule_split(comparer, pivot, t) {\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n const c = comparer.Compare(pivot, SetTreeLeaf$1__get_Key(t2)) | 0;\n if (c < 0) {\n const patternInput = SetTreeModule_split(comparer, pivot, SetTreeNode$1__get_Left(t2));\n return [patternInput[0], patternInput[1], SetTreeModule_balance(comparer, patternInput[2], SetTreeLeaf$1__get_Key(t2), SetTreeNode$1__get_Right(t2))];\n }\n else if (c === 0) {\n return [SetTreeNode$1__get_Left(t2), true, SetTreeNode$1__get_Right(t2)];\n }\n else {\n const patternInput_1 = SetTreeModule_split(comparer, pivot, SetTreeNode$1__get_Right(t2));\n return [SetTreeModule_balance(comparer, SetTreeNode$1__get_Left(t2), SetTreeLeaf$1__get_Key(t2), patternInput_1[0]), patternInput_1[1], patternInput_1[2]];\n }\n }\n else {\n const c_1 = comparer.Compare(SetTreeLeaf$1__get_Key(t2), pivot) | 0;\n if (c_1 < 0) {\n return [t, false, SetTreeModule_empty()];\n }\n else if (c_1 === 0) {\n return [SetTreeModule_empty(), true, SetTreeModule_empty()];\n }\n else {\n return [SetTreeModule_empty(), false, t];\n }\n }\n }\n else {\n return [SetTreeModule_empty(), false, SetTreeModule_empty()];\n }\n}\n\nexport function SetTreeModule_spliceOutSuccessor(t) {\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n if (SetTreeNode$1__get_Left(t2) == null) {\n return [SetTreeLeaf$1__get_Key(t2), SetTreeNode$1__get_Right(t2)];\n }\n else {\n const patternInput = SetTreeModule_spliceOutSuccessor(SetTreeNode$1__get_Left(t2));\n return [patternInput[0], SetTreeModule_mk(patternInput[1], SetTreeLeaf$1__get_Key(t2), SetTreeNode$1__get_Right(t2))];\n }\n }\n else {\n return [SetTreeLeaf$1__get_Key(t2), SetTreeModule_empty()];\n }\n }\n else {\n throw (new Error(\"internal error: Set.spliceOutSuccessor\"));\n }\n}\n\nexport function SetTreeModule_remove(comparer, k, t) {\n if (t != null) {\n const t2 = t;\n const c = comparer.Compare(k, SetTreeLeaf$1__get_Key(t2)) | 0;\n if (t2 instanceof SetTreeNode$1) {\n if (c < 0) {\n return SetTreeModule_rebalance(SetTreeModule_remove(comparer, k, SetTreeNode$1__get_Left(t2)), SetTreeLeaf$1__get_Key(t2), SetTreeNode$1__get_Right(t2));\n }\n else if (c === 0) {\n if (SetTreeNode$1__get_Left(t2) == null) {\n return SetTreeNode$1__get_Right(t2);\n }\n else if (SetTreeNode$1__get_Right(t2) == null) {\n return SetTreeNode$1__get_Left(t2);\n }\n else {\n const patternInput = SetTreeModule_spliceOutSuccessor(SetTreeNode$1__get_Right(t2));\n return SetTreeModule_mk(SetTreeNode$1__get_Left(t2), patternInput[0], patternInput[1]);\n }\n }\n else {\n return SetTreeModule_rebalance(SetTreeNode$1__get_Left(t2), SetTreeLeaf$1__get_Key(t2), SetTreeModule_remove(comparer, k, SetTreeNode$1__get_Right(t2)));\n }\n }\n else if (c === 0) {\n return SetTreeModule_empty();\n }\n else {\n return t;\n }\n }\n else {\n return t;\n }\n}\n\nexport function SetTreeModule_mem(comparer_mut, k_mut, t_mut) {\n SetTreeModule_mem:\n while (true) {\n const comparer = comparer_mut, k = k_mut, t = t_mut;\n if (t != null) {\n const t2 = t;\n const c = comparer.Compare(k, SetTreeLeaf$1__get_Key(t2)) | 0;\n if (t2 instanceof SetTreeNode$1) {\n if (c < 0) {\n comparer_mut = comparer;\n k_mut = k;\n t_mut = SetTreeNode$1__get_Left(t2);\n continue SetTreeModule_mem;\n }\n else if (c === 0) {\n return true;\n }\n else {\n comparer_mut = comparer;\n k_mut = k;\n t_mut = SetTreeNode$1__get_Right(t2);\n continue SetTreeModule_mem;\n }\n }\n else {\n return c === 0;\n }\n }\n else {\n return false;\n }\n break;\n }\n}\n\nexport function SetTreeModule_iter(f_mut, t_mut) {\n SetTreeModule_iter:\n while (true) {\n const f = f_mut, t = t_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n SetTreeModule_iter(f, SetTreeNode$1__get_Left(t2));\n f(SetTreeLeaf$1__get_Key(t2));\n f_mut = f;\n t_mut = SetTreeNode$1__get_Right(t2);\n continue SetTreeModule_iter;\n }\n else {\n f(SetTreeLeaf$1__get_Key(t2));\n }\n }\n break;\n }\n}\n\nexport function SetTreeModule_foldBackOpt(f_mut, t_mut, x_mut) {\n SetTreeModule_foldBackOpt:\n while (true) {\n const f = f_mut, t = t_mut, x = x_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n f_mut = f;\n t_mut = SetTreeNode$1__get_Left(t2);\n x_mut = f(SetTreeLeaf$1__get_Key(t2), SetTreeModule_foldBackOpt(f, SetTreeNode$1__get_Right(t2), x));\n continue SetTreeModule_foldBackOpt;\n }\n else {\n return f(SetTreeLeaf$1__get_Key(t2), x);\n }\n }\n else {\n return x;\n }\n break;\n }\n}\n\nexport function SetTreeModule_foldBack(f, m, x) {\n return SetTreeModule_foldBackOpt(f, m, x);\n}\n\nexport function SetTreeModule_foldOpt(f_mut, x_mut, t_mut) {\n SetTreeModule_foldOpt:\n while (true) {\n const f = f_mut, x = x_mut, t = t_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n f_mut = f;\n x_mut = f(SetTreeModule_foldOpt(f, x, SetTreeNode$1__get_Left(t2)), SetTreeLeaf$1__get_Key(t2));\n t_mut = SetTreeNode$1__get_Right(t2);\n continue SetTreeModule_foldOpt;\n }\n else {\n return f(x, SetTreeLeaf$1__get_Key(t2));\n }\n }\n else {\n return x;\n }\n break;\n }\n}\n\nexport function SetTreeModule_fold(f, x, m) {\n return SetTreeModule_foldOpt(f, x, m);\n}\n\nexport function SetTreeModule_forall(f_mut, t_mut) {\n SetTreeModule_forall:\n while (true) {\n const f = f_mut, t = t_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n if (f(SetTreeLeaf$1__get_Key(t2)) && SetTreeModule_forall(f, SetTreeNode$1__get_Left(t2))) {\n f_mut = f;\n t_mut = SetTreeNode$1__get_Right(t2);\n continue SetTreeModule_forall;\n }\n else {\n return false;\n }\n }\n else {\n return f(SetTreeLeaf$1__get_Key(t2));\n }\n }\n else {\n return true;\n }\n break;\n }\n}\n\nexport function SetTreeModule_exists(f_mut, t_mut) {\n SetTreeModule_exists:\n while (true) {\n const f = f_mut, t = t_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n if (f(SetTreeLeaf$1__get_Key(t2)) ? true : SetTreeModule_exists(f, SetTreeNode$1__get_Left(t2))) {\n return true;\n }\n else {\n f_mut = f;\n t_mut = SetTreeNode$1__get_Right(t2);\n continue SetTreeModule_exists;\n }\n }\n else {\n return f(SetTreeLeaf$1__get_Key(t2));\n }\n }\n else {\n return false;\n }\n break;\n }\n}\n\nexport function SetTreeModule_subset(comparer, a, b) {\n return SetTreeModule_forall((x) => SetTreeModule_mem(comparer, x, b), a);\n}\n\nexport function SetTreeModule_properSubset(comparer, a, b) {\n if (SetTreeModule_forall((x) => SetTreeModule_mem(comparer, x, b), a)) {\n return SetTreeModule_exists((x_1) => (!SetTreeModule_mem(comparer, x_1, a)), b);\n }\n else {\n return false;\n }\n}\n\nexport function SetTreeModule_filterAux(comparer_mut, f_mut, t_mut, acc_mut) {\n SetTreeModule_filterAux:\n while (true) {\n const comparer = comparer_mut, f = f_mut, t = t_mut, acc = acc_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n const acc_1 = f(SetTreeLeaf$1__get_Key(t2)) ? SetTreeModule_add(comparer, SetTreeLeaf$1__get_Key(t2), acc) : acc;\n comparer_mut = comparer;\n f_mut = f;\n t_mut = SetTreeNode$1__get_Left(t2);\n acc_mut = SetTreeModule_filterAux(comparer, f, SetTreeNode$1__get_Right(t2), acc_1);\n continue SetTreeModule_filterAux;\n }\n else if (f(SetTreeLeaf$1__get_Key(t2))) {\n return SetTreeModule_add(comparer, SetTreeLeaf$1__get_Key(t2), acc);\n }\n else {\n return acc;\n }\n }\n else {\n return acc;\n }\n break;\n }\n}\n\nexport function SetTreeModule_filter(comparer, f, s) {\n return SetTreeModule_filterAux(comparer, f, s, SetTreeModule_empty());\n}\n\nexport function SetTreeModule_diffAux(comparer_mut, t_mut, acc_mut) {\n SetTreeModule_diffAux:\n while (true) {\n const comparer = comparer_mut, t = t_mut, acc = acc_mut;\n if (acc == null) {\n return acc;\n }\n else if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n t_mut = SetTreeNode$1__get_Left(t2);\n acc_mut = SetTreeModule_diffAux(comparer, SetTreeNode$1__get_Right(t2), SetTreeModule_remove(comparer, SetTreeLeaf$1__get_Key(t2), acc));\n continue SetTreeModule_diffAux;\n }\n else {\n return SetTreeModule_remove(comparer, SetTreeLeaf$1__get_Key(t2), acc);\n }\n }\n else {\n return acc;\n }\n break;\n }\n}\n\nexport function SetTreeModule_diff(comparer, a, b) {\n return SetTreeModule_diffAux(comparer, b, a);\n}\n\nexport function SetTreeModule_union(comparer, t1, t2) {\n if (t1 != null) {\n const t1$0027 = t1;\n if (t2 != null) {\n const t2$0027 = t2;\n if (t1$0027 instanceof SetTreeNode$1) {\n if (t2$0027 instanceof SetTreeNode$1) {\n if (SetTreeNode$1__get_Height(t1$0027) > SetTreeNode$1__get_Height(t2$0027)) {\n const patternInput = SetTreeModule_split(comparer, SetTreeLeaf$1__get_Key(t1$0027), t2);\n return SetTreeModule_balance(comparer, SetTreeModule_union(comparer, SetTreeNode$1__get_Left(t1$0027), patternInput[0]), SetTreeLeaf$1__get_Key(t1$0027), SetTreeModule_union(comparer, SetTreeNode$1__get_Right(t1$0027), patternInput[2]));\n }\n else {\n const patternInput_1 = SetTreeModule_split(comparer, SetTreeLeaf$1__get_Key(t2$0027), t1);\n return SetTreeModule_balance(comparer, SetTreeModule_union(comparer, SetTreeNode$1__get_Left(t2$0027), patternInput_1[0]), SetTreeLeaf$1__get_Key(t2$0027), SetTreeModule_union(comparer, SetTreeNode$1__get_Right(t2$0027), patternInput_1[2]));\n }\n }\n else {\n return SetTreeModule_add(comparer, SetTreeLeaf$1__get_Key(t2$0027), t1);\n }\n }\n else {\n return SetTreeModule_add(comparer, SetTreeLeaf$1__get_Key(t1$0027), t2);\n }\n }\n else {\n return t1;\n }\n }\n else {\n return t2;\n }\n}\n\nexport function SetTreeModule_intersectionAux(comparer_mut, b_mut, t_mut, acc_mut) {\n SetTreeModule_intersectionAux:\n while (true) {\n const comparer = comparer_mut, b = b_mut, t = t_mut, acc = acc_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n const acc_1 = SetTreeModule_intersectionAux(comparer, b, SetTreeNode$1__get_Right(t2), acc);\n const acc_2 = SetTreeModule_mem(comparer, SetTreeLeaf$1__get_Key(t2), b) ? SetTreeModule_add(comparer, SetTreeLeaf$1__get_Key(t2), acc_1) : acc_1;\n comparer_mut = comparer;\n b_mut = b;\n t_mut = SetTreeNode$1__get_Left(t2);\n acc_mut = acc_2;\n continue SetTreeModule_intersectionAux;\n }\n else if (SetTreeModule_mem(comparer, SetTreeLeaf$1__get_Key(t2), b)) {\n return SetTreeModule_add(comparer, SetTreeLeaf$1__get_Key(t2), acc);\n }\n else {\n return acc;\n }\n }\n else {\n return acc;\n }\n break;\n }\n}\n\nexport function SetTreeModule_intersection(comparer, a, b) {\n return SetTreeModule_intersectionAux(comparer, b, a, SetTreeModule_empty());\n}\n\nexport function SetTreeModule_partition1(comparer, f, k, acc1, acc2) {\n if (f(k)) {\n return [SetTreeModule_add(comparer, k, acc1), acc2];\n }\n else {\n return [acc1, SetTreeModule_add(comparer, k, acc2)];\n }\n}\n\nexport function SetTreeModule_partitionAux(comparer_mut, f_mut, t_mut, acc__mut, acc__1_mut) {\n SetTreeModule_partitionAux:\n while (true) {\n const comparer = comparer_mut, f = f_mut, t = t_mut, acc_ = acc__mut, acc__1 = acc__1_mut;\n const acc = [acc_, acc__1];\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n const acc_1 = SetTreeModule_partitionAux(comparer, f, SetTreeNode$1__get_Right(t2), acc[0], acc[1]);\n const acc_4 = SetTreeModule_partition1(comparer, f, SetTreeLeaf$1__get_Key(t2), acc_1[0], acc_1[1]);\n comparer_mut = comparer;\n f_mut = f;\n t_mut = SetTreeNode$1__get_Left(t2);\n acc__mut = acc_4[0];\n acc__1_mut = acc_4[1];\n continue SetTreeModule_partitionAux;\n }\n else {\n return SetTreeModule_partition1(comparer, f, SetTreeLeaf$1__get_Key(t2), acc[0], acc[1]);\n }\n }\n else {\n return acc;\n }\n break;\n }\n}\n\nexport function SetTreeModule_partition(comparer, f, s) {\n return SetTreeModule_partitionAux(comparer, f, s, SetTreeModule_empty(), SetTreeModule_empty());\n}\n\nexport function SetTreeModule_minimumElementAux(t_mut, n_mut) {\n SetTreeModule_minimumElementAux:\n while (true) {\n const t = t_mut, n = n_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n t_mut = SetTreeNode$1__get_Left(t2);\n n_mut = SetTreeLeaf$1__get_Key(t2);\n continue SetTreeModule_minimumElementAux;\n }\n else {\n return SetTreeLeaf$1__get_Key(t2);\n }\n }\n else {\n return n;\n }\n break;\n }\n}\n\nexport function SetTreeModule_minimumElementOpt(t) {\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n return some(SetTreeModule_minimumElementAux(SetTreeNode$1__get_Left(t2), SetTreeLeaf$1__get_Key(t2)));\n }\n else {\n return some(SetTreeLeaf$1__get_Key(t2));\n }\n }\n else {\n return void 0;\n }\n}\n\nexport function SetTreeModule_maximumElementAux(t_mut, n_mut) {\n SetTreeModule_maximumElementAux:\n while (true) {\n const t = t_mut, n = n_mut;\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n t_mut = SetTreeNode$1__get_Right(t2);\n n_mut = SetTreeLeaf$1__get_Key(t2);\n continue SetTreeModule_maximumElementAux;\n }\n else {\n return SetTreeLeaf$1__get_Key(t2);\n }\n }\n else {\n return n;\n }\n break;\n }\n}\n\nexport function SetTreeModule_maximumElementOpt(t) {\n if (t != null) {\n const t2 = t;\n if (t2 instanceof SetTreeNode$1) {\n return some(SetTreeModule_maximumElementAux(SetTreeNode$1__get_Right(t2), SetTreeLeaf$1__get_Key(t2)));\n }\n else {\n return some(SetTreeLeaf$1__get_Key(t2));\n }\n }\n else {\n return void 0;\n }\n}\n\nexport function SetTreeModule_minimumElement(s) {\n const matchValue = SetTreeModule_minimumElementOpt(s);\n if (matchValue == null) {\n throw (new Error(\"Set contains no elements\"));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport function SetTreeModule_maximumElement(s) {\n const matchValue = SetTreeModule_maximumElementOpt(s);\n if (matchValue == null) {\n throw (new Error(\"Set contains no elements\"));\n }\n else {\n return value_1(matchValue);\n }\n}\n\nexport class SetTreeModule_SetIterator$1 extends Record {\n constructor(stack, started) {\n super();\n this.stack = stack;\n this.started = started;\n }\n}\n\nexport function SetTreeModule_SetIterator$1$reflection(gen0) {\n return record_type(\"Set.SetTreeModule.SetIterator`1\", [gen0], SetTreeModule_SetIterator$1, () => [[\"stack\", list_type(option_type(SetTreeLeaf$1$reflection(gen0)))], [\"started\", bool_type]]);\n}\n\nexport function SetTreeModule_collapseLHS(stack_mut) {\n SetTreeModule_collapseLHS:\n while (true) {\n const stack = stack_mut;\n if (!isEmpty_1(stack)) {\n const x = head(stack);\n const rest = tail(stack);\n if (x != null) {\n const x2 = x;\n if (x2 instanceof SetTreeNode$1) {\n stack_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x2), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x2)), SetTreeNode$1__get_Right(x2)], rest);\n continue SetTreeModule_collapseLHS;\n }\n else {\n return stack;\n }\n }\n else {\n stack_mut = rest;\n continue SetTreeModule_collapseLHS;\n }\n }\n else {\n return empty_1();\n }\n break;\n }\n}\n\nexport function SetTreeModule_mkIterator(s) {\n return new SetTreeModule_SetIterator$1(SetTreeModule_collapseLHS(singleton_1(s)), false);\n}\n\nexport function SetTreeModule_notStarted() {\n throw (new Error(\"Enumeration not started\"));\n}\n\nexport function SetTreeModule_alreadyFinished() {\n throw (new Error(\"Enumeration already started\"));\n}\n\nexport function SetTreeModule_current(i) {\n if (i.started) {\n const matchValue = i.stack;\n if (isEmpty_1(matchValue)) {\n return SetTreeModule_alreadyFinished();\n }\n else if (head(matchValue) != null) {\n const t = head(matchValue);\n return SetTreeLeaf$1__get_Key(t);\n }\n else {\n throw (new Error(\"Please report error: Set iterator, unexpected stack for current\"));\n }\n }\n else {\n return SetTreeModule_notStarted();\n }\n}\n\nexport function SetTreeModule_moveNext(i) {\n if (i.started) {\n const matchValue = i.stack;\n if (!isEmpty_1(matchValue)) {\n if (head(matchValue) != null) {\n const t = head(matchValue);\n if (t instanceof SetTreeNode$1) {\n throw (new Error(\"Please report error: Set iterator, unexpected stack for moveNext\"));\n }\n else {\n i.stack = SetTreeModule_collapseLHS(tail(matchValue));\n return !isEmpty_1(i.stack);\n }\n }\n else {\n throw (new Error(\"Please report error: Set iterator, unexpected stack for moveNext\"));\n }\n }\n else {\n return false;\n }\n }\n else {\n i.started = true;\n return !isEmpty_1(i.stack);\n }\n}\n\nexport function SetTreeModule_mkIEnumerator(s) {\n let i = SetTreeModule_mkIterator(s);\n return {\n [\"System.Collections.Generic.IEnumerator`1.get_Current\"]() {\n return SetTreeModule_current(i);\n },\n [\"System.Collections.IEnumerator.get_Current\"]() {\n return SetTreeModule_current(i);\n },\n [\"System.Collections.IEnumerator.MoveNext\"]() {\n return SetTreeModule_moveNext(i);\n },\n [\"System.Collections.IEnumerator.Reset\"]() {\n i = SetTreeModule_mkIterator(s);\n },\n Dispose() {\n },\n };\n}\n\nexport function SetTreeModule_compareStacks(comparer_mut, l1_mut, l2_mut) {\n SetTreeModule_compareStacks:\n while (true) {\n const comparer = comparer_mut, l1 = l1_mut, l2 = l2_mut;\n const matchValue = [l1, l2];\n if (!isEmpty_1(matchValue[0])) {\n if (!isEmpty_1(matchValue[1])) {\n if (head(matchValue[1]) != null) {\n if (head(matchValue[0]) != null) {\n const x1_3 = head(matchValue[0]);\n const x2_3 = head(matchValue[1]);\n if (x1_3 instanceof SetTreeNode$1) {\n if (SetTreeNode$1__get_Left(x1_3) == null) {\n if (x2_3 instanceof SetTreeNode$1) {\n if (SetTreeNode$1__get_Left(x2_3) == null) {\n const c = comparer.Compare(SetTreeLeaf$1__get_Key(x1_3), SetTreeLeaf$1__get_Key(x2_3)) | 0;\n if (c !== 0) {\n return c | 0;\n }\n else {\n comparer_mut = comparer;\n l1_mut = cons(SetTreeNode$1__get_Right(x1_3), tail(matchValue[0]));\n l2_mut = cons(SetTreeNode$1__get_Right(x2_3), tail(matchValue[1]));\n continue SetTreeModule_compareStacks;\n }\n }\n else {\n const matchValue_3 = [l1, l2];\n let pattern_matching_result, t1_6, x1_4, t2_6, x2_4;\n if (!isEmpty_1(matchValue_3[0])) {\n if (head(matchValue_3[0]) != null) {\n pattern_matching_result = 0;\n t1_6 = tail(matchValue_3[0]);\n x1_4 = head(matchValue_3[0]);\n }\n else if (!isEmpty_1(matchValue_3[1])) {\n if (head(matchValue_3[1]) != null) {\n pattern_matching_result = 1;\n t2_6 = tail(matchValue_3[1]);\n x2_4 = head(matchValue_3[1]);\n }\n else {\n pattern_matching_result = 2;\n }\n }\n else {\n pattern_matching_result = 2;\n }\n }\n else if (!isEmpty_1(matchValue_3[1])) {\n if (head(matchValue_3[1]) != null) {\n pattern_matching_result = 1;\n t2_6 = tail(matchValue_3[1]);\n x2_4 = head(matchValue_3[1]);\n }\n else {\n pattern_matching_result = 2;\n }\n }\n else {\n pattern_matching_result = 2;\n }\n switch (pattern_matching_result) {\n case 0: {\n if (x1_4 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x1_4), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x1_4), SetTreeModule_empty(), SetTreeNode$1__get_Right(x1_4), 0)], t1_6);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x1_4))], t1_6);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n }\n case 1: {\n if (x2_4 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x2_4), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x2_4), SetTreeModule_empty(), SetTreeNode$1__get_Right(x2_4), 0)], t2_6);\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x2_4))], t2_6);\n continue SetTreeModule_compareStacks;\n }\n }\n case 2: {\n throw (new Error(\"unexpected state in SetTree.compareStacks\"));\n }\n }\n }\n }\n else {\n const c_1 = comparer.Compare(SetTreeLeaf$1__get_Key(x1_3), SetTreeLeaf$1__get_Key(x2_3)) | 0;\n if (c_1 !== 0) {\n return c_1 | 0;\n }\n else {\n comparer_mut = comparer;\n l1_mut = cons(SetTreeNode$1__get_Right(x1_3), tail(matchValue[0]));\n l2_mut = cons(SetTreeModule_empty(), tail(matchValue[1]));\n continue SetTreeModule_compareStacks;\n }\n }\n }\n else {\n const matchValue_4 = [l1, l2];\n let pattern_matching_result_1, t1_7, x1_5, t2_7, x2_5;\n if (!isEmpty_1(matchValue_4[0])) {\n if (head(matchValue_4[0]) != null) {\n pattern_matching_result_1 = 0;\n t1_7 = tail(matchValue_4[0]);\n x1_5 = head(matchValue_4[0]);\n }\n else if (!isEmpty_1(matchValue_4[1])) {\n if (head(matchValue_4[1]) != null) {\n pattern_matching_result_1 = 1;\n t2_7 = tail(matchValue_4[1]);\n x2_5 = head(matchValue_4[1]);\n }\n else {\n pattern_matching_result_1 = 2;\n }\n }\n else {\n pattern_matching_result_1 = 2;\n }\n }\n else if (!isEmpty_1(matchValue_4[1])) {\n if (head(matchValue_4[1]) != null) {\n pattern_matching_result_1 = 1;\n t2_7 = tail(matchValue_4[1]);\n x2_5 = head(matchValue_4[1]);\n }\n else {\n pattern_matching_result_1 = 2;\n }\n }\n else {\n pattern_matching_result_1 = 2;\n }\n switch (pattern_matching_result_1) {\n case 0: {\n if (x1_5 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x1_5), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x1_5), SetTreeModule_empty(), SetTreeNode$1__get_Right(x1_5), 0)], t1_7);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x1_5))], t1_7);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n }\n case 1: {\n if (x2_5 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x2_5), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x2_5), SetTreeModule_empty(), SetTreeNode$1__get_Right(x2_5), 0)], t2_7);\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x2_5))], t2_7);\n continue SetTreeModule_compareStacks;\n }\n }\n case 2: {\n throw (new Error(\"unexpected state in SetTree.compareStacks\"));\n }\n }\n }\n }\n else if (x2_3 instanceof SetTreeNode$1) {\n if (SetTreeNode$1__get_Left(x2_3) == null) {\n const c_2 = comparer.Compare(SetTreeLeaf$1__get_Key(x1_3), SetTreeLeaf$1__get_Key(x2_3)) | 0;\n if (c_2 !== 0) {\n return c_2 | 0;\n }\n else {\n comparer_mut = comparer;\n l1_mut = cons(SetTreeModule_empty(), tail(matchValue[0]));\n l2_mut = cons(SetTreeNode$1__get_Right(x2_3), tail(matchValue[1]));\n continue SetTreeModule_compareStacks;\n }\n }\n else {\n const matchValue_5 = [l1, l2];\n let pattern_matching_result_2, t1_8, x1_6, t2_8, x2_6;\n if (!isEmpty_1(matchValue_5[0])) {\n if (head(matchValue_5[0]) != null) {\n pattern_matching_result_2 = 0;\n t1_8 = tail(matchValue_5[0]);\n x1_6 = head(matchValue_5[0]);\n }\n else if (!isEmpty_1(matchValue_5[1])) {\n if (head(matchValue_5[1]) != null) {\n pattern_matching_result_2 = 1;\n t2_8 = tail(matchValue_5[1]);\n x2_6 = head(matchValue_5[1]);\n }\n else {\n pattern_matching_result_2 = 2;\n }\n }\n else {\n pattern_matching_result_2 = 2;\n }\n }\n else if (!isEmpty_1(matchValue_5[1])) {\n if (head(matchValue_5[1]) != null) {\n pattern_matching_result_2 = 1;\n t2_8 = tail(matchValue_5[1]);\n x2_6 = head(matchValue_5[1]);\n }\n else {\n pattern_matching_result_2 = 2;\n }\n }\n else {\n pattern_matching_result_2 = 2;\n }\n switch (pattern_matching_result_2) {\n case 0: {\n if (x1_6 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x1_6), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x1_6), SetTreeModule_empty(), SetTreeNode$1__get_Right(x1_6), 0)], t1_8);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x1_6))], t1_8);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n }\n case 1: {\n if (x2_6 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x2_6), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x2_6), SetTreeModule_empty(), SetTreeNode$1__get_Right(x2_6), 0)], t2_8);\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x2_6))], t2_8);\n continue SetTreeModule_compareStacks;\n }\n }\n case 2: {\n throw (new Error(\"unexpected state in SetTree.compareStacks\"));\n }\n }\n }\n }\n else {\n const c_3 = comparer.Compare(SetTreeLeaf$1__get_Key(x1_3), SetTreeLeaf$1__get_Key(x2_3)) | 0;\n if (c_3 !== 0) {\n return c_3 | 0;\n }\n else {\n comparer_mut = comparer;\n l1_mut = tail(matchValue[0]);\n l2_mut = tail(matchValue[1]);\n continue SetTreeModule_compareStacks;\n }\n }\n }\n else {\n const x2 = head(matchValue[1]);\n const matchValue_1 = [l1, l2];\n let pattern_matching_result_3, t1_2, x1, t2_2, x2_1;\n if (!isEmpty_1(matchValue_1[0])) {\n if (head(matchValue_1[0]) != null) {\n pattern_matching_result_3 = 0;\n t1_2 = tail(matchValue_1[0]);\n x1 = head(matchValue_1[0]);\n }\n else if (!isEmpty_1(matchValue_1[1])) {\n if (head(matchValue_1[1]) != null) {\n pattern_matching_result_3 = 1;\n t2_2 = tail(matchValue_1[1]);\n x2_1 = head(matchValue_1[1]);\n }\n else {\n pattern_matching_result_3 = 2;\n }\n }\n else {\n pattern_matching_result_3 = 2;\n }\n }\n else if (!isEmpty_1(matchValue_1[1])) {\n if (head(matchValue_1[1]) != null) {\n pattern_matching_result_3 = 1;\n t2_2 = tail(matchValue_1[1]);\n x2_1 = head(matchValue_1[1]);\n }\n else {\n pattern_matching_result_3 = 2;\n }\n }\n else {\n pattern_matching_result_3 = 2;\n }\n switch (pattern_matching_result_3) {\n case 0: {\n if (x1 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x1), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x1), SetTreeModule_empty(), SetTreeNode$1__get_Right(x1), 0)], t1_2);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x1))], t1_2);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n }\n case 1: {\n if (x2_1 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x2_1), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x2_1), SetTreeModule_empty(), SetTreeNode$1__get_Right(x2_1), 0)], t2_2);\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x2_1))], t2_2);\n continue SetTreeModule_compareStacks;\n }\n }\n case 2: {\n throw (new Error(\"unexpected state in SetTree.compareStacks\"));\n }\n }\n }\n }\n else if (head(matchValue[0]) != null) {\n const x1_1 = head(matchValue[0]);\n const matchValue_2 = [l1, l2];\n let pattern_matching_result_4, t1_4, x1_2, t2_4, x2_2;\n if (!isEmpty_1(matchValue_2[0])) {\n if (head(matchValue_2[0]) != null) {\n pattern_matching_result_4 = 0;\n t1_4 = tail(matchValue_2[0]);\n x1_2 = head(matchValue_2[0]);\n }\n else if (!isEmpty_1(matchValue_2[1])) {\n if (head(matchValue_2[1]) != null) {\n pattern_matching_result_4 = 1;\n t2_4 = tail(matchValue_2[1]);\n x2_2 = head(matchValue_2[1]);\n }\n else {\n pattern_matching_result_4 = 2;\n }\n }\n else {\n pattern_matching_result_4 = 2;\n }\n }\n else if (!isEmpty_1(matchValue_2[1])) {\n if (head(matchValue_2[1]) != null) {\n pattern_matching_result_4 = 1;\n t2_4 = tail(matchValue_2[1]);\n x2_2 = head(matchValue_2[1]);\n }\n else {\n pattern_matching_result_4 = 2;\n }\n }\n else {\n pattern_matching_result_4 = 2;\n }\n switch (pattern_matching_result_4) {\n case 0: {\n if (x1_2 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x1_2), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x1_2), SetTreeModule_empty(), SetTreeNode$1__get_Right(x1_2), 0)], t1_4);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x1_2))], t1_4);\n l2_mut = l2;\n continue SetTreeModule_compareStacks;\n }\n }\n case 1: {\n if (x2_2 instanceof SetTreeNode$1) {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeNode$1__get_Left(x2_2), SetTreeNode$1_$ctor_Z6E7BE5F7(SetTreeLeaf$1__get_Key(x2_2), SetTreeModule_empty(), SetTreeNode$1__get_Right(x2_2), 0)], t2_4);\n continue SetTreeModule_compareStacks;\n }\n else {\n comparer_mut = comparer;\n l1_mut = l1;\n l2_mut = ofArrayWithTail([SetTreeModule_empty(), SetTreeLeaf$1_$ctor_2B595(SetTreeLeaf$1__get_Key(x2_2))], t2_4);\n continue SetTreeModule_compareStacks;\n }\n }\n case 2: {\n throw (new Error(\"unexpected state in SetTree.compareStacks\"));\n }\n }\n }\n else {\n comparer_mut = comparer;\n l1_mut = tail(matchValue[0]);\n l2_mut = tail(matchValue[1]);\n continue SetTreeModule_compareStacks;\n }\n }\n else {\n return 1;\n }\n }\n else if (isEmpty_1(matchValue[1])) {\n return 0;\n }\n else {\n return -1;\n }\n break;\n }\n}\n\nexport function SetTreeModule_compare(comparer, t1, t2) {\n if (t1 == null) {\n if (t2 == null) {\n return 0;\n }\n else {\n return -1;\n }\n }\n else if (t2 == null) {\n return 1;\n }\n else {\n return SetTreeModule_compareStacks(comparer, singleton_1(t1), singleton_1(t2)) | 0;\n }\n}\n\nexport function SetTreeModule_choose(s) {\n return SetTreeModule_minimumElement(s);\n}\n\nexport function SetTreeModule_toList(t) {\n const loop = (t$0027_mut, acc_mut) => {\n loop:\n while (true) {\n const t$0027 = t$0027_mut, acc = acc_mut;\n if (t$0027 != null) {\n const t2 = t$0027;\n if (t2 instanceof SetTreeNode$1) {\n t$0027_mut = SetTreeNode$1__get_Left(t2);\n acc_mut = cons(SetTreeLeaf$1__get_Key(t2), loop(SetTreeNode$1__get_Right(t2), acc));\n continue loop;\n }\n else {\n return cons(SetTreeLeaf$1__get_Key(t2), acc);\n }\n }\n else {\n return acc;\n }\n break;\n }\n };\n return loop(t, empty_1());\n}\n\nexport function SetTreeModule_copyToArray(s, arr, i) {\n let j = i;\n SetTreeModule_iter((x) => {\n arr[j] = x;\n j = ((j + 1) | 0);\n }, s);\n}\n\nexport function SetTreeModule_toArray(s) {\n const n = SetTreeModule_count(s) | 0;\n const res = fill(new Array(n), 0, n, null);\n SetTreeModule_copyToArray(s, res, 0);\n return res;\n}\n\nexport function SetTreeModule_mkFromEnumerator(comparer_mut, acc_mut, e_mut) {\n SetTreeModule_mkFromEnumerator:\n while (true) {\n const comparer = comparer_mut, acc = acc_mut, e = e_mut;\n if (e[\"System.Collections.IEnumerator.MoveNext\"]()) {\n comparer_mut = comparer;\n acc_mut = SetTreeModule_add(comparer, e[\"System.Collections.Generic.IEnumerator`1.get_Current\"](), acc);\n e_mut = e;\n continue SetTreeModule_mkFromEnumerator;\n }\n else {\n return acc;\n }\n break;\n }\n}\n\nexport function SetTreeModule_ofArray(comparer, l) {\n return fold_1((acc, k) => SetTreeModule_add(comparer, k, acc), SetTreeModule_empty(), l);\n}\n\nexport function SetTreeModule_ofList(comparer, l) {\n return fold_2((acc, k) => SetTreeModule_add(comparer, k, acc), SetTreeModule_empty(), l);\n}\n\nexport function SetTreeModule_ofSeq(comparer, c) {\n if (isArrayLike(c)) {\n return SetTreeModule_ofArray(comparer, c);\n }\n else if (c instanceof FSharpList) {\n return SetTreeModule_ofList(comparer, c);\n }\n else {\n const ie = getEnumerator(c);\n try {\n return SetTreeModule_mkFromEnumerator(comparer, SetTreeModule_empty(), ie);\n }\n finally {\n disposeSafe(ie);\n }\n }\n}\n\nexport class FSharpSet {\n constructor(comparer, tree) {\n this.comparer = comparer;\n this.tree = tree;\n }\n GetHashCode() {\n const this$ = this;\n return FSharpSet__ComputeHashCode(this$) | 0;\n }\n Equals(that) {\n const this$ = this;\n return (that instanceof FSharpSet) && (SetTreeModule_compare(FSharpSet__get_Comparer(this$), FSharpSet__get_Tree(this$), FSharpSet__get_Tree(that)) === 0);\n }\n toString() {\n const this$ = this;\n return (\"set [\" + join(\"; \", map_1((x) => {\n let copyOfStruct = x;\n return toString(copyOfStruct);\n }, this$))) + \"]\";\n }\n get [Symbol.toStringTag]() {\n return \"FSharpSet\";\n }\n toJSON(_key) {\n const this$ = this;\n return Array.from(this$);\n }\n CompareTo(that) {\n const s = this;\n return SetTreeModule_compare(FSharpSet__get_Comparer(s), FSharpSet__get_Tree(s), FSharpSet__get_Tree(that)) | 0;\n }\n [\"System.Collections.Generic.ICollection`1.Add2B595\"](x) {\n throw (new Error(\"ReadOnlyCollection\"));\n }\n [\"System.Collections.Generic.ICollection`1.Clear\"]() {\n throw (new Error(\"ReadOnlyCollection\"));\n }\n [\"System.Collections.Generic.ICollection`1.Remove2B595\"](x) {\n throw (new Error(\"ReadOnlyCollection\"));\n }\n [\"System.Collections.Generic.ICollection`1.Contains2B595\"](x) {\n const s = this;\n return SetTreeModule_mem(FSharpSet__get_Comparer(s), x, FSharpSet__get_Tree(s));\n }\n [\"System.Collections.Generic.ICollection`1.CopyToZ2E171D71\"](arr, i) {\n const s = this;\n SetTreeModule_copyToArray(FSharpSet__get_Tree(s), arr, i);\n }\n [\"System.Collections.Generic.ICollection`1.get_IsReadOnly\"]() {\n return true;\n }\n [\"System.Collections.Generic.ICollection`1.get_Count\"]() {\n const s = this;\n return FSharpSet__get_Count(s) | 0;\n }\n [\"System.Collections.Generic.IReadOnlyCollection`1.get_Count\"]() {\n const s = this;\n return FSharpSet__get_Count(s) | 0;\n }\n GetEnumerator() {\n const s = this;\n return SetTreeModule_mkIEnumerator(FSharpSet__get_Tree(s));\n }\n [Symbol.iterator]() {\n return toIterator(this.GetEnumerator());\n }\n [\"System.Collections.IEnumerable.GetEnumerator\"]() {\n const s = this;\n return SetTreeModule_mkIEnumerator(FSharpSet__get_Tree(s));\n }\n get size() {\n const s = this;\n return FSharpSet__get_Count(s) | 0;\n }\n add(k) {\n const s = this;\n throw (new Error(\"Set cannot be mutated\"));\n return s;\n }\n clear() {\n throw (new Error(\"Set cannot be mutated\"));\n }\n delete(k) {\n throw (new Error(\"Set cannot be mutated\"));\n return false;\n }\n has(k) {\n const s = this;\n return FSharpSet__Contains(s, k);\n }\n keys() {\n const s = this;\n return map_1((x) => x, s);\n }\n values() {\n const s = this;\n return map_1((x) => x, s);\n }\n entries() {\n const s = this;\n return map_1((v) => [v, v], s);\n }\n forEach(f, thisArg) {\n const s = this;\n iterate_1((x) => {\n f(x, x, s);\n }, s);\n }\n}\n\nexport function FSharpSet$reflection(gen0) {\n return class_type(\"Set.FSharpSet\", [gen0], FSharpSet);\n}\n\nexport function FSharpSet_$ctor(comparer, tree) {\n return new FSharpSet(comparer, tree);\n}\n\nexport function FSharpSet__get_Comparer(set$) {\n return set$.comparer;\n}\n\nexport function FSharpSet__get_Tree(set$) {\n return set$.tree;\n}\n\nexport function FSharpSet_Empty(comparer) {\n return FSharpSet_$ctor(comparer, SetTreeModule_empty());\n}\n\nexport function FSharpSet__Add(s, value) {\n return FSharpSet_$ctor(FSharpSet__get_Comparer(s), SetTreeModule_add(FSharpSet__get_Comparer(s), value, FSharpSet__get_Tree(s)));\n}\n\nexport function FSharpSet__Remove(s, value) {\n return FSharpSet_$ctor(FSharpSet__get_Comparer(s), SetTreeModule_remove(FSharpSet__get_Comparer(s), value, FSharpSet__get_Tree(s)));\n}\n\nexport function FSharpSet__get_Count(s) {\n return SetTreeModule_count(FSharpSet__get_Tree(s));\n}\n\nexport function FSharpSet__Contains(s, value) {\n return SetTreeModule_mem(FSharpSet__get_Comparer(s), value, FSharpSet__get_Tree(s));\n}\n\nexport function FSharpSet__Iterate(s, x) {\n SetTreeModule_iter(x, FSharpSet__get_Tree(s));\n}\n\nexport function FSharpSet__Fold(s, f, z) {\n const f_1 = f;\n return SetTreeModule_fold((x, z_1) => f_1(z_1, x), z, FSharpSet__get_Tree(s));\n}\n\nexport function FSharpSet__get_IsEmpty(s) {\n return FSharpSet__get_Tree(s) == null;\n}\n\nexport function FSharpSet__Partition(s, f) {\n if (FSharpSet__get_Tree(s) == null) {\n return [s, s];\n }\n else {\n const patternInput = SetTreeModule_partition(FSharpSet__get_Comparer(s), f, FSharpSet__get_Tree(s));\n return [FSharpSet_$ctor(FSharpSet__get_Comparer(s), patternInput[0]), FSharpSet_$ctor(FSharpSet__get_Comparer(s), patternInput[1])];\n }\n}\n\nexport function FSharpSet__Filter(s, f) {\n if (FSharpSet__get_Tree(s) == null) {\n return s;\n }\n else {\n return FSharpSet_$ctor(FSharpSet__get_Comparer(s), SetTreeModule_filter(FSharpSet__get_Comparer(s), f, FSharpSet__get_Tree(s)));\n }\n}\n\nexport function FSharpSet__Map(s, f, comparer) {\n return FSharpSet_$ctor(comparer, SetTreeModule_fold((acc, k) => SetTreeModule_add(comparer, f(k), acc), SetTreeModule_empty(), FSharpSet__get_Tree(s)));\n}\n\nexport function FSharpSet__Exists(s, f) {\n return SetTreeModule_exists(f, FSharpSet__get_Tree(s));\n}\n\nexport function FSharpSet__ForAll(s, f) {\n return SetTreeModule_forall(f, FSharpSet__get_Tree(s));\n}\n\nexport function FSharpSet_op_Subtraction(set1, set2) {\n if (FSharpSet__get_Tree(set1) == null) {\n return set1;\n }\n else if (FSharpSet__get_Tree(set2) == null) {\n return set1;\n }\n else {\n return FSharpSet_$ctor(FSharpSet__get_Comparer(set1), SetTreeModule_diff(FSharpSet__get_Comparer(set1), FSharpSet__get_Tree(set1), FSharpSet__get_Tree(set2)));\n }\n}\n\nexport function FSharpSet_op_Addition(set1, set2) {\n if (FSharpSet__get_Tree(set2) == null) {\n return set1;\n }\n else if (FSharpSet__get_Tree(set1) == null) {\n return set2;\n }\n else {\n return FSharpSet_$ctor(FSharpSet__get_Comparer(set1), SetTreeModule_union(FSharpSet__get_Comparer(set1), FSharpSet__get_Tree(set1), FSharpSet__get_Tree(set2)));\n }\n}\n\nexport function FSharpSet_Intersection(a, b) {\n if (FSharpSet__get_Tree(b) == null) {\n return b;\n }\n else if (FSharpSet__get_Tree(a) == null) {\n return a;\n }\n else {\n return FSharpSet_$ctor(FSharpSet__get_Comparer(a), SetTreeModule_intersection(FSharpSet__get_Comparer(a), FSharpSet__get_Tree(a), FSharpSet__get_Tree(b)));\n }\n}\n\nexport function FSharpSet_IntersectionMany(sets) {\n return reduce(FSharpSet_Intersection, sets);\n}\n\nexport function FSharpSet_Equality(a, b) {\n return SetTreeModule_compare(FSharpSet__get_Comparer(a), FSharpSet__get_Tree(a), FSharpSet__get_Tree(b)) === 0;\n}\n\nexport function FSharpSet_Compare(a, b) {\n return SetTreeModule_compare(FSharpSet__get_Comparer(a), FSharpSet__get_Tree(a), FSharpSet__get_Tree(b));\n}\n\nexport function FSharpSet__get_Choose(x) {\n return SetTreeModule_choose(FSharpSet__get_Tree(x));\n}\n\nexport function FSharpSet__get_MinimumElement(x) {\n return SetTreeModule_minimumElement(FSharpSet__get_Tree(x));\n}\n\nexport function FSharpSet__get_MaximumElement(x) {\n return SetTreeModule_maximumElement(FSharpSet__get_Tree(x));\n}\n\nexport function FSharpSet__IsSubsetOf(x, otherSet) {\n return SetTreeModule_subset(FSharpSet__get_Comparer(x), FSharpSet__get_Tree(x), FSharpSet__get_Tree(otherSet));\n}\n\nexport function FSharpSet__IsSupersetOf(x, otherSet) {\n return SetTreeModule_subset(FSharpSet__get_Comparer(x), FSharpSet__get_Tree(otherSet), FSharpSet__get_Tree(x));\n}\n\nexport function FSharpSet__IsProperSubsetOf(x, otherSet) {\n return SetTreeModule_properSubset(FSharpSet__get_Comparer(x), FSharpSet__get_Tree(x), FSharpSet__get_Tree(otherSet));\n}\n\nexport function FSharpSet__IsProperSupersetOf(x, otherSet) {\n return SetTreeModule_properSubset(FSharpSet__get_Comparer(x), FSharpSet__get_Tree(otherSet), FSharpSet__get_Tree(x));\n}\n\nexport function FSharpSet__ToList(x) {\n return SetTreeModule_toList(FSharpSet__get_Tree(x));\n}\n\nexport function FSharpSet__ToArray(x) {\n return SetTreeModule_toArray(FSharpSet__get_Tree(x));\n}\n\nexport function FSharpSet__ComputeHashCode(this$) {\n let y;\n let res = 0;\n const enumerator = getEnumerator(this$);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const x_1 = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n res = (((y = (structuralHash(x_1) | 0), ((res << 1) + y) + 631)) | 0);\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n return Math.abs(res) | 0;\n}\n\nexport function isEmpty(set$) {\n return FSharpSet__get_IsEmpty(set$);\n}\n\nexport function contains(element, set$) {\n return FSharpSet__Contains(set$, element);\n}\n\nexport function add(value, set$) {\n return FSharpSet__Add(set$, value);\n}\n\nexport function singleton(value, comparer) {\n return FSharpSet__Add(FSharpSet_Empty(comparer), value);\n}\n\nexport function remove(value, set$) {\n return FSharpSet__Remove(set$, value);\n}\n\nexport function union(set1, set2) {\n return FSharpSet_op_Addition(set1, set2);\n}\n\nexport function unionMany(sets, comparer) {\n return fold_3(FSharpSet_op_Addition, FSharpSet_Empty(comparer), sets);\n}\n\nexport function intersect(set1, set2) {\n return FSharpSet_Intersection(set1, set2);\n}\n\nexport function intersectMany(sets) {\n return FSharpSet_IntersectionMany(sets);\n}\n\nexport function iterate(action, set$) {\n FSharpSet__Iterate(set$, action);\n}\n\nexport function empty(comparer) {\n return FSharpSet_Empty(comparer);\n}\n\nexport function forAll(predicate, set$) {\n return FSharpSet__ForAll(set$, predicate);\n}\n\nexport function exists(predicate, set$) {\n return FSharpSet__Exists(set$, predicate);\n}\n\nexport function filter(predicate, set$) {\n return FSharpSet__Filter(set$, predicate);\n}\n\nexport function partition(predicate, set$) {\n return FSharpSet__Partition(set$, predicate);\n}\n\nexport function fold(folder, state, set$) {\n return SetTreeModule_fold(folder, state, FSharpSet__get_Tree(set$));\n}\n\nexport function foldBack(folder, set$, state) {\n return SetTreeModule_foldBack(folder, FSharpSet__get_Tree(set$), state);\n}\n\nexport function map(mapping, set$, comparer) {\n return FSharpSet__Map(set$, mapping, comparer);\n}\n\nexport function count(set$) {\n return FSharpSet__get_Count(set$);\n}\n\nexport function ofList(elements, comparer) {\n return FSharpSet_$ctor(comparer, SetTreeModule_ofSeq(comparer, elements));\n}\n\nexport function ofArray(array, comparer) {\n return FSharpSet_$ctor(comparer, SetTreeModule_ofArray(comparer, array));\n}\n\nexport function toList(set$) {\n return FSharpSet__ToList(set$);\n}\n\nexport function toArray(set$) {\n return FSharpSet__ToArray(set$);\n}\n\nexport function toSeq(set$) {\n return map_1((x) => x, set$);\n}\n\nexport function ofSeq(elements, comparer) {\n return FSharpSet_$ctor(comparer, SetTreeModule_ofSeq(comparer, elements));\n}\n\nexport function difference(set1, set2) {\n return FSharpSet_op_Subtraction(set1, set2);\n}\n\nexport function isSubset(set1, set2) {\n return SetTreeModule_subset(FSharpSet__get_Comparer(set1), FSharpSet__get_Tree(set1), FSharpSet__get_Tree(set2));\n}\n\nexport function isSuperset(set1, set2) {\n return SetTreeModule_subset(FSharpSet__get_Comparer(set1), FSharpSet__get_Tree(set2), FSharpSet__get_Tree(set1));\n}\n\nexport function isProperSubset(set1, set2) {\n return SetTreeModule_properSubset(FSharpSet__get_Comparer(set1), FSharpSet__get_Tree(set1), FSharpSet__get_Tree(set2));\n}\n\nexport function isProperSuperset(set1, set2) {\n return SetTreeModule_properSubset(FSharpSet__get_Comparer(set1), FSharpSet__get_Tree(set2), FSharpSet__get_Tree(set1));\n}\n\nexport function minElement(set$) {\n return FSharpSet__get_MinimumElement(set$);\n}\n\nexport function maxElement(set$) {\n return FSharpSet__get_MaximumElement(set$);\n}\n\nexport function unionWith(s1, s2) {\n return fold_3((acc, x) => acc.add(x), s1, s2);\n}\n\nexport function newMutableSetWith(s1, s2) {\n if (s1 instanceof HashSet) {\n return HashSet_$ctor_Z6150332D(s2, HashSet__get_Comparer(s1));\n }\n else {\n return new Set(s2);\n }\n}\n\nexport function intersectWith(s1, s2) {\n const s2_1 = newMutableSetWith(s1, s2);\n iterate_1((x) => {\n if (!s2_1.has(x)) {\n s1.delete(x);\n }\n }, s1.values());\n}\n\nexport function exceptWith(s1, s2) {\n iterate_1((x) => {\n s1.delete(x);\n }, s2);\n}\n\nexport function isSubsetOf(s1, s2) {\n const s2_1 = newMutableSetWith(s1, s2);\n return forAll_1((arg) => s2_1.has(arg), s1.values());\n}\n\nexport function isSupersetOf(s1, s2) {\n return forAll_1((arg) => s1.has(arg), s2);\n}\n\nexport function isProperSubsetOf(s1, s2) {\n const s2_1 = newMutableSetWith(s1, s2);\n if (s2_1.size > s1.size) {\n return forAll_1((arg) => s2_1.has(arg), s1.values());\n }\n else {\n return false;\n }\n}\n\nexport function isProperSupersetOf(s1, s2) {\n const s2_1 = cache(s2);\n if (exists_1((arg_1) => (!s1.has(arg_1)), s2_1)) {\n return forAll_1((arg_2) => s1.has(arg_2), s2_1);\n }\n else {\n return false;\n }\n}\n\n","import { disposeSafe, toIterator, getEnumerator } from \"./Util.js\";\nimport { iterate, map, iterateIndexed, concat } from \"./Seq.js\";\nimport { FSharpRef } from \"./Types.js\";\nimport { class_type } from \"./Reflection.js\";\nimport { getItemFromDict, tryGetValue } from \"./MapUtil.js\";\nimport { some } from \"./Option.js\";\n\nexport class HashSet {\n constructor(items, comparer) {\n const this$ = new FSharpRef(null);\n this.comparer = comparer;\n this$.contents = this;\n this.hashMap = (new Map([]));\n this[\"init@8-2\"] = 1;\n const enumerator = getEnumerator(items);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const item = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n HashSet__Add_2B595(this$.contents, item);\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n }\n get [Symbol.toStringTag]() {\n return \"HashSet\";\n }\n toJSON(_key) {\n const this$ = this;\n return Array.from(this$);\n }\n [\"System.Collections.IEnumerable.GetEnumerator\"]() {\n const this$ = this;\n return getEnumerator(this$);\n }\n GetEnumerator() {\n const this$ = this;\n return getEnumerator(concat(this$.hashMap.values()));\n }\n [Symbol.iterator]() {\n return toIterator(this.GetEnumerator());\n }\n [\"System.Collections.Generic.ICollection`1.Add2B595\"](item) {\n const this$ = this;\n HashSet__Add_2B595(this$, item);\n }\n [\"System.Collections.Generic.ICollection`1.Clear\"]() {\n const this$ = this;\n HashSet__Clear(this$);\n }\n [\"System.Collections.Generic.ICollection`1.Contains2B595\"](item) {\n const this$ = this;\n return HashSet__Contains_2B595(this$, item);\n }\n [\"System.Collections.Generic.ICollection`1.CopyToZ2E171D71\"](array, arrayIndex) {\n const this$ = this;\n iterateIndexed((i, e) => {\n array[arrayIndex + i] = e;\n }, this$);\n }\n [\"System.Collections.Generic.ICollection`1.get_Count\"]() {\n const this$ = this;\n return HashSet__get_Count(this$) | 0;\n }\n [\"System.Collections.Generic.ICollection`1.get_IsReadOnly\"]() {\n return false;\n }\n [\"System.Collections.Generic.ICollection`1.Remove2B595\"](item) {\n const this$ = this;\n return HashSet__Remove_2B595(this$, item);\n }\n get size() {\n const this$ = this;\n return HashSet__get_Count(this$) | 0;\n }\n add(k) {\n const this$ = this;\n HashSet__Add_2B595(this$, k);\n return this$;\n }\n clear() {\n const this$ = this;\n HashSet__Clear(this$);\n }\n delete(k) {\n const this$ = this;\n return HashSet__Remove_2B595(this$, k);\n }\n has(k) {\n const this$ = this;\n return HashSet__Contains_2B595(this$, k);\n }\n keys() {\n const this$ = this;\n return map((x) => x, this$);\n }\n values() {\n const this$ = this;\n return map((x) => x, this$);\n }\n entries() {\n const this$ = this;\n return map((v) => [v, v], this$);\n }\n forEach(f, thisArg) {\n const this$ = this;\n iterate((x) => {\n f(x, x, this$);\n }, this$);\n }\n}\n\nexport function HashSet$reflection(gen0) {\n return class_type(\"Fable.Collections.HashSet\", [gen0], HashSet);\n}\n\nexport function HashSet_$ctor_Z6150332D(items, comparer) {\n return new HashSet(items, comparer);\n}\n\nfunction HashSet__TryFindIndex_2B595(this$, k) {\n const h = this$.comparer.GetHashCode(k) | 0;\n let matchValue;\n let outArg = null;\n matchValue = [tryGetValue(this$.hashMap, h, new FSharpRef(() => outArg, (v) => {\n outArg = v;\n })), outArg];\n if (matchValue[0]) {\n return [true, h, matchValue[1].findIndex((v_1) => this$.comparer.Equals(k, v_1))];\n }\n else {\n return [false, h, -1];\n }\n}\n\nfunction HashSet__TryFind_2B595(this$, k) {\n const matchValue = HashSet__TryFindIndex_2B595(this$, k);\n let pattern_matching_result;\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 1;\n }\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n return some(getItemFromDict(this$.hashMap, matchValue[1])[matchValue[2]]);\n }\n case 1: {\n return void 0;\n }\n }\n}\n\nexport function HashSet__get_Comparer(this$) {\n return this$.comparer;\n}\n\nexport function HashSet__Clear(this$) {\n this$.hashMap.clear();\n}\n\nexport function HashSet__get_Count(this$) {\n let count = 0;\n let enumerator = getEnumerator(this$.hashMap.values());\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const items = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n count = ((count + items.length) | 0);\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n return count | 0;\n}\n\nexport function HashSet__Add_2B595(this$, k) {\n const matchValue = HashSet__TryFindIndex_2B595(this$, k);\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n return false;\n }\n else {\n const value = void (getItemFromDict(this$.hashMap, matchValue[1]).push(k));\n return true;\n }\n }\n else {\n this$.hashMap.set(matchValue[1], [k]);\n return true;\n }\n}\n\nexport function HashSet__Contains_2B595(this$, k) {\n const matchValue = HashSet__TryFindIndex_2B595(this$, k);\n let pattern_matching_result;\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 1;\n }\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n return true;\n }\n case 1: {\n return false;\n }\n }\n}\n\nexport function HashSet__Remove_2B595(this$, k) {\n const matchValue = HashSet__TryFindIndex_2B595(this$, k);\n let pattern_matching_result;\n if (matchValue[0]) {\n if (matchValue[2] > -1) {\n pattern_matching_result = 0;\n }\n else {\n pattern_matching_result = 1;\n }\n }\n else {\n pattern_matching_result = 1;\n }\n switch (pattern_matching_result) {\n case 0: {\n getItemFromDict(this$.hashMap, matchValue[1]).splice(matchValue[2], 1);\n return true;\n }\n case 1: {\n return false;\n }\n }\n}\n\n","// tslint:disable:max-line-length\nimport { fromNumber as Long_fromNumber, op_Division as Long_op_Division, op_Multiply as Long_op_Multiply, toNumber as Long_toNumber } from \"./Long.js\";\nimport { comparePrimitives, padLeftAndRightWithZeros, padWithZeros } from \"./Util.js\";\n// TimeSpan in runtime just becomes a number representing milliseconds\n/**\n * Calls:\n * - `Math.ceil` if the `value` is **negative**\n * - `Math.floor` if the `value` is **positive**\n * @param value Value to round\n */\nfunction signedRound(value) {\n return value < 0 ? Math.ceil(value) : Math.floor(value);\n}\nexport function create(d = 0, h = 0, m = 0, s = 0, ms = 0) {\n switch (arguments.length) {\n case 1:\n // ticks\n return fromTicks(arguments[0]);\n case 3:\n // h,m,s\n d = 0, h = arguments[0], m = arguments[1], s = arguments[2], ms = 0;\n break;\n default:\n // d,h,m,s,ms\n break;\n }\n return d * 86400000 + h * 3600000 + m * 60000 + s * 1000 + ms;\n}\nexport function fromTicks(ticks) {\n return Long_toNumber(Long_op_Division(ticks, 10000));\n}\nexport function fromDays(d) {\n return create(d, 0, 0, 0);\n}\nexport function fromHours(h) {\n return create(h, 0, 0);\n}\nexport function fromMinutes(m) {\n return create(0, m, 0);\n}\nexport function fromSeconds(s) {\n return create(0, 0, s);\n}\nexport function days(ts) {\n return signedRound(ts / 86400000);\n}\nexport function hours(ts) {\n return signedRound(ts % 86400000 / 3600000);\n}\nexport function minutes(ts) {\n return signedRound(ts % 3600000 / 60000);\n}\nexport function seconds(ts) {\n return signedRound(ts % 60000 / 1000);\n}\nexport function milliseconds(ts) {\n return signedRound(ts % 1000);\n}\nexport function ticks(ts) {\n return Long_op_Multiply(Long_fromNumber(ts), 10000);\n}\nexport function totalDays(ts) {\n return ts / 86400000;\n}\nexport function totalHours(ts) {\n return ts / 3600000;\n}\nexport function totalMinutes(ts) {\n return ts / 60000;\n}\nexport function totalSeconds(ts) {\n return ts / 1000;\n}\nexport function negate(ts) {\n return ts * -1;\n}\nexport function add(ts1, ts2) {\n return ts1 + ts2;\n}\nexport function subtract(ts1, ts2) {\n return ts1 - ts2;\n}\nexport function multiply(ts, factor) {\n return ts * factor;\n}\nexport function divide(ts, b) {\n return ts / b;\n}\nexport const op_Addition = add;\nexport const op_Subtraction = subtract;\nexport const op_Multiply = multiply;\nexport const op_Division = divide;\nexport const compare = comparePrimitives;\nexport const compareTo = comparePrimitives;\nexport function duration(x) {\n return Math.abs(x);\n}\nexport function toString(ts, format = \"c\", _provider) {\n if ([\"c\", \"g\", \"G\"].indexOf(format) === -1) {\n throw new Error(\"Custom formats are not supported\");\n }\n const d = Math.abs(days(ts));\n const h = Math.abs(hours(ts));\n const m = Math.abs(minutes(ts));\n const s = Math.abs(seconds(ts));\n const ms = Math.abs(milliseconds(ts));\n const sign = ts < 0 ? \"-\" : \"\";\n return `${sign}${d === 0 && (format === \"c\" || format === \"g\") ? \"\" : format === \"c\" ? d + \".\" : d + \":\"}${format === \"g\" ? h : padWithZeros(h, 2)}:${padWithZeros(m, 2)}:${padWithZeros(s, 2)}${ms === 0 && (format === \"c\" || format === \"g\") ? \"\" : format === \"g\" ? \".\" + padWithZeros(ms, 3) : \".\" + padLeftAndRightWithZeros(ms, 3, 7)}`;\n}\nexport function parse(str) {\n const firstDot = str.search(\"\\\\.\");\n const firstColon = str.search(\"\\\\:\");\n if (firstDot === -1 && firstColon === -1) { // There is only a day ex: 4\n const d = parseInt(str, 0);\n if (isNaN(d)) {\n throw new Error(`String '${str}' was not recognized as a valid TimeSpan.`);\n }\n else {\n return create(d, 0, 0, 0, 0);\n }\n }\n if (firstColon > 0) { // process time part\n // WIP: (-?)(((\\d+)\\.)?([0-9]|0[0-9]|1[0-9]|2[0-3]):(\\d+)(:\\d+(\\.\\d{1,7})?)?|\\d+(?:(?!\\.)))\n const r = /^(-?)((\\d+)\\.)?(?:0*)([0-9]|0[0-9]|1[0-9]|2[0-3]):(?:0*)([0-5][0-9]|[0-9])(:(?:0*)([0-5][0-9]|[0-9]))?\\.?(\\d+)?$/.exec(str);\n if (r != null && r[4] != null && r[5] != null) {\n let d = 0;\n let ms = 0;\n let s = 0;\n const sign = r[1] != null && r[1] === \"-\" ? -1 : 1;\n const h = +r[4];\n const m = +r[5];\n if (r[3] != null) {\n d = +r[3];\n }\n if (r[7] != null) {\n s = +r[7];\n }\n if (r[8] != null) {\n // Depending on the number of decimals passed, we need to adapt the numbers\n switch (r[8].length) {\n case 1:\n ms = +r[8] * 100;\n break;\n case 2:\n ms = +r[8] * 10;\n break;\n case 3:\n ms = +r[8];\n break;\n case 4:\n ms = +r[8] / 10;\n break;\n case 5:\n ms = +r[8] / 100;\n break;\n case 6:\n ms = +r[8] / 1000;\n break;\n case 7:\n ms = +r[8] / 10000;\n break;\n default:\n throw new Error(`String '${str}' was not recognized as a valid TimeSpan.`);\n }\n }\n return sign * create(d, h, m, s, ms);\n }\n }\n throw new Error(`String '${str}' was not recognized as a valid TimeSpan.`);\n}\nexport function tryParse(v, defValue) {\n try {\n defValue.contents = parse(v);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\n","export default function isBrowser() {\n return typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n}","namespace Fable.SimpleJson\n\nopen System\nopen Fable.Core\nopen FSharp.Reflection\nopen System.Numerics\nopen System.Collections\nopen System.Collections.Generic\nopen Fable.Core.JsInterop\n\nmodule Node =\n\n /// Converts Base64 string into a byte array in Node environment\n []\n let bytesFromBase64 (value: string) : byte array = jsNative\n\nmodule Convert =\n let internal isBrowser () : bool = importDefault \"./isBrowser.js\"\n\n let insideBrowser = isBrowser()\n\n []\n let private isUndefined (value: obj) : bool = jsNative\n let private isDefined (value: obj) : bool = not (isUndefined value)\n\n /// Uses internal representation of F# maps to determine whether we are using Fable 3 or not\n let usingFable3() =\n #if FABLE_COMPILER_3\n true\n #else\n let map = JS.JSON.parse(JS.JSON.stringify (Map.ofList [ 1, 1; 2, 2 ]))\n let tree = get \"tree\" map\n isDefined tree && isDefined (get \"k\" tree) && isDefined (get \"v\" tree) && isDefined (get \"h\" tree)\n #endif\n\n let isUsingFable3 = usingFable3()\n\n []\n let internal insideWorker : bool = jsNative\n\n []\n let internal setProp o k v = jsNative\n\n type InternalMap =\n | MapEmpty\n | MapOne of string * Json\n | MapNode of string * Json * InternalMap * InternalMap\n\n let rec flattenMap = function\n | MapEmpty -> [ ]\n | MapOne (key, value) -> [ key, value ]\n | MapNode (key, value, left, right) ->\n [ yield! flattenMap left\n yield! flattenMap right\n yield (key, value) ]\n\n let (|KeyValue|_|) key (map: Map) =\n map\n |> Map.tryFind key\n |> Option.map (fun value -> key, value, Map.remove key map)\n\n let (|NonArray|_|) = function\n | JArray _ -> None\n | json -> Some json\n\n let (|MapEmpty|_|) json =\n match json with\n | JString \"MapEmpty\" -> Some json\n | _ -> None\n\n let (|MapKey|_|) = function\n | JNumber number -> Some (string number)\n | JString key -> Some key\n | _ -> None\n\n let (|MapOne|_|) = function\n | JArray [ JString \"MapOne\"; MapKey key; value ] -> Some (key, value)\n | _ -> None\n\n let (|MapNode|_|) = function\n | JArray [ JString \"MapNode\"; MapKey key; value; left; right; JNumber _ ] ->\n Some (key, value, left, right)\n | _ -> None\n\n let rec generateMap json =\n match json with\n | MapEmpty _ -> Some InternalMap.MapEmpty\n | MapOne (key, value) -> Some (InternalMap.MapOne (key, value))\n | MapNode (key, value, left, right) ->\n match generateMap left, generateMap right with\n | Some leftMap, Some rightMap ->\n Some (InternalMap.MapNode(key, value, leftMap, rightMap))\n | _ -> None\n | _ -> None\n\n let rec flatteFable3Map (tree: Map) =\n [\n match Map.tryFind \"k\" tree, Map.tryFind \"v\" tree with\n | Some (JString key), Some value -> (key, value)\n | _ -> ()\n\n match Map.tryFind \"left\" tree with\n | Some (JObject left) -> yield! flatteFable3Map left\n | _ -> ()\n\n match Map.tryFind \"right\" tree with\n | Some (JObject right) -> yield! flatteFable3Map right\n | _ -> ()\n ]\n\n let rec flattenFable3Lists (linkedList: Map) =\n [\n match Map.tryFind \"head\" linkedList with\n | Some value -> value\n | None -> ()\n\n match Map.tryFind \"tail\" linkedList with\n | Some (JObject tail) -> yield! flattenFable3Lists tail\n | _ -> ()\n ]\n\n /// Returns whether the type information resembles a type of a sequence of elements (including tuples)\n let arrayLike = function\n | TypeInfo.Array _ -> true\n | TypeInfo.List _ -> true\n | TypeInfo.Seq _ -> true\n | TypeInfo.Tuple _ -> true\n | TypeInfo.Set _ -> true\n | TypeInfo.ResizeArray _ -> true\n | TypeInfo.HashSet _ -> true\n | _ -> false\n\n let isRecord = function\n | TypeInfo.Record recordType -> true\n | _ -> false\n\n let unionOfRecords = function\n | TypeInfo.Union getCases ->\n let (unionCases, unionType) = getCases()\n unionCases\n |> Seq.forall (fun case -> case.CaseTypes.Length = 1 && isRecord case.CaseTypes.[0])\n | _ ->\n false\n\n let optional = function\n | TypeInfo.Option _ -> true\n | _ -> false\n\n let isQuoted (input: string) =\n input.StartsWith \"\\\"\" && input.EndsWith \"\\\"\"\n\n let betweenQuotes (input: string) = \"\\\"\" + input + \"\\\"\"\n\n let removeQuotes (input: string) =\n input.Substring(1, input.Length - 2)\n\n let rec fromJsonAs (input: Json) (typeInfo: Fable.SimpleJson.TypeInfo) : obj =\n match input, typeInfo with\n | JNumber value, TypeInfo.Float -> unbox value\n | JString value, TypeInfo.Float when value.ToLower() = \"nan\" -> unbox (Double.NaN)\n | JString value, TypeInfo.Float -> unbox (float value)\n | JNumber value, TypeInfo.Float32 -> unbox (float32 value)\n | JString value, TypeInfo.Float32 when value.ToLower() = \"nan\" -> unbox (Double.NaN)\n | JString value, TypeInfo.Float32 -> unbox (float32 value)\n // reading number as int -> floor it\n | JNumber value, TypeInfo.Int32 -> unbox (JS.Math.floor(value))\n | JBool value, TypeInfo.Bool -> unbox value\n // reading int from string -> parse it\n | JString value, TypeInfo.Int32 -> unbox (int value)\n | JString value, TypeInfo.Char -> unbox (char value)\n | JNumber value, TypeInfo.Char -> unbox (char (unbox value))\n // reading into strings\n | JString value, TypeInfo.String -> unbox value\n | JNumber value, TypeInfo.String -> unbox (string value)\n // uri\n | JString value, TypeInfo.Uri -> unbox(Uri(value))\n // decimals\n | JString value, TypeInfo.Decimal -> unbox (decimal value)\n | JNumber value, TypeInfo.Decimal -> unbox (decimal value)\n | JString value, TypeInfo.Short -> unbox (int16 value)\n | JNumber value, TypeInfo.Short -> unbox (int16 value)\n // Unsigned integers\n | JNumber value, TypeInfo.UInt16 -> unbox (uint16 value)\n | JString value, TypeInfo.UInt16 -> unbox (uint16 value)\n | JNumber value, TypeInfo.UInt32 -> unbox (uint32 value)\n | JString value, TypeInfo.UInt32 -> unbox (uint32 value)\n | JNumber value, TypeInfo.UInt64 -> unbox (uint64 value)\n | JString value, TypeInfo.UInt64 -> unbox (uint64 value)\n | JNumber value, TypeInfo.TimeSpan -> unbox (JS.Math.floor value)\n | JString value, TypeInfo.Enum getlElemType ->\n let (underlyingType, originalType) = getlElemType()\n match underlyingType with\n | TypeInfo.Int32 ->\n match Int32.TryParse(value) with\n | true, parsedNumber ->\n unbox parsedNumber\n | false, _ ->\n failwithf \"The value '%s' is not valid for enum of type '%s'\" value originalType.Name\n | TypeInfo.Long ->\n match Int64.TryParse(value) with\n | true, parsedNumber ->\n unbox parsedNumber\n | false, _ ->\n failwithf \"The value '%s' is not valid for enum of type '%s'\" value originalType.Name\n | other ->\n failwithf \"The value '%s' cannot be converted to enum of type '%s'\" value originalType.Name\n | JNumber value, TypeInfo.Enum getElemType ->\n let (_, originalType) = getElemType()\n unbox value\n // byte[] coming from the server is serialized as base64 string\n // convert it back to the actual byte array\n | JString value, TypeInfo.Array getElemType ->\n let elemType = getElemType()\n match elemType with\n | TypeInfo.Byte ->\n if insideWorker || insideBrowser\n then unbox (Convert.FromBase64String value)\n else unbox (Node.bytesFromBase64 value)\n | otherType -> failwithf \"Cannot convert arbitrary string '%s' to %A\" value otherType\n\n // null values for strings are just the null string\n | JNull, TypeInfo.String -> unbox null\n | JNull, TypeInfo.Unit -> unbox ()\n | genericJson, TypeInfo.Object -> unbox (SimpleJson.toPlainObject genericJson)\n // int64 as string -> parse it\n | JString value, TypeInfo.Long -> unbox (int64 value)\n | JString value, TypeInfo.Byte -> unbox (byte value)\n | JNumber value, TypeInfo.Byte -> unbox (byte value)\n | JNumber value, TypeInfo.SByte -> unbox (sbyte value)\n | JString value, TypeInfo.SByte -> unbox (sbyte value)\n // BigInt as string -> parse it\n | JString value, TypeInfo.BigInt -> unbox (BigInteger.Parse value)\n | JNumber value, TypeInfo.BigInt -> unbox (bigint (JS.Math.floor(value)))\n // parse formatted date time\n | JString value, TypeInfo.DateTime -> unbox (DateTime.Parse(value))\n // parse formatted date time offset\n | JString value, TypeInfo.DateTimeOffset -> unbox (DateTimeOffset.Parse(value))\n | JNumber value, TypeInfo.DateTimeOffset ->\n let seconds = int64 (JS.Math.floor(value))\n unbox (DateTimeOffset.FromUnixTimeSeconds seconds)\n#if NET6_0_OR_GREATER\n // TimeOnly, DateOnly\n | JNumber value, TypeInfo.DateOnly -> unbox (DateOnly.FromDayNumber (int value))\n | JString value, TypeInfo.DateOnly -> unbox (DateOnly.FromDayNumber (int value))\n | JString value, TypeInfo.TimeOnly -> unbox (TimeOnly (int64 value))\n#endif\n\n // deserialize union from objects\n // { \"One\": 20 } or {\"One\": [20]} -> One of int\n | JObject values, TypeInfo.Union (getTypes) ->\n let (cases, unionType) = getTypes()\n match Map.toList values with\n | [ caseName, JArray values ] ->\n cases\n |> Array.tryFind (fun case -> case.CaseName = caseName)\n |> function\n | None ->\n let caseNames = Array.map (fun case -> sprintf \" '%s' \" case.CaseName) cases\n let expectedCases = String.concat \", \" caseNames\n failwithf \"Case %s was not valid for type '%s', expected one of the cases [%s]\" caseName unionType.Name expectedCases\n | Some foundCase when Array.length foundCase.CaseTypes = 1 && arrayLike foundCase.CaseTypes.[0] ->\n let deserialized = fromJsonAs (JArray values) foundCase.CaseTypes.[0]\n FSharpValue.MakeUnion(foundCase.Info, [| deserialized |])\n |> unbox\n | Some foundCase when Array.length foundCase.CaseTypes = 1 && optional foundCase.CaseTypes.[0] ->\n let parsedOptional = unbox (fromJsonAs (JArray values) foundCase.CaseTypes.[0])\n FSharpValue.MakeUnion(foundCase.Info, [| parsedOptional |])\n |> unbox\n | Some foundCase ->\n if Array.length foundCase.CaseTypes = 1\n && not (arrayLike foundCase.CaseTypes.[0])\n && Array.length foundCase.CaseTypes <> List.length values\n then failwithf \"Expected case '%s' to have %d argument types but the JSON data only contained %d values\" foundCase.CaseName (Array.length foundCase.CaseTypes) (List.length values)\n let parsedValues =\n Array.ofList values\n |> Array.zip foundCase.CaseTypes\n |> Array.map (fun (valueType, value) -> fromJsonAs value valueType)\n FSharpValue.MakeUnion(foundCase.Info, parsedValues)\n |> unbox\n | [ caseName, NonArray json ] ->\n cases\n |> Array.tryFind (fun case -> case.CaseName = caseName)\n |> function\n | Some ({ CaseName = caseName; Info = caseInfo; CaseTypes = [| caseType |] }) ->\n FSharpValue.MakeUnion(caseInfo, [| unbox fromJsonAs json caseType |])\n |> unbox\n | _ ->\n let caseNames = Array.map (fun case -> sprintf \" '%s' \" case.CaseName) cases\n let expectedCases = String.concat \", \" caseNames\n failwithf \"Case %s was not valid for type '%s', expected one of the cases [%s]\" caseName unionType.Name expectedCases\n\n // Specific for Fable 3\n | otherwise when Map.containsKey \"tag\" values && Map.containsKey \"fields\" values && Map.count values = 2 ->\n match Map.tryFind \"tag\" values, Map.tryFind \"fields\" values with\n | Some (JNumber caseIndex), Some (JArray fieldValues) ->\n let foundCase = cases.[int caseIndex]\n let values =\n fieldValues\n |> Array.ofList\n |> Array.mapi (fun index value -> fromJsonAs value (foundCase.CaseTypes.[index]))\n\n FSharpValue.MakeUnion(foundCase.Info, values)\n | _ ->\n failwithf \"Could not deserialize JSON(%s) into type %s\" (SimpleJson.toString (JObject values)) unionType.FullName\n\n | otherwise when unionOfRecords typeInfo ->\n let discriminators = [\"__typename\"; \"$typename\"; \"$type\" ]\n let foundDiscriminatorKey =\n discriminators\n |> List.tryFind (fun keyword -> Map.containsKey keyword values)\n\n match foundDiscriminatorKey with\n | None ->\n failwithf \"Could not serialize the JSON object into the union of records of type %s because the JSON did not contain a known discriminator. Expected '__typename', '$typeName' or '$type'\" unionType.Name\n | Some discriminatorKey ->\n let discriminatorValueJson = Map.find discriminatorKey values\n match discriminatorValueJson with\n | JString discriminatorValue ->\n let foundUnionCase =\n cases\n |> Seq.tryFind (fun case -> case.CaseName.ToUpperInvariant() = discriminatorValue.ToUpperInvariant())\n\n match foundUnionCase with\n | None ->\n failwithf \"Union of records of type '%s' does not have a matching case '%s'\" unionType.Name discriminatorValue\n | Some case ->\n // Assuming the case types is [recordType]\n // one element of types and the first element is a record\n // as satisfied by the unionOfRecords function\n let record = unbox (fromJsonAs (JObject values) (case.CaseTypes.[0]))\n FSharpValue.MakeUnion(case.Info, [| record |])\n | otherwise ->\n failwithf \"Union of records of type '%s' cannot be deserialized with the value of the discriminator key is not a string to match against a specific union case\" unionType.Name\n | otherwise ->\n // TODO!!! Better error messages here\n let unexpectedJson = JS.JSON.stringify otherwise\n let expectedType = JS.JSON.stringify cases\n failwithf \"Expected JSON:\\n%s\\nto match the type\\n%s\" unexpectedJson expectedType\n | JNull, TypeInfo.Option _ -> unbox None\n | jsonValue, TypeInfo.Option optionalTypeDelayed when jsonValue <> JNull ->\n let optionalType = optionalTypeDelayed()\n let parsedOptional = unbox (fromJsonAs jsonValue optionalType)\n unbox Some parsedOptional\n | JString value, TypeInfo.Guid _ -> unbox (System.Guid.Parse(value))\n // int64 as a number, convert it to int then to in64\n | JNumber value , TypeInfo.Long _ -> unbox int64 (int value)\n // int64 as the internal representation from Long.js\n // then reconstruct it from the high/low (two integers) components\n | JObject dict, TypeInfo.Long _ ->\n let get key = Map.tryFind key dict\n [ get \"low\"; get \"high\"; get \"unsigned\" ]\n |> List.choose id\n |> function\n | [ JNumber low; JNumber high; JBool _ ] ->\n let lowBytes = BitConverter.GetBytes(int low)\n let highBytes = BitConverter.GetBytes(int high)\n let combinedBytes = Array.concat [ lowBytes; highBytes ]\n BitConverter.ToInt64(combinedBytes, 0)\n |> unbox\n | _ -> failwithf \"Unable to construct int64 from object literal { low: int, high: int, unsigned: bool }\"\n // convert a single case string to union\n // \"One\" -> One, here is a special case where the case in quoted inside the string\n | JString caseName, TypeInfo.Union getTypes when isQuoted caseName ->\n let (caseTypes, unionType) = getTypes()\n caseTypes\n |> Array.tryFind (fun case -> case.CaseName = removeQuotes caseName)\n |> function\n | Some ({ Info = caseInfo }) -> unbox (FSharpValue.MakeUnion(caseInfo, [||]))\n | None ->\n let caseNames = Array.map (fun case -> sprintf \" '%s' \" case.CaseName) caseTypes\n let expectedCases = String.concat \", \" caseNames\n failwithf \"Case %s was not valid for type '%s', expected one of the cases [%s]\" caseName unionType.Name expectedCases\n // convert a single case string to union\n // \"One\" -> One\n | JString caseName, TypeInfo.Union getTypes ->\n let (caseTypes, unionType) = getTypes()\n caseTypes\n |> Array.tryFind (fun case -> case.CaseName = caseName)\n |> function\n | Some ({ Info = caseInfo }) -> unbox (FSharpValue.MakeUnion(caseInfo, [||]))\n | None ->\n let caseNames = Array.map (fun case -> sprintf \" '%s' \" case.CaseName) caseTypes\n let expectedCases = String.concat \", \" caseNames\n failwithf \"Case %s was not valid for type '%s', expected one of the cases [%s]\" caseName unionType.Name expectedCases\n | JString serializedRecord, TypeInfo.Record getFields ->\n fromJsonAs (SimpleJson.parse serializedRecord) typeInfo\n // convert unions from arrays\n // [\"One\", 20] -> One of int\n | JArray caseValue, TypeInfo.Union getTypes ->\n let (cases, unionType) = getTypes()\n match caseValue with\n // Union case without values\n | [ JString caseName ] ->\n cases\n |> Array.tryFind (fun case -> case.CaseName = caseName)\n |> function\n | Some ({ CaseName = caseName; Info = caseInfo; CaseTypes = caseInfoTypes }) ->\n // single case without values\n unbox (FSharpValue.MakeUnion(caseInfo, [||]))\n | None ->\n let caseNames = Array.map (fun case -> sprintf \" '%s' \" case.CaseName) cases\n let expectedCases = String.concat \", \" caseNames\n failwithf \"Case '%s' was not valid for type '%s', expected one of the cases [%s]\" caseName unionType.Name expectedCases\n | JString caseName :: values ->\n cases\n |> Array.tryFind (fun case -> case.CaseName = caseName)\n |> function\n | None ->\n let caseNames = Array.map (fun ({ CaseName = name }) -> name) cases\n let expectedCases = String.concat \", \" caseNames\n failwithf \"Case %s was not valid, expected one of [%s]\" caseName expectedCases\n | Some ({ CaseName = foundCaseName; Info = caseInfo; CaseTypes = types }) ->\n if Array.length types <> List.length values\n then failwithf \"The number of union case parameters for '%s' is different\" foundCaseName\n let parsedValues =\n Array.ofList values\n |> Array.zip types\n |> Array.map (fun (valueType, value) -> fromJsonAs value valueType)\n FSharpValue.MakeUnion(caseInfo, parsedValues)\n |> unbox\n | otherwise ->\n let unexpectedJson = JS.JSON.stringify otherwise\n let expectedType = JS.JSON.stringify cases\n failwithf \"Expected JSON:\\n%s\\nto match the type\\n%s\" unexpectedJson expectedType\n // Arrays\n | JArray values, TypeInfo.Array elementTypeDelayed ->\n let elementType = elementTypeDelayed()\n values\n |> List.map (fun value -> unbox (fromJsonAs value elementType))\n |> Array.ofList\n |> unbox\n // Lists\n | JArray values, TypeInfo.List elementTypeDelayed ->\n let elementType = elementTypeDelayed()\n values\n |> List.map (fun value -> unbox (fromJsonAs value elementType))\n |> unbox\n\n // Specific for Fable 3\n | JObject linkedList, TypeInfo.List elementTypeDelayed ->\n let elementType = elementTypeDelayed()\n let flattenedList = flattenFable3Lists linkedList\n flattenedList\n |> List.map (fun value -> unbox (fromJsonAs value elementType))\n |> unbox\n\n | JArray values, TypeInfo.Set elementTypeDelayed ->\n let elementType = elementTypeDelayed()\n values\n |> List.map (fun value -> unbox (fromJsonAs value elementType))\n |> Set.ofList\n |> unbox\n\n | JArray values, TypeInfo.Seq elementTypeDelayed ->\n let elementType = elementTypeDelayed()\n let converted = List.map (fun value -> unbox (fromJsonAs value elementType)) values\n unbox converted\n // Tuples, become just arrays\n | JArray array, TypeInfo.Tuple tupleTypesDelayed ->\n let tupleTypes = tupleTypesDelayed()\n array\n |> Array.ofList\n |> Array.zip tupleTypes\n |> Array.map (fun (jsonType, jsonData) -> fromJsonAs jsonData jsonType)\n |> unbox\n // Records\n | JObject dict, TypeInfo.Record getTypes ->\n let fields, recordType = getTypes()\n // Match the JSON object literal keys with their types\n let recordValues =\n let values = Map.toList dict\n fields\n |> Array.map (fun ({ FieldName = fieldName; FieldType = fieldType }) ->\n values\n |> List.tryFind (fun (key, value) -> fieldName = key)\n |> function\n | Some (key, value) -> unbox (fromJsonAs value fieldType)\n | None ->\n match fieldType with\n // field type is an option of something, just return None\n | TypeInfo.Option _ -> unbox None\n | _ ->\n // field type is required and it doens't exist in the JSON\n // then generate a nice error message\n let dictKeys =\n Map.toList dict\n |> List.map (fst >> sprintf \"'%s'\")\n |> String.concat \", \"\n |> sprintf \"[ %s ]\"\n let recordFields =\n fields\n |> Array.map (fun ({ FieldName = name; FieldType = innerFieldType }) ->\n match innerFieldType with\n | TypeInfo.Option _ -> sprintf \"optional('%s')\" name\n | _ -> sprintf \"required('%s')\" name)\n |> String.concat \", \"\n |> sprintf \"[ %s ]\"\n failwithf \"Could not find the required key '%s' in the JSON object literal with keys %s to match with record type '%s' that has fields %s\" fieldName dictKeys recordType.Name recordFields)\n unbox (FSharpValue.MakeRecord(recordType, recordValues))\n\n | JArray tuples, TypeInfo.Map getTypes ->\n let (keyType, valueType) = getTypes()\n let pairs =\n [ for keyValuePair in tuples do\n let tuple = fromJsonAs keyValuePair (TypeInfo.Tuple (let a = [| keyType; valueType |] in fun () -> a))\n yield tuple ]\n match keyType with\n | TypeInfo.Int32\n | TypeInfo.String\n | TypeInfo.Bool ->\n pairs\n |> unbox<(string * obj) list>\n |> Map.ofList\n |> unbox\n | _ ->\n pairs\n |> unbox<(IStructuralComparable * obj) list>\n |> Map.ofList\n |> unbox\n\n | JArray tuples, TypeInfo.Dictionary getTypes ->\n let (keyType, valueType, originalType) = getTypes()\n let pairs =\n [ for keyValuePair in tuples do\n let tuple = fromJsonAs keyValuePair (TypeInfo.Tuple (fun () -> [| keyType; valueType |]))\n yield tuple ]\n\n let output =\n match keyType with\n | TypeInfo.Union _ -> Dictionary, _>()\n | TypeInfo.Record _ -> Dictionary<{| dummy: int |}, _>() |> unbox\n | _ -> Dictionary() |> unbox\n\n for (key, value) in (unbox<(IStructuralComparable * obj) list> pairs) do output.Add(unbox key, value)\n unbox output\n\n | JObject dict, TypeInfo.Dictionary getTypes ->\n let (keyType, valueType, originalType) = getTypes()\n dict\n |> Map.toList\n |> List.map (fun (key, value) -> fromJsonAs (JString key) keyType, fromJsonAs value valueType )\n |> fun pairs ->\n let output =\n match keyType with\n | TypeInfo.Union _ -> Dictionary, _>()\n | TypeInfo.Record _ -> Dictionary<{| dummy: int |}, _>() |> unbox\n | _ -> Dictionary() |> unbox\n\n for (key, value) in pairs do output.Add(unbox key, value)\n\n unbox output\n\n | JArray items, TypeInfo.HashSet getType ->\n let elemType = getType()\n let hashset =\n match elemType with\n | TypeInfo.Union _ -> HashSet>()\n | TypeInfo.Record _ -> HashSet<{| dummy: int |}>() |> unbox\n | _ -> HashSet() |> unbox\n\n for item in items do\n let deserialized = fromJsonAs item elemType\n hashset.Add(unbox deserialized) |> ignore\n\n unbox hashset\n\n | JObject map, TypeInfo.Map getTypes ->\n let (keyType, valueType) = getTypes()\n // check whether the map is serialized to it's internal representation\n // and convert that to back to a normal map from the data\n match Map.tryFind \"comparer\" map, Map.tryFind \"tree\" map with\n | Some (JObject comparer), Some (JArray tree) when Map.isEmpty comparer ->\n match generateMap (JArray tree) with\n | Some internalMap ->\n let pairs =\n flattenMap internalMap\n |> List.map (fun (key, value) ->\n let nextKey =\n if not (isQuoted key)\n then unbox (fromJsonAs (JString key) keyType)\n else unbox (fromJsonAs (SimpleJson.parseNative key) keyType)\n let nextValue = unbox (fromJsonAs value valueType)\n unbox nextKey, nextValue)\n match keyType with\n | TypeInfo.Int32\n | TypeInfo.String\n | TypeInfo.Bool ->\n pairs\n |> unbox<(string * obj) list>\n |> Map.ofList\n |> unbox\n | _ ->\n pairs\n |> unbox<(IStructuralComparable * obj) list>\n |> Map.ofList\n |> unbox\n\n | None ->\n let inputJson = SimpleJson.toString (JArray tree)\n failwithf \"Could not generate map from JSON\\n %s\" inputJson\n\n // Specific for Fable 3\n | Some (JObject comparer), Some (JObject tree) when Map.isEmpty comparer ->\n let flattenedMap = Map.ofList (flatteFable3Map tree)\n fromJsonAs (JObject flattenedMap) typeInfo\n | _ ->\n // if comparer and tree are not present,\n // assume we are parsing Fable 1 object literal\n // and converting that to map\n let pairs =\n map\n |> Map.toList\n |> List.map (fun (key, value) ->\n let nextKey =\n if not (isQuoted key)\n then\n if Converter.isPrimitive keyType || Converter.enumUnion keyType\n then\n // for primitive type, just read them as string and parse\n unbox (fromJsonAs (JString key) keyType)\n else\n // server-side JSON can still be complex (for complex types)\n // but doesn't have to be quoted, parse again here\n unbox (fromJsonAs (SimpleJson.parseNative key) keyType)\n else\n unbox (fromJsonAs (SimpleJson.parseNative key) keyType)\n let nextValue = unbox (fromJsonAs value valueType)\n unbox nextKey, nextValue)\n\n match keyType with\n | TypeInfo.Int32\n | TypeInfo.String\n | TypeInfo.Bool ->\n pairs\n |> unbox<(string * obj) list>\n |> Map.ofList\n |> unbox\n | _ ->\n pairs\n |> unbox<(IStructuralComparable * obj) list>\n |> Map.ofList\n |> unbox\n | _, TypeInfo.Any getType ->\n let unknownType = getType()\n failwithf \"Cannot convert %s to %s\" (SimpleJson.toString input) unknownType.FullName\n | _ ->\n failwithf \"Cannot convert %s to %s\" (SimpleJson.toString input) (JS.JSON.stringify typeInfo)\n\n let fromJson<'t> json typeInfo =\n unbox<'t> (fromJsonAs json typeInfo)\n\n let quoteText (inputText: string) : string = importDefault \"./quote.js\"\n\n let rec serialize value (typeInfo: TypeInfo) =\n match typeInfo with\n | TypeInfo.String ->\n let content = unbox value\n if isNull content\n then \"null\"\n else quoteText content\n | TypeInfo.Unit -> \"null\"\n | TypeInfo.Float\n | TypeInfo.Float32 ->\n if Double.IsNaN(unbox value)\n then quoteText \"NaN\"\n else string (unbox value)\n | TypeInfo.Char -> quoteText (string (unbox value))\n | TypeInfo.Byte\n | TypeInfo.SByte\n | TypeInfo.UInt16\n | TypeInfo.UInt32\n | TypeInfo.Short\n | TypeInfo.Enum _\n | TypeInfo.TimeSpan\n | TypeInfo.Int32 -> string (unbox value)\n | TypeInfo.UInt64\n | TypeInfo.Long -> betweenQuotes (string (unbox value))\n | TypeInfo.BigInt -> betweenQuotes (string (unbox value))\n | TypeInfo.Decimal -> betweenQuotes (string (unbox value))\n | TypeInfo.Bool -> if unbox value then \"true\" else \"false\"\n | TypeInfo.Guid -> betweenQuotes ((unbox value).ToString())\n | TypeInfo.Uri -> betweenQuotes ((unbox value).ToString())\n | TypeInfo.DateTime -> betweenQuotes ((unbox value).ToString(\"O\"))\n | TypeInfo.DateTimeOffset -> betweenQuotes ((unbox value).ToString(\"O\"))\n#if NET6_0_OR_GREATER\n | TypeInfo.DateOnly -> string (unbox value).DayNumber\n | TypeInfo.TimeOnly -> betweenQuotes (string (unbox value).Ticks)\n#endif\n | TypeInfo.Record getFields ->\n let (fieldTypes, recordType) = getFields()\n let serializedFields =\n fieldTypes\n |> Array.map (fun field ->\n let fieldValue = FSharpValue.GetRecordField(value, field.PropertyInfo)\n sprintf \"\\\"%s\\\": %s\" field.FieldName (serialize fieldValue field.FieldType)\n )\n\n \"{\" + String.concat \", \" serializedFields + \"}\"\n\n | TypeInfo.ResizeArray getElementType ->\n let elementType = getElementType()\n let values =\n value\n |> unbox>\n |> Seq.map (fun element -> serialize element elementType)\n |> String.concat \", \"\n\n \"[\" + values + \"]\"\n\n | TypeInfo.HashSet getElementType ->\n let elementType = getElementType()\n let values =\n value\n |> unbox>\n |> Seq.map (fun element -> serialize element elementType)\n |> String.concat \", \"\n\n \"[\" + values + \"]\"\n\n | TypeInfo.Set getElementType ->\n let elementType = getElementType()\n let values =\n value\n |> unbox>\n |> Seq.map (fun element -> serialize element elementType)\n |> String.concat \", \"\n\n \"[\" + values + \"]\"\n\n | TypeInfo.Array getElementType ->\n let elementType = getElementType()\n let values =\n value\n |> unbox\n |> Array.map (fun element -> serialize element elementType)\n |> String.concat \", \"\n\n \"[\" + values + \"]\"\n\n | TypeInfo.List getElementType ->\n let elementType = getElementType()\n let values =\n value\n |> unbox\n |> List.map (fun element -> serialize element elementType)\n |> String.concat \", \"\n\n \"[\" + values + \"]\"\n\n | TypeInfo.Seq getElementType ->\n let elementType = getElementType()\n let values =\n value\n |> unbox\n |> Seq.toArray\n |> Array.map (fun element -> serialize element elementType)\n |> String.concat \", \"\n\n \"[\" + values + \"]\"\n\n | TypeInfo.Option getElementType ->\n match unbox value with\n | None -> \"null\"\n | Some existingValue -> serialize existingValue (getElementType())\n\n | TypeInfo.Union getCases ->\n let (unionCases, unionType) = getCases()\n let (usedCase, fields) = FSharpValue.GetUnionFields(value, unionType)\n let caseTypes =\n unionCases\n |> Array.find (fun case -> case.CaseName = usedCase.Name)\n |> fun case -> case.CaseTypes\n\n if enumUnion typeInfo || Array.isEmpty caseTypes then\n betweenQuotes usedCase.Name\n elif caseTypes.Length = 1 then\n \"{\" + betweenQuotes usedCase.Name + \": \" + serialize fields.[0] caseTypes.[0] + \"}\"\n else\n let serializedFields =\n caseTypes\n |> Array.mapi (fun index caseType -> serialize fields.[index] caseType)\n |> String.concat \", \"\n\n \"{\" + betweenQuotes usedCase.Name + \": \" + \"[\" + serializedFields + \"] }\"\n\n | TypeInfo.Map getPairTypes ->\n let (keyType, valueType) = getPairTypes()\n\n let serializedValues =\n value\n |> unbox>\n |> Map.toArray\n |> Array.map (fun (key, value) ->\n let serializedKey = serialize key keyType\n let serializedValue = serialize value valueType\n\n if isPrimitive keyType || enumUnion keyType then\n if not (isQuoted serializedKey)\n then (quoteText serializedKey) + \": \" + serializedValue\n else serializedKey + \": \" + serializedValue\n else\n \"[\" + serializedKey + \", \" + serializedValue + \"]\"\n )\n |> String.concat \", \"\n\n if isPrimitive keyType || enumUnion keyType\n then \"{\" + serializedValues + \"}\"\n else \"[\" + serializedValues + \"]\"\n\n | TypeInfo.Dictionary getPairTypes ->\n let (keyType, valueType, originalType) = getPairTypes()\n let serializedValues =\n value\n |> unbox>\n |> Seq.map (fun pair ->\n let (key, value) = pair.Key, pair.Value\n let serializedKey = serialize key keyType\n let serializedValue = serialize value valueType\n\n if isPrimitive keyType || enumUnion keyType then\n if not (isQuoted serializedKey)\n then (betweenQuotes serializedKey) + \": \" + serializedValue\n else serializedKey + \": \" + serializedValue\n else\n \"[\" + serializedKey + \", \" + serializedValue + \"]\"\n )\n |> String.concat \", \"\n\n if isPrimitive keyType || enumUnion keyType\n then \"{\" + serializedValues + \"}\"\n else \"[\" + serializedValues + \"]\"\n\n | TypeInfo.Tuple getTupleTypes ->\n let tupleTypes = getTupleTypes()\n\n if tupleTypes.Length = 1 then\n \"[\" + serialize value tupleTypes.[0] + \"]\"\n else\n let serializedValues =\n value\n |> unbox\n |> Array.mapi (fun index element -> serialize element tupleTypes.[index])\n |> String.concat \", \"\n\n \"[\" + serializedValues + \"]\"\n\n | TypeInfo.Object ->\n SimpleJson.stringify value\n\n | TypeInfo.Any getType ->\n // fallback to low-level serialization\n SimpleJson.stringify value\n\n | _ ->\n \"null\"\n\n[]\nmodule ConverterExtensions =\n type Json with\n\n /// \n /// Serialized the input value object into JSON, uses built-in JSON.stringify and should be used with Fable 2.x or earlier\n /// \n static member stringify (value: obj) : string =\n if Convert.isUsingFable3\n then JS.console.warn(\"It looks like you using the function Json.stringify from Fable.SimpleJson while also using Fable 3 (nagareyama). Please use Json.serialize instead which supports both Fable 3 and Fable 2.x\")\n SimpleJson.stringify value\n\n /// \n /// Serialized the input value into JSON using Reflection. Compatible with Fable 2.x and Fable 3 (codename: nagareyama)\n /// \n static member inline serialize<'t> (value: 't) : string =\n let typeInfo = TypeInfo.createFrom<'t>()\n Convert.serialize value typeInfo\n\n /// Parses the input string as JSON and tries to convert it as the given type argument\n static member inline parseAs<'t> (input: string) : 't =\n match SimpleJson.tryParse input with\n | None -> failwith \"Couldn't parse the input JSON string because it seems to be invalid\"\n | Some inputJson ->\n let typeInfo = TypeInfo.createFrom<'t> ()\n Convert.fromJson<'t> inputJson typeInfo\n\n /// Parses the input string as JSON using native parsing and tries to convert it as the given type argument\n static member inline parseNativeAs<'t> (input: string) : 't =\n let inputJson = SimpleJson.parseNative input\n let typeInfo = TypeInfo.createFrom<'t> ()\n Convert.fromJson<'t> inputJson typeInfo\n\n /// Tries to parse the input string as JSON and tries to convert it as the given type argument, returing a (hopefully) useful error message when it fails\n static member inline tryParseAs<'t> (input: string) : Result<'t, string> =\n try Ok (Json.parseAs<'t> input)\n with | ex -> Error ex.Message\n\n /// Tries to parse the input string as JSON using native parsing and tries to convert it as the given type argument\n static member inline tryParseNativeAs<'t> (input: string) : Result<'t, string> =\n try Ok (Json.parseNativeAs<'t> input)\n with | ex -> Error ex.Message\n\n /// Tries to convert parsed JSON object as the given type parameter argument, this method is used when you want to apply transformations to the JSON object before parsing\n static member inline convertFromJsonAs<'t> (input: Json) : 't =\n let typeInfo = TypeInfo.createFrom<'t> ()\n Convert.fromJson<'t> input typeInfo\n\n /// Tries to convert parsed JSON object as the given type parameter argument, this method is used when you want to apply transformations to the JSON object before parsing\n static member inline tryConvertFromJsonAs<'t> (input: Json) : Result<'t, string> =\n try Ok (Json.convertFromJsonAs<'t> input)\n with | ex -> Error ex.Message\n","export default function quote(inputText) {\n var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n var meta = {\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\'\n }\n\n escapable.lastIndex = 0;\n return escapable.test(inputText) ?\n '\"' + inputText.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' :\n '\"' + inputText + '\"';\n}","namespace Fable.Remoting.Client\n\nopen System\nopen Fable.Core\nopen Fable.SimpleJson\nopen Browser.Types\n\nmodule internal Blob =\n /// Creates a Blob from the given input string\n []\n let fromBinaryEncodedText (value: byte[]) : Blob = jsNative\n\n /// Asynchronously reads the blob data content as string\n let readBlobAsText (blob: Blob) : Async =\n Async.FromContinuations <| fun (resolve, _, _) ->\n let reader = InternalUtilities.createFileReader()\n reader.onload <- fun _ ->\n if reader.readyState = FileReaderState.DONE\n then resolve (unbox reader.result)\n\n reader.readAsText(blob)\n\nmodule Proxy =\n let combineRouteWithBaseUrl route (baseUrl: string option) =\n match baseUrl with\n | None -> route\n | Some url -> sprintf \"%s%s\" (url.TrimEnd('/')) route\n\n let isByteArray = function\n | TypeInfo.Array getElemType ->\n match getElemType() with\n | TypeInfo.Byte -> true\n | otherwise -> false\n | otherwise -> false\n\n let isAsyncOfByteArray = function\n | TypeInfo.Async getAsyncType ->\n match getAsyncType() with\n | TypeInfo.Array getElemType ->\n match getElemType() with\n | TypeInfo.Byte -> true\n | otherwise -> false\n | otherwise -> false\n | otherwise -> false\n\n let rec getReturnType typ =\n if Reflection.FSharpType.IsFunction typ then\n let _, res = Reflection.FSharpType.GetFunctionElements typ\n getReturnType res\n elif typ.IsGenericType then\n typ.GetGenericArguments () |> Array.head\n else\n typ\n\n let proxyFetch options typeName (func: RecordField) fieldType =\n let funcArgs : (TypeInfo [ ]) =\n match func.FieldType with\n | TypeInfo.Async inner -> [| func.FieldType |]\n | TypeInfo.Promise inner -> [| func.FieldType |]\n | TypeInfo.Func getArgs -> getArgs()\n | _ -> failwithf \"Field %s does not have a valid definiton\" func.FieldName\n\n let argumentCount = (Array.length funcArgs) - 1\n let returnTypeAsync = Array.last funcArgs\n\n let binaryInput =\n match func.FieldType with\n | TypeInfo.Func getArgs ->\n match getArgs() with\n | [| input; output |] -> isByteArray input\n | otherwise -> false\n | otherwise -> false\n\n let route = options.RouteBuilder typeName func.FieldName\n let url = combineRouteWithBaseUrl route options.BaseUrl\n let funcNeedParameters =\n match funcArgs with\n | [| TypeInfo.Async _ |] -> false\n | [| TypeInfo.Promise _ |] -> false\n | [| TypeInfo.Unit; TypeInfo.Async _ |] -> false\n | otherwise -> true\n\n let contentType =\n if binaryInput\n then \"application/octet-stream\"\n else \"application/json; charset=utf-8\"\n\n let inputArgumentTypes = Array.take argumentCount funcArgs\n\n let headers = [\n yield \"Content-Type\", contentType\n yield \"x-remoting-proxy\", \"true\"\n yield! options.CustomHeaders\n match options.Authorization with\n | Some authToken -> yield \"Authorization\", authToken\n | None -> () ]\n\n let executeRequest =\n if options.CustomResponseSerialization.IsSome || isAsyncOfByteArray returnTypeAsync then\n let onOk =\n match options.CustomResponseSerialization with\n | Some serializer ->\n let returnType = getReturnType fieldType\n fun response -> serializer response returnType\n | _ -> box\n\n fun requestBody -> async {\n // read as arraybuffer and deserialize\n let! (response, statusCode) =\n if funcNeedParameters then\n Http.post url\n |> Http.withBody requestBody\n |> Http.withHeaders headers\n |> Http.withCredentials options.WithCredentials\n |> Http.sendAndReadBinary\n else\n Http.get url\n |> Http.withHeaders headers\n |> Http.withCredentials options.WithCredentials\n |> Http.sendAndReadBinary\n\n match statusCode with\n | 200 ->\n return onOk response\n | n ->\n let responseAsBlob = Blob.fromBinaryEncodedText response\n let! responseText = Blob.readBlobAsText responseAsBlob\n let response = { StatusCode = statusCode; ResponseBody = responseText }\n let errorMsg = if n = 500 then sprintf \"Internal server error (500) while making request to %s\" url else sprintf \"Http error (%d) while making request to %s\" n url\n return! raise (ProxyRequestException(response, errorMsg, response.ResponseBody))\n }\n else\n let returnType =\n match returnTypeAsync with\n | TypeInfo.Async getAsyncTypeArgument -> getAsyncTypeArgument()\n | TypeInfo.Promise getPromiseTypeArgument -> getPromiseTypeArgument()\n | TypeInfo.Any getReturnType ->\n let t = getReturnType()\n if t.FullName.StartsWith \"System.Threading.Tasks.Task`1\" then\n t.GetGenericArguments().[0] |> createTypeInfo\n else\n failwithf \"Expected field %s to have a return type of Async<'t> or Task<'t>\" func.FieldName\n | _ -> failwithf \"Expected field %s to have a return type of Async<'t> or Task<'t>\" func.FieldName\n\n fun requestBody -> async {\n // make plain RPC request and let it go through the deserialization pipeline\n let! response =\n if funcNeedParameters then\n Http.post url\n |> Http.withBody requestBody\n |> Http.withHeaders headers\n |> Http.withCredentials options.WithCredentials\n |> Http.send\n else\n Http.get url\n |> Http.withHeaders headers\n |> Http.withCredentials options.WithCredentials\n |> Http.send\n\n match response.StatusCode with\n | 200 ->\n let parsedJson = SimpleJson.parseNative response.ResponseBody\n return Convert.fromJsonAs parsedJson returnType\n | 500 -> return! raise (ProxyRequestException(response, sprintf \"Internal server error (500) while making request to %s\" url, response.ResponseBody))\n | n -> return! raise (ProxyRequestException(response, sprintf \"Http error (%d) from server occured while making request to %s\" n url, response.ResponseBody))\n }\n\n fun arg0 arg1 arg2 arg3 arg4 arg5 arg6 arg7 ->\n let inputArguments =\n if funcNeedParameters\n then Array.take argumentCount [| box arg0;box arg1;box arg2;box arg3; box arg4; box arg5; box arg6; box arg7 |]\n else [| |]\n\n let requestBody =\n if binaryInput then\n RequestBody.Binary (unbox arg0)\n else\n match inputArgumentTypes.Length with\n | 1 when not (Convert.arrayLike inputArgumentTypes.[0]) ->\n let typeInfo = TypeInfo.Tuple(fun _ -> inputArgumentTypes)\n let requestBodyJson =\n inputArguments\n |> Array.tryHead\n |> Option.map (fun arg -> Convert.serialize arg typeInfo)\n |> Option.defaultValue \"{}\"\n RequestBody.Json requestBodyJson\n | 1 ->\n // for array-like types, use an explicit array surranding the input array argument\n let requestBodyJson = Convert.serialize [| inputArguments.[0] |] (TypeInfo.Array (fun _ -> inputArgumentTypes.[0]))\n RequestBody.Json requestBodyJson\n | n ->\n let typeInfo = TypeInfo.Tuple(fun _ -> inputArgumentTypes)\n let requestBodyJson = Convert.serialize inputArguments typeInfo\n RequestBody.Json requestBodyJson\n\n executeRequest requestBody\n","module Shared.Dto.User\n\nopen System\n\ntype Package =\n | BaseAccess\n | AdditionalSensor\n | History\n | Alerts\n | Scab\n | Peronospora\n\ntype PurchasedPackage = {\n Package: Package\n PurchasedAt: DateTimeOffset\n ValidUntil: DateOnly\n CanceledAt: DateTimeOffset option\n}\n\n\nlet getPackageLabel (package: Package) =\n match package with\n | BaseAccess -> \"Basiszugang\"\n | AdditionalSensor -> \"Zusätzlicher Sensor\"\n | History -> \"History und erweiterter Download der Daten\"\n | Alerts -> \"Bewarnung\"\n | Scab -> \"Schädlingsmodel Schorf\"\n | Peronospora -> \"Schädlingsmodel Peronospora\"\n\nlet getPackageCharacter package =\n match package with\n | BaseAccess -> \"B\"\n | AdditionalSensor -> \"S\"\n | History -> \"H\"\n | Alerts -> \"W\"\n | Scab -> \"SM_S\"\n | Peronospora -> \"SM_P\"\n\n\nlet getPackageId package =\n match package with\n | BaseAccess -> \"base\"\n | AdditionalSensor -> \"additional_sensor\"\n | History -> \"history\"\n | Alerts -> \"alerts\"\n | Scab -> \"scab\"\n | Peronospora -> \"peronospora\"\n\nlet packageFromId packageId =\n match packageId with\n | \"base\" -> BaseAccess\n | \"additional_sensor\" -> AdditionalSensor\n | \"history\" -> History\n | \"alerts\" -> Alerts\n | \"scab\" -> Scab\n | \"peronospora\" -> Peronospora\n | _ -> raise (Exception <| sprintf \"Unknown Package Id '%s'\" packageId)\n\ntype Role =\n | Admin\n | RegularUser\n | TestUser\n\ntype UserDto = {\n Id: int\n FirstName: string\n LastName: string\n Role: Role\n}\n\nlet getFullName (user: UserDto) : string =\n sprintf \"%s %s\" user.FirstName user.LastName\n\nlet getFullNameLastFirst (user: UserDto) : string =\n sprintf \"%s %s\" user.LastName user.FirstName","module Shared.Dto.Dto\n\nopen System\nopen Shared.Dto.User\nopen Shared.DtoTypes.PhysicalSensor\nopen Shared.DtoTypes.LeafletWetness\n\ntype SessionKey = SessionKey of string\n\nlet sessionKeyToString (SessionKey key) = key\n\ntype UserSession = {\n User: UserDto\n SessionKey: SessionKey\n}\n\ntype Session =\n | Anonymous\n | UserSession of UserSession\n\ntype LoginRequestData = {\n Mail: string\n Password: String\n}\n\ntype LoginResponse =\n | Successful of UserSession\n | Unsuccessful of string\n\ntype AuthenticatedRequest<'a> = {\n SessionKey: SessionKey\n Data: 'a\n}\n\ntype AuthenticationError =\n | Unauthorized\n | Unauthenticated\n\ntype AuthenticatedResponseError =\n | AuthErr of AuthenticationError\n | CustomErr of string\n\ntype AuthenticatedResponse<'a> = Result<'a, AuthenticatedResponseError>\n\n\ntype SensorType =\n | Air\n | Soil\n | RainFall\n | LeafletMoisture\n | PH\n | WindAverage\n | WeatherStation\n | LiquidLevel\n | SolarRadiation\n\nlet sensorModelToString sensorType =\n match sensorType with\n | LHT65 -> \"Luftsensor (LHT65)\"\n | LSN50v2_S31 -> \"Luftsensor (LSN50v2_S31)\"\n | S31_LS -> \"Luftsensor Solar (S31_LS)\"\n | S31_LB -> \"Luftsensor Batterie (S31_LB)\"\n | LSE01 -> \"Bodensensor (LSE01)\"\n | SE01_LS -> \"Bodensensor Solar (SE01_LS)\"\n | SE01_LB -> \"Bodensensor Batterie (SE01_LB)\"\n | LSN50v2_Rain_01mm -> \"Regensensor 0,1mm (LSN50v2)\"\n | LSN50v2_Rain_02mm -> \"Regensensor 0,2mm (LSN50v2)\"\n | SN50v3_LS_Rain_01mm -> \"Regensensor 0,1mm Solar (SN50v3_LS)\"\n | SN50v3_LS_Rain_02mm -> \"Regensensor 0,2mm Solar (SN50v3_LS)\"\n | SN50v3_LB_Rain_01mm -> \"Regensensor 0,1mm Batterie (SN50v3_LB)\"\n | SN50v3_LB_Rain_02mm -> \"Regensensor 0,2mm Batterie (SN50v3_LB)\"\n | LSN50v2_Wind -> \"Wind Durchschnitt (LSN50v2)\"\n | SN50v3_LS_Wind -> \"Wind Durchschnitt Solar (SN50v2_LS)\"\n | SN50v3_LB_Wind -> \"Wind Durchschnitt Batterie (SN50v2_LB)\"\n | LLMS01 -> \"Blattnässe (LLMS01)\"\n | LSPH01 -> \"PH-Wert (LSPH01)\"\n | WSC1L -> \"Wetterstation (WSC1-L)\"\n | DDS20_LS -> \"Ultraschall Füllstand Solar (DDS20_LS)\"\n | DDS20_LB -> \"Ultraschall Füllstand Batterie (DDS20_LB)\"\n | RS485_LB_ZFS_02 -> \"Globalstrahlung Batterie (RS485_LB ZFS_02)\"\n | RS485_LS_ZFS_02 -> \"Globalstrahlung Solar (RS485_LS ZFS_02)\"\n\nlet sensorTypeFromString typeString =\n match typeString with\n | \"Luftsensor (LHT65)\" -> Some LHT65\n | \"Luftsensor (LSN50v2_S31)\" -> Some LSN50v2_S31\n | \"Luftsensor Solar (S31_LS)\" -> Some S31_LS\n | \"Luftsensor Batterie (S31_LB)\" -> Some S31_LB\n | \"Bodensensor (LSE01)\" -> Some LSE01\n | \"Bodensensor Solar (SE01_LS)\" -> Some SE01_LS\n | \"Bodensensor Batterie (SE01_LB)\" -> Some SE01_LB\n | \"Regensensor 0,1mm (LSN50v2)\" -> Some LSN50v2_Rain_01mm\n | \"Regensensor 0,2mm (LSN50v2)\" -> Some LSN50v2_Rain_02mm\n | \"Regensensor 0,1mm Solar (SN50v3_LS)\" -> Some SN50v3_LS_Rain_01mm\n | \"Regensensor 0,2mm Solar (SN50v3_LS)\" -> Some SN50v3_LS_Rain_02mm\n | \"Regensensor 0,1mm Batterie (SN50v3_LB)\" -> Some SN50v3_LB_Rain_01mm\n | \"Regensensor 0,2mm Batterie (SN50v3_LB)\" -> Some SN50v3_LB_Rain_02mm\n | \"Wind Durchschnitt Solar (SN50v2_LS)\" -> Some SN50v3_LS_Wind\n | \"Wind Durchschnitt Batterie (SN50v2_LB)\" -> Some SN50v3_LB_Wind\n | \"Blattnässe (LLMS01)\" -> Some LLMS01\n | \"PH-Wert (LSPH01)\" -> Some LSPH01\n | \"Wind Durchschnitt (LSN50v2)\" -> Some LSN50v2_Wind\n | \"Wetterstation (WSC1-L)\" -> Some WSC1L\n | \"Ultraschall Füllstand Solar (DDS20_LS)\" -> Some DDS20_LS\n | \"Ultraschall Füllstand Batterie (DDS20_LB)\" -> Some DDS20_LB\n | \"Globalstrahlung Batterie (RS485_LB ZFS_02)\" -> Some RS485_LB_ZFS_02\n | \"Globalstrahlung Solar (RS485_LS ZFS_02)\" -> Some RS485_LS_ZFS_02\n | _ -> None\n\n\nlet getBaseData sensor =\n match sensor with\n | Configured configured -> configured.BaseData\n | UnConfigured baseData -> baseData\n\nlet getDeviceEui sensor = (getBaseData sensor).DeviceEui\n\nlet getSensorName sensor = (getBaseData sensor).Name\n\nlet getSensorDeviceEui sensor = (getBaseData sensor).DeviceEui\n\nlet getSensorAppEui sensor = (getBaseData sensor).AppEui\n\nlet getSensorAppKey sensor = (getBaseData sensor).AppKey\n\nlet getSensorType sensor =\n match sensor with\n | Configured configured -> Some configured.Configuration\n | UnConfigured _ -> None\n\nlet sensorTypeAsString sensor =\n match sensor with\n | Configured configured -> Some(sensorModelToString configured.Configuration)\n | UnConfigured _ -> None\n\n\ntype PasswordResetRequest = {\n RequestedAt: DateTimeOffset\n UserId: int\n Token: string\n}\n\nlet leafletWetnessToInt wetness =\n match wetness with\n | Wet _ -> 1\n | Dry -> 0\n\ntype BatteryLevel =\n | Full\n | TwoQuarters\n | OneQuarter\n | Low\n | Danger\n\ntype LeafletWetnessConfiguration = {\n WetHumidityLimit: float\n DryHumidityLimit: float\n\n DewPointLimit: float\n\n RelativeHumidityDeltaLimit: float\n AbsoluteHumidityFactorLimit: float\n}\n\ntype DateRange = {\n Start: DateTime\n End: DateTime\n}\n\n\ntype SensorDataRequest = {\n Range: DateRange\n SensorId: int\n}","namespace Shared\n\nopen System\n\n\ntype DatedValue<'a> = {\n Date: DateTimeOffset\n Value: 'a\n}\n\n[]\nmodule DatedValue =\n let private timeToString (time: DateTimeOffset) = time.ToString(\"HH:mm\")\n\n let toString f (value: DatedValue<'a>) =\n sprintf \"%s (%s)\" (f value.Value) (timeToString value.Date)\n\n let timeSpan oldDate newDate = newDate.Date - oldDate.Date\n\n let getMinutesDelta oldDate newDate =\n timeSpan oldDate newDate |> fun span -> span.TotalMinutes\n\n let map (f: 'a -> 'b) (value: DatedValue<'a>) : DatedValue<'b> = {\n Date = value.Date\n Value = f value.Value\n }\n\n let create (date: DateTimeOffset) (value: 'a) : DatedValue<'a> = {\n Date = date\n Value = value\n }","namespace Shared.Dto\n\ntype Location = {\n Longitude: float\n Latitude: float\n}\n\n[]\nmodule Location =\n\n let create (longitude: float) (latitude: float) : Location option =\n let validatedLatitude =\n if -90. <= latitude && latitude <= 90. then\n Some latitude\n else\n None\n\n let validatedLongitude =\n if -180. <= longitude && longitude <= 180. then\n Some longitude\n else\n None\n\n Option.map2\n (fun long lat -> {\n Longitude = long\n Latitude = lat\n })\n validatedLongitude\n validatedLatitude\n\n let fromOptional (maybeLongitude: float option) (maybeLatitude: float option) : Location option =\n match maybeLongitude, maybeLatitude with\n | Some longitude, Some latitude -> create longitude latitude\n | _, _ -> None","module Shared.Dto.MapSensorData\n\nopen System\nopen Shared\nopen Shared.Dto.Dto\nopen Shared.DtoTypes.LeafletWetness\nopen Shared.DtoTypes.MapSensorData\n\ntype AirSensorData = {\n Date: DateTimeOffset\n AirTemperature: float\n AirHumidity: float\n HumidTemperature: float\n DewPoint: float\n AbsoluteHumidity: float\n MinAirTemperature: DatedValue\n MaxAirTemperature: DatedValue\n Rssi: int option\n BatteryLevel: BatteryLevel\n LeafletWetness: LeafletWetness\n}\n\ntype SoilMoistureSection =\n | F1\n | F2\n | F3\n | F4\n | F5\n | F6\n | F7\n | F8\n | F9\n\ntype GroundSensorData = {\n Date: DateTimeOffset\n GroundTemperature: float\n GroundHumidity: float\n SoilConductivity: float\n MinGroundHumidity: DatedValue\n MaxGroundHumidity: DatedValue\n Rssi: int option\n BatteryLevel: BatteryLevel\n MoistureSection: SoilMoistureSection option\n}\n\ntype RainFallSensorData = {\n Date: DateTimeOffset\n CurrentRainFall: float\n RainFallLastHour: float option\n RainFallLast24h: float option\n Rssi: int option\n BatteryLevel: BatteryLevel\n TotalRainFallAmount: float\n}\n\ntype LeafletMoistureSensorData = {\n Date: DateTimeOffset\n Rssi: int option\n BatteryLevel: BatteryLevel\n\n LeafletMoisture: float\n LeafletTemperature: float\n}\n\ntype SoilPhSensorData = {\n Date: DateTimeOffset\n Rssi: int option\n BatteryLevel: BatteryLevel\n\n SoilPh: float\n SoilTemperature: float\n}\n\ntype AverageWindSensorData = {\n Date: DateTimeOffset\n Rssi: int option\n BatteryLevel: BatteryLevel\n\n AverageWindSpeed: float\n}\n\ntype LiquidLevelData = {\n Date: DateTimeOffset\n Rssi: int option\n BatteryLevel: BatteryLevel\n\n LiquidLevel: int\n}\n\ntype SolarRadiationData = {\n Date: DateTimeOffset\n Rssi: int option\n BatteryLevel: BatteryLevel\n\n SolarRadiation: int\n}\n\nlet windToWindSpeed (wind: Wind) =\n match wind with\n | NoWind -> None\n | Wind data -> Some data.WindSpeed\n\ntype MapSensorDataList =\n | NoDataAvailable\n | AirData of AirSensorData list\n | GroundData of GroundSensorData list\n | RainFallData of RainFallSensorData list\n | LeafletMoistureData of LeafletMoistureSensorData list\n | SoilPhData of SoilPhSensorData list\n | AverageWindSpeed of AverageWindSensorData list\n | WeatherStation of WeatherStationSensorData list\n | LiquidLevel of LiquidLevelData list\n | SolarRadiation of SolarRadiationData list\n\ntype MapSensorData =\n | NoDataAvailable\n | NoPublicData\n | AirData of AirSensorData\n | GroundData of GroundSensorData\n | RainFallData of RainFallSensorData\n | LeafletMoistureData of LeafletMoistureSensorData\n | SoilPhData of SoilPhSensorData\n | AverageWindSpeedData of AverageWindSensorData\n | WeatherStationData of WeatherStationSensorData\n | LiquidLevelData of LiquidLevelData\n | SolarRadiationData of SolarRadiationData\n\ntype MapSensor = {\n Id: int\n Name: string\n SecondName: string option\n Latitude: double\n Longitude: double\n Data: MapSensorData\n DetailsAllowed: bool\n}\n\ntype ActiveMapSensorDataDto = {\n Id: int\n Name: string\n SecondName: string option\n Location: Location\n Data: MapSensorData\n}\n\ntype DefectiveMyMapSensorDataDto = {\n Id: int\n Name: string\n SecondName: string option\n}\n\ntype DisabledMyMapSensorDataDto = {\n Name: string\n SecondName: string option\n}\n\ntype MyMapSensorDataDto =\n | Active of ActiveMapSensorDataDto\n | Defective of DefectiveMyMapSensorDataDto\n\ntype UserGroupMapSensorsDto = {\n Name: string\n Senors: ActiveMapSensorDataDto list\n}\n\ntype MapSensorDataResponse = {\n MySensors: MyMapSensorDataDto list\n Groups: UserGroupMapSensorsDto list\n}\n\nlet getMyMapSensorName (sensor: MyMapSensorDataDto) : string =\n match sensor with\n | Active active -> active.Name\n | Defective defective -> defective.Name\n\nlet getRssiOfSensorData (data: MapSensorData) =\n match data with\n | AirData airData -> airData.Rssi\n | GroundData groundData -> groundData.Rssi\n | RainFallData data -> data.Rssi\n | LeafletMoistureData data -> data.Rssi\n | SoilPhData data -> data.Rssi\n | AverageWindSpeedData data -> data.Rssi\n | _ -> None\n\nlet getBatteryLevel (data: MapSensorData) =\n match data with\n | AirData airData -> Some airData.BatteryLevel\n | GroundData groundData -> Some groundData.BatteryLevel\n | RainFallData data -> Some data.BatteryLevel\n | LeafletMoistureData data -> Some data.BatteryLevel\n | SoilPhData data -> Some data.BatteryLevel\n | AverageWindSpeedData data -> Some data.BatteryLevel\n | _ -> None\n\nlet getSensorDataDate (data: MapSensorData) =\n match data with\n | NoDataAvailable\n | NoPublicData -> None\n | AirData data -> Some data.Date\n | GroundData data -> Some data.Date\n | RainFallData data -> Some data.Date\n | LeafletMoistureData data -> Some data.Date\n | SoilPhData data -> Some data.Date\n | AverageWindSpeedData data -> Some data.Date\n | WeatherStationData data -> Some data.Date\n | LiquidLevelData data -> Some data.Date\n | SolarRadiationData data -> Some data.Date\n\nlet windDirectionToCompassDirection (degree: float) : CompassDirection =\n if degree >= 337.5 || degree <= 22.5 then\n N\n else if degree > 22.5 && degree < 67.5 then\n NE\n else if degree >= 67.5 && degree <= 112.5 then\n E\n else if degree > 112.5 && degree < 157.5 then\n SE\n else if degree >= 157.5 && degree <= 202.5 then\n S\n else if degree > 202.5 && degree < 247.5 then\n SW\n else if degree >= 247.5 && degree <= 292.5 then\n W\n else if degree > 292.5 && degree < 337.5 then\n NW\n else\n failwithf $\"%f{degree} Degrees are not a valid WindDirection\"\n\nlet compassDirectionToLabel (direction: CompassDirection) : string =\n match direction with\n | N -> \"N\"\n | NE -> \"NO\"\n | E -> \"O\"\n | SE -> \"SO\"\n | S -> \"S\"\n | SW -> \"SW\"\n | W -> \"W\"\n | NW -> \"NW\"\n\nlet toAirData (data: MapSensorData) : AirSensorData option =\n match data with\n | AirData air -> Some air\n | _ -> None\n\nlet toSoilData (data: MapSensorData) : GroundSensorData option =\n match data with\n | GroundData soil -> Some soil\n | _ -> None\n\nlet toSoilPhData (data: MapSensorData) : SoilPhSensorData option =\n match data with\n | SoilPhData ph -> Some ph\n | _ -> None\n\nlet toRainFallData (data: MapSensorData) : RainFallSensorData option =\n match data with\n | RainFallData rainFall -> Some rainFall\n | _ -> None\n\nlet toLeafletMoistureData (data: MapSensorData) : LeafletMoistureSensorData option =\n match data with\n | LeafletMoistureData leafletMoisture -> Some leafletMoisture\n | _ -> None\n\nlet toAverageWindSpeedData (data: MapSensorData) : AverageWindSensorData option =\n match data with\n | AverageWindSpeedData averageWindSpeed -> Some averageWindSpeed\n | _ -> None\n\nlet toWeatherStationData (data: MapSensorData) : WeatherStationSensorData option =\n match data with\n | WeatherStationData weatherStation -> Some weatherStation\n | _ -> None\n\nlet toLiquidLevelData (data: MapSensorData) : LiquidLevelData option =\n match data with\n | LiquidLevelData liquidData -> Some liquidData\n | _ -> None\n\nlet toSolarRadiationData (data: MapSensorData) : SolarRadiationData option =\n match data with\n | SolarRadiationData data -> Some data\n | _ -> None","namespace Shared.Dto\n\nopen System\nopen Shared.Dto.Dto\n\ntype MapSensorStateDto =\n | Active\n | Disabled\n | Defective\n\ntype BaseMapSensorDto = {\n Name: string\n Location: Location\n Altitude: float option\n IsPublic: bool\n State: MapSensorStateDto\n TtnSensorId: string option\n UserId: int option\n Note: string option\n LastAssignmentDate: DateTime option\n StateSince: DateTimeOffset\n}\n\ntype SoilMapSensorDto = {\n Base: BaseMapSensorDto\n WetLimit: float option\n DryLimit: float option\n}\n\ntype MapSensorDto =\n | Air of BaseMapSensorDto\n | Soil of SoilMapSensorDto\n | RainFall of BaseMapSensorDto\n | LeafletMoisture of BaseMapSensorDto\n | PH of BaseMapSensorDto\n | WindAverage of BaseMapSensorDto\n | WeatherStation of BaseMapSensorDto\n | LiquidLevel of BaseMapSensorDto\n | SolarRadiation of BaseMapSensorDto\n\n[]\nmodule MapSensor =\n let getBaseData (sensor: MapSensorDto) =\n match sensor with\n | MapSensorDto.Air data\n | MapSensorDto.RainFall data\n | MapSensorDto.PH data\n | MapSensorDto.LeafletMoisture data\n | MapSensorDto.RainFall data\n | MapSensorDto.WindAverage data -> data\n | MapSensorDto.Soil data -> data.Base\n | MapSensorDto.WeatherStation data -> data\n | MapSensorDto.LiquidLevel data -> data\n | MapSensorDto.SolarRadiation data -> data\n\n let toSensorType (sensor: MapSensorDto) =\n match sensor with\n | MapSensorDto.Air _ -> SensorType.Air\n | MapSensorDto.Soil _ -> SensorType.Soil\n | MapSensorDto.RainFall _ -> SensorType.RainFall\n | MapSensorDto.LeafletMoisture _ -> SensorType.LeafletMoisture\n | MapSensorDto.PH _ -> SensorType.PH\n | MapSensorDto.WindAverage _ -> SensorType.WindAverage\n | MapSensorDto.WeatherStation _ -> SensorType.WeatherStation\n | MapSensorDto.LiquidLevel _ -> SensorType.LiquidLevel\n | MapSensorDto.SolarRadiation _ -> SensorType.SolarRadiation\n\n let mapBaseData f (sensor: MapSensorDto) : MapSensorDto =\n let newBaseData = getBaseData sensor |> f\n\n match sensor with\n | Air _ -> Air newBaseData\n | RainFall _ -> RainFall newBaseData\n | PH _ -> PH newBaseData\n | LeafletMoisture _ -> LeafletMoisture newBaseData\n | WindAverage _ -> WindAverage newBaseData\n | Soil data ->\n Soil {\n Base = newBaseData\n WetLimit = data.WetLimit\n DryLimit = data.DryLimit\n }\n | WeatherStation _ -> WeatherStation newBaseData\n | LiquidLevel _ -> LiquidLevel newBaseData\n | SolarRadiation _ -> SolarRadiation newBaseData\n\n let isActive (state: MapSensorDto) : bool =\n match (getBaseData state).State with\n | Active -> true\n | _ -> false","namespace Shared.Dto\n\nopen System\nopen Shared.Dto.MapSensorData\nopen Shared.DtoTypes.PhysicalSensor\n\n[]\nmodule SensorDetailPage =\n type GraphVisualisation<'a> =\n | NotAllowed\n | Allowed of 'a\n\n let mapGraphVisualisation f data =\n match data with\n | NotAllowed -> NotAllowed\n | Allowed data -> Allowed(f data)\n\n type Data = {\n Id: int\n Name: string\n SensorModel: SensorModel\n Location: Location\n CurrentData: MapSensorData\n DownloadRangeIds: string list\n Visualisations: GraphVisualisation\n }\n\n type Response =\n | NotFound\n | Unauthenticated\n | Unauthorized\n | NotActive\n | Data of Data","module Shared.Dto.Page.UserList\n\nopen System\nopen Shared\nopen Shared.Dto.User\n\ntype BaseUserDataDto = {\n Mail: string\n FirstName: string\n LastName: string\n Password: string option\n LastLogin: DateTimeOffset option\n}\n\ntype RegularUserDataDto = {\n Base: BaseUserDataDto\n Packages: IdValue list\n CustomerNumber: string option\n}\n\ntype TestUserDataDto = {\n Base: BaseUserDataDto\n ValidUntil: DateTime\n}\n\ntype FullUserDto =\n | Admin of BaseUserDataDto\n | RegularUser of RegularUserDataDto\n | TestUser of TestUserDataDto\n\nlet getUserData user =\n match user with\n | Admin data -> data\n | RegularUser data -> data.Base\n | TestUser data -> data.Base\n\nlet getFirstName user = (getUserData user).FirstName\n\nlet getLastName user = (getUserData user).LastName\n\nlet getMail user = (getUserData user).Mail\n\nlet getLastLogin user = (getUserData user).LastLogin\n\nlet getPackages user =\n match user with\n | Admin _\n | TestUser _ -> []\n | RegularUser user -> user.Packages\n\n\nlet userTypeToString user =\n match user with\n | Admin _ -> \"Administrator\"\n | RegularUser _ -> \"Benutzer\"\n | TestUser _ -> \"Test-Benutzer\"\n\nlet getFullName user =\n sprintf \"%s %s\" (getLastName user) (getFirstName user)","namespace Shared.DtoTypes\n\nopen System\nopen Shared\n\n[]\nmodule AlertDto =\n type PurchasedAlertCount = { PurchasedAlertPackagesCount: int option }\n\n type PhoneNumber = string\n type MailAddress = string\n\n type ContactData =\n | Phone of string\n | Mail of string\n\n type ContactInfo = {\n Id: int\n Name: string\n Data: ContactData\n UserId: int\n }\n\n type NewContactInfo = {\n Name: string\n Data: ContactData\n UserId: int\n }\n\n let getContactInfoData info =\n match info with\n | Phone number -> number\n | Mail address -> address\n\n let contactInfoToString info =\n match info with\n | Phone number -> number\n | Mail mail -> mail\n\n let contactInfoTypeToString info =\n match info with\n | Phone _ -> \"Telefonnummer:\"\n | Mail _ -> \"E-Mail:\"\n\n type PhoneAlertType =\n | SMS\n | Call\n\n let phoneAlertTypeToString alertType =\n match alertType with\n | Call -> \"Anruf\"\n | SMS -> \"SMS\"\n\n type AlertedStateData = {\n Count: int\n Since: DateTimeOffset\n }\n\n type ReadyStateData = { Since: DateTimeOffset }\n\n type OutdatedStateData = {\n LastTemperature: DatedValue option\n Since: DateTimeOffset\n }\n\n type State =\n | Ready of ReadyStateData\n | Alerted of AlertedStateData\n | Outdated of OutdatedStateData\n\n let stateToString state =\n match state with\n | Ready _ -> \"Bereit\"\n | Alerted _ -> \"Alarmiert\"\n | Outdated _ -> \"Veraltete Daten\"\n\n let stateToCount state =\n match state with\n | Ready _\n | Outdated _ -> None\n | Alerted data -> Some data.Count\n\n let stateToSince state =\n match state with\n | Ready data -> data.Since\n | Alerted data -> data.Since\n | Outdated data -> data.Since\n\n type TemperatureType =\n | Wet\n | Dry\n\n let thresholdTypeToString thresholdType =\n match thresholdType with\n | Wet -> \"Feuchttemperatur\"\n | Dry -> \"Trockentemperatur\"\n\n type Alert = {\n Id: int\n ContactInfoId: int\n SensorId: int\n UserId: int\n TemperatureType: TemperatureType\n PhoneAlertType: PhoneAlertType\n Threshold: float\n ActiveUntil: DateTimeOffset\n }\n\n type NewAlert = {\n ContactInfoId: int\n SensorId: int\n UserId: int\n TemperatureType: TemperatureType\n PhoneAlertType: PhoneAlertType\n Threshold: float\n }\n\n type RunningAlert = {\n Alert: Alert\n LastTemperature: DatedValue option\n State: State\n }\n\n let runningAlertFromAlert (alert: Alert) : RunningAlert = {\n Alert = alert\n LastTemperature = None\n State = Ready { Since = DateTimeOffset.UtcNow }\n }","namespace Fable.Remoting.Client\n\nopen Fable.Core\nopen Fable.SimpleJson\nopen System\nopen Microsoft.FSharp.Reflection\nopen Fable.Remoting\n\nmodule Remoting =\n /// Starts with default configuration for building a proxy\n let createApi() = {\n CustomHeaders = [ ]\n BaseUrl = None\n Authorization = None\n WithCredentials = false\n RouteBuilder = sprintf (\"/%s/%s\")\n CustomResponseSerialization = None\n }\n\n /// Defines how routes are built using the type name and method name. By default, the generated routes are of the form `/typeName/methodName`.\n let withRouteBuilder builder (options: RemoteBuilderOptions) =\n { options with RouteBuilder = builder }\n\n /// Sets the base url for the request. Useful if you are making cross-domain requests\n let withBaseUrl url (options: RemoteBuilderOptions) =\n { options with BaseUrl = Some url }\n\n /// Adds custom headers to each request of the proxy\n let withCustomHeader headers (options: RemoteBuilderOptions) =\n { options with CustomHeaders = headers }\n\n /// Sets the authorization header of every request from the proxy\n let withAuthorizationHeader token (options: RemoteBuilderOptions) =\n { options with Authorization = Some token }\n\n /// Sets the withCredentials option on the XHR request, which is useful for CORS scenarios\n let withCredentials withCredentials (options: RemoteBuilderOptions) =\n { options with WithCredentials = withCredentials }\n\n /// Specifies that the API uses binary serialization for responses\n let withBinarySerialization (options: RemoteBuilderOptions) =\n let serializer response returnType = MsgPack.Read.Reader(response).Read returnType\n { options with CustomResponseSerialization = Some serializer }\n\ntype Remoting() =\n /// For internal library use only.\n static member buildProxy(options: RemoteBuilderOptions, resolvedType: Type) =\n let schemaType = createTypeInfo resolvedType\n match schemaType with\n | TypeInfo.Record getFields ->\n let (fields, recordType) = getFields()\n let fieldTypes = Reflection.FSharpType.GetRecordFields recordType |> Array.map (fun prop -> prop.Name, prop.PropertyType)\n let recordFields = [|\n for field in fields do\n let normalize n =\n let fieldType = fieldTypes |> Array.pick (fun (name, typ) -> if name = field.FieldName then Some typ else None)\n let fn = Proxy.proxyFetch options recordType.Name field fieldType\n match n with\n | 0 -> box (fn null null null null null null null null)\n | 1 -> box (fun a ->\n fn a null null null null null null null)\n | 2 ->\n let proxyF a b = fn a b null null null null null null\n unbox (System.Func<_,_,_> proxyF)\n | 3 ->\n let proxyF a b c = fn a b c null null null null null\n unbox (System.Func<_,_,_,_> proxyF)\n | 4 ->\n let proxyF a b c d = fn a b c d null null null null\n unbox (System.Func<_,_,_,_,_> proxyF)\n | 5 ->\n let proxyF a b c d e = fn a b c d e null null null\n unbox (System.Func<_,_,_,_,_,_> proxyF)\n | 6 ->\n let proxyF a b c d e f = fn a b c d e f null null\n unbox (System.Func<_,_,_,_,_,_,_> proxyF)\n | 7 ->\n let proxyF a b c d e f g = fn a b c d e f g null\n unbox (System.Func<_,_,_,_,_,_,_,_> proxyF)\n | 8 ->\n let proxyF a b c d e f g h = fn a b c d e f g h\n unbox (System.Func<_,_,_,_,_,_,_,_,_> proxyF)\n | _ ->\n failwithf \"Cannot generate proxy function for %s. Only up to 8 arguments are supported. Consider using a record type as input\" field.FieldName\n\n let argumentCount =\n match field.FieldType with\n | TypeInfo.Async _ -> 0\n | TypeInfo.Promise _ -> 0\n | TypeInfo.Func getArgs -> Array.length (getArgs()) - 1\n | _ -> 0\n\n normalize argumentCount\n |]\n\n let proxy = FSharpValue.MakeRecord(recordType, recordFields)\n unbox proxy\n | _ ->\n failwithf \"Cannot build proxy. Exepected type %s to be a valid protocol definition which is a record of functions\" resolvedType.FullName\n\n static member inline buildProxy<'t>(options: RemoteBuilderOptions) : 't =\n Remoting.buildProxy(options, typeof<'t>)\n","module Client.Infrastructure.Api\n\nopen Fable.Remoting.Client\nopen Shared\n\nlet api =\n Remoting.createApi ()\n |> Remoting.withRouteBuilder Route.builder\n |> Remoting.buildProxy","namespace Shared\n\nopen System\nopen Microsoft.FSharp.Control\nopen Microsoft.FSharp.Core\nopen Shared.Dto\nopen Shared.Dto.Dashboard\nopen Shared.Dto.Dto\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.MapSensorSettings\nopen Shared.Dto.Gateways\nopen Shared.Dto.MyMapSensors\nopen Shared.Dto.MySensGateway\nopen Shared.Dto.Page.UserList\nopen Shared.Dto.SensorGraphData\nopen Shared.Dto.User\nopen Shared\nopen Shared.Dto.Page\nopen Shared.Dto.Page.User\nopen Shared.DtoTypes\nopen Shared.DtoTypes.Page\nopen Shared.DtoTypes.PaginatedRequest\nopen Shared.DtoTypes.PhysicalSensor\nopen Shared.DtoTypes.RimPro\nopen Shared.WithLastDate\n\nmodule Route =\n let builder typeName methodName =\n sprintf \"/api/%s/%s\" typeName methodName\n\ntype MySenseApi = {\n getSession: SessionKey option -> Async\n\n getPublicSensors: Unit -> Async\n\n getSensors: SessionKey -> Async>\n\n login: LoginRequestData -> Async\n logout: SessionKey -> Async\n\n refreshTtnEndDevices: AuthenticatedRequest -> Async\n\n refreshTtiEndDevices: AuthenticatedRequest -> Async\n\n getAllTtnSensors: Unit -> Async\n\n getConfiguredTtnSensors: Unit -> Async\n\n createPhysicalSensor:\n AuthenticatedRequest -> Async>\n\n removePhysicalSensor: AuthenticatedRequest -> Async>\n\n updatePhysicalSensor:\n AuthenticatedRequest -> Async>\n\n getUnusedPhysicalSensors: AuthenticatedRequest -> Async>\n\n getAllMySensSensors: AuthenticatedRequest -> Async list>>\n\n getMySensSensor: int -> Async\n\n getSensorType: int -> Async\n\n getHistoricMapSensorData: SensorDataRequest -> Async\n\n getSensorDetailPageData: AuthenticatedRequest -> Async\n\n downloadMapSensorData: AuthenticatedRequest -> Async>\n\n getAllMySensSensorsWithOptionalLastDate: Unit -> Async> list>\n\n createMapSensor: AuthenticatedRequest -> Async option>>\n\n updateMapSensor:\n AuthenticatedRequest> -> Async option>>\n\n deleteMySensSensor: int -> Async\n\n updatePassword: AuthenticatedRequest -> Async\n\n getAllFullUsers: AuthenticatedRequest -> Async list>>\n\n getAllUsers: AuthenticatedRequest -> Async>\n\n createUser: FullUserDto -> Async\n\n updateUser: IdValue -> Async\n\n deleteUser: int -> Async\n\n addPackage: int * Package -> Async\n\n sendPasswordResetRequest: string -> Async\n\n getPasswordResetRequest: string -> Async\n\n resetPassword: string * string -> Async\n\n getAllGateways: AuthenticatedRequest -> Async list>>\n\n loadGatewayStatus: AuthenticatedRequest -> Async>\n\n refreshGatewaysFromTtn: Unit -> Async\n\n refreshGatewaysFromTti: Unit -> Async\n\n updateGateway: IdValue -> Async\n\n getLeafletWetnessConfiguration: Unit -> Async\n\n updateLeafletWetnessConfiguration: LeafletWetnessConfiguration -> Async\n\n getContactInfos: AuthenticatedRequest -> Async>\n\n getMyContactInfos: AuthenticatedRequest -> Async>\n\n createContactInfo: AuthenticatedRequest -> Async>\n\n updateContactInfo: AuthenticatedRequest -> Async>\n\n deleteContactInfo: AuthenticatedRequest -> Async>\n\n getMyAirTemperatureMapSensors:\n AuthenticatedRequest -> Async list>>\n\n getMyRainFallMapSensors: AuthenticatedRequest -> Async list>>\n getMyLeafletWetnessMapSensors:\n AuthenticatedRequest -> Async list>>\n\n getAlerts: AuthenticatedRequest -> Async>\n getMyAlerts: AuthenticatedRequest -> Async>\n createAlert: AuthenticatedRequest -> Async>\n deleteAlert: AuthenticatedRequest -> Async>\n\n buyAlertPackages: AuthenticatedRequest -> Async>\n\n getMyMapSensorsData: AuthenticatedRequest -> Async>\n\n getPurchasedAlertCounts: AuthenticatedRequest -> Async>\n\n getMapSensorSettings: AuthenticatedRequest -> Async>\n\n updateMapSensorSettings: AuthenticatedRequest -> Async>\n\n getMyMapSensors: AuthenticatedRequest -> Async>\n\n activateMapSensor: AuthenticatedRequest -> Async>\n\n disableMapSensor: AuthenticatedRequest -> Async>\n\n getAlertMessages:\n AuthenticatedRequest -> Async>\n\n getMyRimProStations: AuthenticatedRequest -> Async>\n\n deleteRimProStation: AuthenticatedRequest -> Async>\n\n createRimProStation: AuthenticatedRequest -> Async>\n\n getMyGateways: AuthenticatedRequest -> Async>\n\n getDashboard: AuthenticatedRequest -> Async>\n\n getScabStation: AuthenticatedRequest -> Async>\n getScabData: AuthenticatedRequest -> Async>\n\n getMyScabStations: AuthenticatedRequest -> Async>\n\n renameScabStation: AuthenticatedRequest -> Async>\n\n deleteScabStation: AuthenticatedRequest -> Async>\n\n getMyUserGroups: AuthenticatedRequest -> Async>\n\n getPeronosporaStation: AuthenticatedRequest -> Async>\n getPeronosporaData:\n AuthenticatedRequest -> Async>\n\n getMyPeronosporaStations:\n AuthenticatedRequest -> Async>\n\n renamePeronosporaStation:\n AuthenticatedRequest -> Async>\n\n deletePeronosporaStation:\n AuthenticatedRequest -> Async>\n\n getMyProfile: AuthenticatedRequest -> Async>\n\n getAllGroups: AuthenticatedRequest -> Async>\n\n createUserGroup:\n AuthenticatedRequest\n -> Async>\n\n deleteUserGroup: AuthenticatedRequest -> Async>\n}","module Client.Infrastructure.LocalStorage\n\nopen Thoth.Json\n\nlet load key : string option =\n Browser.WebStorage.localStorage.getItem key |> Option.ofObj\n\nlet delete key =\n Browser.WebStorage.localStorage.removeItem (key)\n\nlet save key (data: string) =\n Browser.WebStorage.localStorage.setItem (key, data)\n\nlet optionOfResult (result: Result<'a, 'b>) =\n match result with\n | Result.Ok data -> Some data\n | Result.Error _ -> None\n\nlet inline loadJson<'a> key : 'a option =\n load key |> Option.map Decode.Auto.fromString<'a> |> Option.bind optionOfResult\n\nlet inline saveJson key (data: 'a) =\n let encoded = Encode.Auto.toString (4, data)\n\n save key encoded","module Client.Session\n\nopen Client.Infrastructure\nopen Client.DomainTypes\nopen Shared\nopen Shared.Dto\nopen Elmish\nopen Client.Infrastructure.Api\nopen Shared.Dto.Dto\n\ntype ClientSession =\n | Pending\n | Session of Dto.Session\n\nlet private sessionIdKey = \"session-id\"\n\nlet loadClientSessionId () : string option = LocalStorage.load sessionIdKey\n\nlet storeClientSessionId (sessionId: string) =\n LocalStorage.save sessionIdKey sessionId\n\n\nlet initWithSession (onPending: 'a * Cmd<'b>) (clientSession: ClientSession) (f: Session -> 'a * Cmd<'b>) =\n match clientSession with\n | Session session -> f session\n | Pending -> onPending\n\nlet onlyForLoggedInSession (onAnonymous: Session -> 'a * Cmd<'b>) (f: UserSession -> 'a * Cmd<'b>) (session: Session) =\n match session with\n | Anonymous -> onAnonymous session\n | UserSession userSession -> f userSession\n\nlet getUserFromClientSession (clientSession: ClientSession) =\n match clientSession with\n | Pending\n | Session Anonymous -> None\n | Session(UserSession userSession) -> Some userSession.User\n\nlet getUserFromSession (session: Session) =\n match session with\n | Anonymous -> None\n | UserSession userSession -> Some userSession.User\n\n\nlet runLogout session =\n match session with\n | Anonymous -> Cmd.none\n | UserSession userSession -> Cmd.OfAsync.perform api.logout userSession.SessionKey (fun _ -> Msg.LoggedOut)","module Client.Page.PendingSession\n\nopen Fable.React\nopen Client.DomainTypes\n\ntype ErrorData = {\n StatusCode: int\n Message: string\n}\n\ntype LoadingData = Route\n\ntype Model =\n | Loading of Route\n | Error of ErrorData\n\n\nlet init route = Loading route\n\n\nlet errorOccured code message =\n Error {\n StatusCode = code\n Message = message\n }\n\nlet view (model: Model) =\n match model with\n | Loading _ -> h1 [] [ str \"Waiting for session\" ]\n | Error error -> h1 [] [ str \"Sadly an error occured\" ]","import { compare } from \"./Util.js\";\nimport { unfold, delay } from \"./Seq.js\";\nimport { op_Addition, fromZero } from \"./BigInt.js\";\nimport { op_Addition as op_Addition_1, fromParts } from \"./Decimal.js\";\nimport { op_Addition as op_Addition_2, fromBits } from \"./Long.js\";\n\nexport function makeRangeStepFunction(step, stop, zero, add) {\n const stepComparedWithZero = compare(step, zero) | 0;\n if (stepComparedWithZero === 0) {\n throw (new Error(\"The step of a range cannot be zero\"));\n }\n const stepGreaterThanZero = stepComparedWithZero > 0;\n return (x) => {\n const comparedWithLast = compare(x, stop) | 0;\n return ((stepGreaterThanZero && (comparedWithLast <= 0)) ? true : ((!stepGreaterThanZero) && (comparedWithLast >= 0))) ? [x, add(x, step)] : (void 0);\n };\n}\n\nexport function integralRangeStep(start, step, stop, zero, add) {\n const stepFn = makeRangeStepFunction(step, stop, zero, add);\n return delay(() => unfold(stepFn, start));\n}\n\nexport function rangeBigInt(start, step, stop) {\n return integralRangeStep(start, step, stop, fromZero(), op_Addition);\n}\n\nexport function rangeDecimal(start, step, stop) {\n return integralRangeStep(start, step, stop, fromParts(0, 0, 0, false, 0), op_Addition_1);\n}\n\nexport function rangeDouble(start, step, stop) {\n return integralRangeStep(start, step, stop, 0, (x, y) => (x + y));\n}\n\nexport function rangeInt64(start, step, stop) {\n return integralRangeStep(start, step, stop, fromBits(0, 0, false), op_Addition_2);\n}\n\nexport function rangeUInt64(start, step, stop) {\n return integralRangeStep(start, step, stop, fromBits(0, 0, true), op_Addition_2);\n}\n\nexport function rangeChar(start, stop) {\n const intStop = stop.charCodeAt(0) | 0;\n return delay(() => unfold((c) => {\n if (c <= intStop) {\n return [String.fromCharCode(c), c + 1];\n }\n else {\n return void 0;\n }\n }, start.charCodeAt(0)));\n}\n\n","namespace Elmish\nopen System\n\n[]\ntype internal RingState<'item> =\n | Writable of wx:'item array * ix:int\n | ReadWritable of rw:'item array * wix:int * rix:int\n\ntype internal RingBuffer<'item>(size) =\n let doubleSize ix (items: 'item array) =\n seq { yield! items |> Seq.skip ix\n yield! items |> Seq.take ix\n for _ in 0..items.Length do\n yield Unchecked.defaultof<'item> }\n |> Array.ofSeq\n\n let mutable state : 'item RingState =\n Writable (Array.zeroCreate (max size 10), 0)\n\n member __.Pop() =\n match state with\n | ReadWritable (items, wix, rix) ->\n let rix' = (rix + 1) % items.Length\n match rix' = wix with\n | true -> \n state <- Writable(items, wix)\n | _ ->\n state <- ReadWritable(items, wix, rix')\n Some items.[rix]\n | _ ->\n None\n\n member __.Push (item:'item) =\n match state with\n | Writable (items, ix) ->\n items.[ix] <- item\n let wix = (ix + 1) % items.Length\n state <- ReadWritable(items, wix, ix)\n | ReadWritable (items, wix, rix) ->\n items.[wix] <- item\n let wix' = (wix + 1) % items.Length\n match wix' = rix with\n | true -> \n state <- ReadWritable(items |> doubleSize rix, items.Length, 0)\n | _ -> \n state <- ReadWritable(items, wix', rix)","(**\nProgram\n---------\nCore abstractions for creating and running the dispatch loop.\n\n*)\n\nnamespace Elmish\n\n\n/// Program type captures various aspects of program behavior\ntype Program<'arg, 'model, 'msg, 'view> = private {\n init : 'arg -> 'model * Cmd<'msg>\n update : 'msg -> 'model -> 'model * Cmd<'msg>\n subscribe : 'model -> Cmd<'msg>\n view : 'model -> Dispatch<'msg> -> 'view\n setState : 'model -> Dispatch<'msg> -> unit\n onError : (string*exn) -> unit\n syncDispatch: Dispatch<'msg> -> Dispatch<'msg>\n}\n\n/// Program module - functions to manipulate program instances\n[]\n[]\nmodule Program =\n /// Typical program, new commands are produced by `init` and `update` along with the new state.\n let mkProgram \n (init : 'arg -> 'model * Cmd<'msg>) \n (update : 'msg -> 'model -> 'model * Cmd<'msg>)\n (view : 'model -> Dispatch<'msg> -> 'view) =\n { init = init\n update = update\n view = view\n setState = fun model -> view model >> ignore\n subscribe = fun _ -> Cmd.none\n onError = Log.onError\n syncDispatch = id }\n\n /// Simple program that produces only new state with `init` and `update`.\n let mkSimple \n (init : 'arg -> 'model) \n (update : 'msg -> 'model -> 'model)\n (view : 'model -> Dispatch<'msg> -> 'view) =\n { init = init >> fun state -> state,Cmd.none\n update = fun msg -> update msg >> fun state -> state,Cmd.none\n view = view\n setState = fun model -> view model >> ignore\n subscribe = fun _ -> Cmd.none\n onError = Log.onError\n syncDispatch = id }\n\n /// Subscribe to external source of events.\n /// The subscription is called once - with the initial model, but can dispatch new messages at any time.\n let withSubscription (subscribe : 'model -> Cmd<'msg>) (program: Program<'arg, 'model, 'msg, 'view>) =\n let sub model =\n Cmd.batch [ program.subscribe model\n subscribe model ]\n { program with subscribe = sub }\n\n /// Trace all the updates to the console\n let withConsoleTrace (program: Program<'arg, 'model, 'msg, 'view>) =\n let traceInit (arg:'arg) =\n let initModel,cmd = program.init arg\n Log.toConsole (\"Initial state:\", initModel)\n initModel,cmd\n\n let traceUpdate msg model =\n Log.toConsole (\"New message:\", msg)\n let newModel,cmd = program.update msg model\n Log.toConsole (\"Updated state:\", newModel)\n newModel,cmd\n\n { program with\n init = traceInit \n update = traceUpdate }\n\n /// Trace all the messages as they update the model\n let withTrace trace (program: Program<'arg, 'model, 'msg, 'view>) =\n let update msg model =\n let state,cmd = program.update msg model\n trace msg state\n state,cmd\n { program\n with update = update }\n\n /// Handle dispatch loop exceptions\n let withErrorHandler onError (program: Program<'arg, 'model, 'msg, 'view>) =\n { program\n with onError = onError }\n\n /// For library authors only: map existing error handler and return new `Program` \n let mapErrorHandler map (program: Program<'arg, 'model, 'msg, 'view>) =\n { program\n with onError = map program.onError }\n\n /// For library authors only: get the current error handler \n let onError (program: Program<'arg, 'model, 'msg, 'view>) =\n program.onError\n\n /// For library authors only: function to render the view with the latest state \n let withSetState (setState:'model -> Dispatch<'msg> -> unit)\n (program: Program<'arg, 'model, 'msg, 'view>) = \n { program\n with setState = setState }\n\n /// For library authors only: return the function to render the state \n let setState (program: Program<'arg, 'model, 'msg, 'view>) = \n program.setState\n\n /// For library authors only: return the view function \n let view (program: Program<'arg, 'model, 'msg, 'view>) = \n program.view\n\n /// For library authors only: function to synchronize the dispatch function\n let withSyncDispatch (syncDispatch:Dispatch<'msg> -> Dispatch<'msg>)\n (program: Program<'arg, 'model, 'msg, 'view>) = \n { program\n with syncDispatch = syncDispatch }\n\n /// For library authors only: map the program type\n let map mapInit mapUpdate mapView mapSetState mapSubscribe\n (program: Program<'arg, 'model, 'msg, 'view>) =\n { init = mapInit program.init\n update = mapUpdate program.update\n view = mapView program.view\n setState = mapSetState program.setState\n subscribe = mapSubscribe program.subscribe\n onError = program.onError\n syncDispatch = id }\n\n /// Start the program loop.\n /// arg: argument to pass to the init() function.\n /// program: program created with 'mkSimple' or 'mkProgram'.\n let runWith (arg: 'arg) (program: Program<'arg, 'model, 'msg, 'view>) =\n let (model,cmd) = program.init arg\n let rb = RingBuffer 10\n let mutable reentered = false\n let mutable state = model \n let rec dispatch msg = \n if reentered then\n rb.Push msg\n else\n reentered <- true\n let mutable nextMsg = Some msg\n while Option.isSome nextMsg do\n let msg = nextMsg.Value\n try\n let (model',cmd') = program.update msg state\n program.setState model' syncDispatch\n cmd' |> Cmd.exec (fun ex -> program.onError (sprintf \"Error in command while handling: %A\" msg, ex)) syncDispatch\n state <- model'\n with ex ->\n program.onError (sprintf \"Unable to process the message: %A\" msg, ex)\n nextMsg <- rb.Pop()\n reentered <- false\n and syncDispatch = program.syncDispatch dispatch \n\n program.setState model syncDispatch\n let sub = \n try \n program.subscribe model \n with ex ->\n program.onError (\"Unable to subscribe:\", ex)\n Cmd.none\n Cmd.batch [sub; cmd]\n |> Cmd.exec (fun ex -> program.onError (\"Error intitializing:\", ex)) syncDispatch\n\n /// Start the dispatch loop with `unit` for the init() function.\n let run (program: Program) = runWith () program\n","namespace Thoth.Elmish\r\n\r\nmodule Toast =\r\n\r\n open System\r\n open Fable.React\r\n open Fable.React.Props\r\n open Fable.Core.JsInterop\r\n open Browser\r\n open Browser.Types\r\n open Elmish\r\n\r\n []\r\n let private hotModule = obj()\r\n\r\n importSideEffects \"./css/toast-base.css\"\r\n importSideEffects \"./css/toast-minimal.css\"\r\n\r\n []\r\n let private EVENT_IDENTIFIER = \"thoth_elmish_toast_notify_event\"\r\n\r\n type Status =\r\n | Success\r\n | Warning\r\n | Error\r\n | Info\r\n\r\n type Position =\r\n | BottomRight\r\n | BottomLeft\r\n | BottomCenter\r\n | TopRight\r\n | TopLeft\r\n | TopCenter\r\n\r\n type Builder<'icon, 'msg> =\r\n {\r\n Message : string\r\n Title : string option\r\n Icon : 'icon option\r\n Position : Position\r\n Delay : TimeSpan option\r\n DismissOnClick : bool\r\n WithCloseButton : bool\r\n }\r\n\r\n static member Empty () =\r\n {\r\n Message = \"\"\r\n Title = None\r\n Icon = None\r\n Delay = Some (TimeSpan.FromSeconds 3.)\r\n Position = BottomLeft\r\n DismissOnClick = false\r\n WithCloseButton = false\r\n }\r\n\r\n type Toast<'icon> =\r\n {\r\n Guid : Guid\r\n Message : string\r\n Title : string option\r\n Icon : 'icon option\r\n Position : Position\r\n Delay : TimeSpan option\r\n Status : Status\r\n DismissOnClick : bool\r\n WithCloseButton : bool\r\n }\r\n\r\n /// \r\n /// Create a toast and set the message content\r\n /// \r\n /// Message to display in the toast\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let message msg : Builder<'icon, 'msg> =\r\n { Builder<'icon, 'msg>.Empty()\r\n with Message = msg\r\n }\r\n\r\n /// \r\n /// Set the title content\r\n /// \r\n /// Title to display in the toast\r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let title title (builder : Builder<'icon, 'msg>) : Builder<'icon, 'msg> =\r\n { builder with\r\n Title = Some title\r\n }\r\n\r\n /// \r\n /// Set the position\r\n /// \r\n /// Position where the toast will be positionned\r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let position pos (builder : Builder<'icon, 'msg>) : Builder<'icon, 'msg> =\r\n { builder with\r\n Position = pos\r\n }\r\n\r\n /// \r\n /// Set the icon\r\n /// \r\n /// Icon which will be shown in the icon section of the toast\r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let icon icon (builder : Builder<'icon, 'msg>) : Builder<'icon, 'msg> =\r\n { builder with\r\n Icon = Some icon\r\n }\r\n\r\n /// \r\n /// Set the timeout in seconds\r\n /// \r\n /// Dely in second after which the toast will be removed\r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let timeout delay (builder : Builder<'icon, 'msg>) : Builder<'icon, 'msg> =\r\n { builder with\r\n Delay = Some delay\r\n }\r\n\r\n /// \r\n /// No timeout, make sure to add close button or dismiss on click\r\n /// \r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let noTimeout (builder : Builder<'icon, 'msg>) : Builder<'icon, 'msg> =\r\n { builder with\r\n Delay = None\r\n }\r\n\r\n /// \r\n /// Allow user to dismiss the toast by cliking on it\r\n /// \r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let dismissOnClick (builder : Builder<'icon, 'msg>) : Builder<'icon, 'msg> =\r\n { builder with\r\n DismissOnClick = true\r\n }\r\n\r\n /// \r\n /// Add a close button\r\n /// \r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let withCloseButton (builder : Builder<'icon, 'msg>) : Builder<'icon, 'msg> =\r\n { builder with\r\n WithCloseButton = true\r\n }\r\n\r\n let private triggerEvent (builder : Builder<'icon, 'msg>) status dispatch =\r\n let detail =\r\n jsOptions(fun o ->\r\n o.detail <-\r\n {\r\n Guid = Guid.NewGuid()\r\n Message = builder.Message\r\n Title = builder.Title\r\n Icon = builder.Icon\r\n Position = builder.Position\r\n Delay = builder.Delay\r\n Status = status\r\n DismissOnClick = builder.DismissOnClick\r\n WithCloseButton = builder.WithCloseButton\r\n }\r\n )\r\n\r\n let event = CustomEvent.Create(EVENT_IDENTIFIER, detail)\r\n\r\n window.dispatchEvent(event)\r\n |> ignore\r\n\r\n\r\n /// \r\n /// Send the toast marked with Success status\r\n /// \r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let success (builder : Builder<'icon, 'msg>) : Cmd<'msg> =\r\n [\r\n fun dispatch ->\r\n triggerEvent builder Success dispatch\r\n ]\r\n\r\n\r\n /// \r\n /// Send the toast marked with Warning status\r\n /// \r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let warning (builder : Builder<'icon, 'msg>) : Cmd<'msg> =\r\n [\r\n fun dispatch ->\r\n triggerEvent builder Warning dispatch\r\n ]\r\n\r\n /// \r\n /// Send the toast marked with Error status\r\n /// \r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let error (builder : Builder<'icon, 'msg>) : Cmd<'msg> =\r\n [\r\n fun dispatch ->\r\n triggerEvent builder Error dispatch\r\n ]\r\n\r\n /// \r\n /// Send the toast marked with Info status\r\n /// \r\n /// Toast builder to which we want to apply the function\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The message type associated with this Toast builder\r\n /// \r\n let info (builder : Builder<'icon, 'msg>) : Cmd<'msg> =\r\n [\r\n fun dispatch ->\r\n triggerEvent builder Info dispatch\r\n ]\r\n\r\n /// \r\n /// Interface used to customize the view\r\n /// \r\n type IRenderer<'icon> =\r\n\r\n /// \r\n /// Render the outer element of the toast\r\n /// \r\n /// This is the content of the toast\r\n /// Class used to set the toast color\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// \r\n abstract Toast : content : ReactElement list -> color : string -> ReactElement\r\n\r\n /// \r\n /// Render the close button of the toast\r\n /// \r\n /// Event listener to attached\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// \r\n abstract CloseButton : onClick : (MouseEvent -> unit) -> ReactElement\r\n\r\n /// \r\n /// Render the title of the toast\r\n /// \r\n /// Text to display\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// \r\n abstract Title : text : string -> ReactElement\r\n\r\n /// \r\n /// Render the message of the toast\r\n /// \r\n /// Text to display\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// \r\n abstract Message : text : string -> ReactElement\r\n\r\n\r\n /// \r\n /// Render the icon part\r\n /// \r\n /// Icon to use\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// \r\n abstract Icon : icon : 'icon -> ReactElement\r\n\r\n /// \r\n /// Render the simple layout (when no icon has been provided to the Toast)\r\n /// \r\n /// React element representing the tile part of the toast\r\n /// React element representing the message part of the toast\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// \r\n abstract SingleLayout :\r\n titleElement : ReactElement ->\r\n messageElement : ReactElement ->\r\n ReactElement\r\n\r\n\r\n /// \r\n /// Render the splitted layout (when toast has an Icon and Message)\r\n /// \r\n /// React element representing the icon part of the toast\r\n /// React element representing the tile part of the toast\r\n /// React element representing the message part of the toast\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// \r\n abstract SplittedLayout :\r\n iconElement : ReactElement ->\r\n titleElement : ReactElement ->\r\n messageElement : ReactElement ->\r\n ReactElement\r\n\r\n /// \r\n /// Obtain the class associated with the Status\r\n /// \r\n /// Status value to convert\r\n /// The type of Icon used. For example, for FontAwesome you could use Icons represent using CSS string class or types icons using Fa.I.FontAwesomeIcons\r\n /// The CSS class associated with the Status\r\n abstract StatusToColor : status : Status -> string\r\n\r\n []\r\n module Program =\r\n\r\n type Notifiable<'icon, 'msg> =\r\n | Add of Toast<'icon>\r\n | Remove of Toast<'icon>\r\n | UserMsg of 'msg\r\n | OnError of exn\r\n\r\n type Model<'icon, 'model> =\r\n {\r\n UserModel : 'model\r\n Toasts_BL : Toast<'icon> list\r\n Toasts_BC : Toast<'icon> list\r\n Toasts_BR : Toast<'icon> list\r\n Toasts_TL : Toast<'icon> list\r\n Toasts_TC : Toast<'icon> list\r\n Toasts_TR : Toast<'icon> list\r\n }\r\n\r\n let inline private removeToast guid =\r\n List.filter (fun item -> item.Guid <> guid )\r\n\r\n let private viewToastWrapper (classPosition : string) (render : IRenderer<_>) (toasts : Toast<_> list) dispatch =\r\n div [ Class (\"toast-wrapper \" + classPosition) ]\r\n ( toasts\r\n |> List.map (fun n ->\r\n let title =\r\n Option.map\r\n render.Title\r\n n.Title\r\n\r\n let dismissOnClick =\r\n if n.DismissOnClick then\r\n \"dismiss-on-click\"\r\n else\r\n \"\"\r\n\r\n let containerClass =\r\n String.concat \" \" [ \"toast-container\"\r\n dismissOnClick\r\n render.StatusToColor n.Status ]\r\n let closeButton =\r\n match n.WithCloseButton with\r\n | true ->\r\n render.CloseButton (fun _ -> dispatch (Remove n))\r\n |> Some\r\n | false -> None\r\n |> ofOption\r\n\r\n let layout =\r\n match n.Icon with\r\n | Some icon ->\r\n render.SplittedLayout\r\n (render.Icon icon)\r\n (ofOption title)\r\n (render.Message n.Message)\r\n | None ->\r\n render.SingleLayout\r\n (ofOption title)\r\n (render.Message n.Message)\r\n\r\n div [ yield ClassName containerClass :> IHTMLProp\r\n if n.DismissOnClick then\r\n yield OnClick (fun _ -> dispatch (Remove n)) :> IHTMLProp ]\r\n [ render.Toast\r\n [ closeButton\r\n layout\r\n ]\r\n (render.StatusToColor n.Status) ]\r\n ) )\r\n\r\n\r\n let private view (render : IRenderer<_>) (model : Model<_, _>) dispatch =\r\n div [ Class \"elmish-toast\" ]\r\n [ viewToastWrapper \"toast-wrapper-bottom-left\" render model.Toasts_BL dispatch\r\n viewToastWrapper \"toast-wrapper-bottom-center\" render model.Toasts_BC dispatch\r\n viewToastWrapper \"toast-wrapper-bottom-right\" render model.Toasts_BR dispatch\r\n viewToastWrapper \"toast-wrapper-top-left\" render model.Toasts_TL dispatch\r\n viewToastWrapper \"toast-wrapper-top-center\" render model.Toasts_TC dispatch\r\n viewToastWrapper \"toast-wrapper-top-right\" render model.Toasts_TR dispatch ]\r\n\r\n\r\n let private delayedCmd (notification : Toast<'icon>) =\r\n match notification.Delay with\r\n | Some delay ->\r\n promise {\r\n do! Promise.sleep (int delay.TotalMilliseconds)\r\n return notification\r\n }\r\n | None -> failwith \"No delay attached to notification can't delayed it. `delayedCmd` should not have been called by the program\"\r\n\r\n let withToast (renderer : IRenderer<'icon>) (program : Elmish.Program<'arg, 'model, 'msg, 'view >) =\r\n\r\n let mapUpdate update msg model =\r\n let newModel,cmd =\r\n match msg with\r\n | UserMsg msg ->\r\n let newModel, cmd = update msg model.UserModel\r\n { model with UserModel = newModel }, Cmd.map UserMsg cmd\r\n\r\n | Add newToast ->\r\n let cmd : Cmd>=\r\n match newToast.Delay with\r\n | Some _ -> Cmd.OfPromise.either delayedCmd newToast Remove !!OnError // TODO: Fix elmish\r\n | None -> Cmd.none\r\n\r\n match newToast.Position with\r\n | BottomLeft -> { model with Toasts_BL = newToast::model.Toasts_BL }, cmd\r\n | BottomCenter -> { model with Toasts_BC = newToast::model.Toasts_BC }, cmd\r\n | BottomRight -> { model with Toasts_BR = newToast::model.Toasts_BR }, cmd\r\n | TopLeft -> { model with Toasts_TL = newToast::model.Toasts_TL }, cmd\r\n | TopCenter -> { model with Toasts_TC = newToast::model.Toasts_TC }, cmd\r\n | TopRight -> { model with Toasts_TR = newToast::model.Toasts_TR }, cmd\r\n\r\n | Remove toast ->\r\n match toast.Position with\r\n | BottomLeft -> { model with Toasts_BL = removeToast toast.Guid model.Toasts_BL }, Cmd.none\r\n | BottomCenter -> { model with Toasts_BC = removeToast toast.Guid model.Toasts_BC }, Cmd.none\r\n | BottomRight -> { model with Toasts_BR = removeToast toast.Guid model.Toasts_BR }, Cmd.none\r\n | TopLeft -> { model with Toasts_TL = removeToast toast.Guid model.Toasts_TL }, Cmd.none\r\n | TopCenter -> { model with Toasts_TC = removeToast toast.Guid model.Toasts_TC }, Cmd.none\r\n | TopRight -> { model with Toasts_TR = removeToast toast.Guid model.Toasts_TR }, Cmd.none\r\n\r\n\r\n | OnError error ->\r\n console.error error.Message\r\n model, Cmd.none\r\n\r\n newModel, cmd\r\n\r\n let createModel (model, cmd) =\r\n {\r\n UserModel = model\r\n Toasts_BL = []\r\n Toasts_BC = []\r\n Toasts_BR = []\r\n Toasts_TL = []\r\n Toasts_TC = []\r\n Toasts_TR = []\r\n }\r\n , cmd\r\n\r\n let notificationEvent (dispatch : Elmish.Dispatch>) =\r\n // If HMR support is active, then we provide have a custom implementation.\r\n // This is needed to avoid:\r\n // - flickering (trigger several react renderer process)\r\n // - attaching several event listener to the same event\r\n #if DEBUG\r\n if not (isNull hotModule) then\r\n if hotModule?status() <> \"idle\" then\r\n window.removeEventListener(EVENT_IDENTIFIER, !!window?(EVENT_IDENTIFIER))\r\n\r\n window?(EVENT_IDENTIFIER) <- fun (ev : Event) ->\r\n let ev = ev :?> CustomEvent\r\n dispatch (Add (unbox ev.detail))\r\n\r\n window.addEventListener(EVENT_IDENTIFIER, !!window?(EVENT_IDENTIFIER))\r\n else\r\n #endif\r\n window.addEventListener(EVENT_IDENTIFIER, fun ev ->\r\n let ev = ev :?> CustomEvent\r\n dispatch (Add (unbox ev.detail))\r\n )\r\n\r\n let mapInit init =\r\n init >> (fun (model, cmd) ->\r\n model, cmd |> Cmd.map UserMsg) >> createModel\r\n\r\n let mapSubscribe subscribe model =\r\n Cmd.batch [ [ notificationEvent ]\r\n subscribe model.UserModel |> Cmd.map UserMsg ]\r\n\r\n let mapView view' model dispatch =\r\n fragment [ ]\r\n [ view renderer model dispatch\r\n view' model.UserModel (UserMsg >> dispatch) ]\r\n\r\n let mapSetState setState model dispatch =\r\n setState model.UserModel (UserMsg >> dispatch)\r\n\r\n Program.map mapInit mapUpdate mapView mapSetState mapSubscribe program\r\n\r\n /// \r\n /// Default implementation for the Toast renderer.\r\n ///\r\n /// you are encourage to write your own implementation to match your application style\r\n /// \r\n /// \r\n let render =\r\n { new IRenderer with\r\n\r\n member __.Toast children _ =\r\n div [ Class \"toast\" ]\r\n children\r\n\r\n member __.CloseButton onClick =\r\n span [ Class \"close-button\"\r\n OnClick onClick ]\r\n [ ]\r\n\r\n member __.Title txt =\r\n span [ Class \"toast-title\" ]\r\n [ str txt ]\r\n\r\n member __.Icon (icon : string) =\r\n div [ Class \"toast-layout-icon\" ]\r\n [ i [ Class (\"fa fa-2x \" + icon) ]\r\n [ ] ]\r\n\r\n member __.SingleLayout title message =\r\n div [ Class \"toast-layout-content\" ]\r\n [ title; message ]\r\n\r\n member __.Message txt =\r\n span [ Class \"toast-message\" ]\r\n [ str txt ]\r\n\r\n member __.SplittedLayout iconView title message =\r\n div [ Style [ Display DisplayOptions.Flex\r\n Width \"100%\" ] ]\r\n [ iconView\r\n div [ Class \"toast-layout-content\" ]\r\n [ title\r\n message ] ]\r\n\r\n member __.StatusToColor status =\r\n match status with\r\n | Status.Success -> \"is-success\"\r\n | Status.Warning -> \"is-warning\"\r\n | Status.Error -> \"is-error\"\r\n | Status.Info -> \"is-info\"\r\n }\r\n","\r\n[]\r\nmodule Promise\r\n\r\n#nowarn \"1182\" // Unused values\r\n\r\nopen System\r\nopen Fable.Core\r\nopen Fable.Core.JsInterop\r\n\r\n[]\r\n/// The promise function receives two other function parameters: success and fail\r\nlet create (f: ('T -> unit) -> (exn -> unit) -> unit): JS.Promise<'T> = jsNative\r\n\r\n[ setTimeout(resolve, $0))\")>]\r\nlet sleep (ms: int): JS.Promise = jsNative\r\n\r\n[]\r\nlet lift<'T> (a: 'T): JS.Promise<'T> = jsNative\r\n\r\n[]\r\n/// Creates promise (in rejected state) with supplied reason.\r\nlet reject<'T> (reason: exn) : JS.Promise<'T> = jsNative\r\n\r\n[]\r\nlet bind (a: 'T1 -> JS.Promise<'T2>) (pr: JS.Promise<'T1>): JS.Promise<'T2> = jsNative\r\n\r\n[]\r\nlet map (a: 'T1 -> 'T2) (pr: JS.Promise<'T1>): JS.Promise<'T2> = jsNative\r\n\r\n[]\r\nlet iter (a: 'T -> unit) (pr: JS.Promise<'T>): unit = jsNative\r\n\r\nlet tap (fn: 'T -> unit) (a: JS.Promise<'T>): JS.Promise<'T> =\r\n a |> map (fun x -> fn x; x)\r\n\r\n[]\r\n/// This version of `catch` expects a function returning just `'T`, as opposed to `Promise<'T>`. If you need to return `Promise<'T>`, use `catchBind`.\r\nlet catch (fail: exn -> 'T) (pr: JS.Promise<'T>): JS.Promise<'T> = jsNative\r\n\r\n[]\r\n/// This version of `catch` expects a function returning `Promise<'T>` as opposed to just `'T`. If you need to return just 'T, use `catch`.\r\nlet catchBind (fail: exn -> JS.Promise<'T>) (pr: JS.Promise<'T>): JS.Promise<'T> = jsNative\r\n\r\n[]\r\n/// Used to catch errors at the end of a promise chain.\r\nlet catchEnd (fail: exn -> unit) (pr: JS.Promise<'T>): unit = jsNative\r\n\r\n[]\r\n/// A combination of `map` and `catch`, this function applies the `success` continuation when the input promise resolves successfully, or `fail` continuation when the input promise fails.\r\nlet either (success: 'T1 -> 'T2) (fail: exn -> 'T2) (pr: JS.Promise<'T1>): JS.Promise<'T2> = jsNative\r\n\r\n[]\r\n/// A combination of `bind` and `catchBind`, this function applies the `success` continuation when the input promise resolves successfully, or `fail` continuation when the input promise fails.\r\nlet eitherBind (success: 'T1 -> JS.Promise<'T2>) (fail: exn -> JS.Promise<'T2>) (pr: JS.Promise<'T1>): JS.Promise<'T2> = jsNative\r\n\r\n[]\r\nlet eitherEnd (success: 'T -> unit) (fail: exn -> unit) (pr: JS.Promise<'T>): unit = jsNative\r\n\r\n[]\r\nlet start (pr: JS.Promise<'T>): unit = jsNative\r\n\r\n[]\r\nlet tryStart (fail: exn -> unit) (pr: JS.Promise<'T>): unit = jsNative\r\n\r\n[]\r\nlet Parallel (pr: seq>): JS.Promise<'T[]> = jsNative\r\n\r\n[]\r\nlet all (pr: seq>): JS.Promise<'T[]> = jsNative\r\n\r\nlet result (a: JS.Promise<'T>): JS.Promise> =\r\n either Ok Error a\r\n\r\nlet mapResult (fn: 'T1 -> 'T2) (a: JS.Promise>): JS.Promise> =\r\n a |> map (Result.map fn)\r\n\r\nlet bindResult (fn: 'T1 -> JS.Promise<'T2>) (a: JS.Promise>): JS.Promise> =\r\n a |> bind (fun a ->\r\n match a with\r\n | Ok a ->\r\n fn a |> map Ok\r\n | Error e ->\r\n lift (Error e))\r\n\r\nlet mapResultError (fn: 'E1 -> 'E2) (a: JS.Promise>): JS.Promise> =\r\n a |> map (Result.mapError fn)\r\n\r\ntype PromiseBuilder() =\r\n []\r\n member _.Bind(p: JS.Promise<'T1>, f: 'T1 -> JS.Promise<'T2>): JS.Promise<'T2> = jsNative\r\n\r\n [ $2)\")>]\r\n member _.Combine(p1: JS.Promise, p2: JS.Promise<'T>): JS.Promise<'T> = jsNative\r\n\r\n member _.For(seq: seq<'T>, body: 'T -> JS.Promise): JS.Promise =\r\n // (lift (), seq)\r\n // ||> Seq.fold (fun p a ->\r\n // bind (fun () -> body a) p)\r\n let mutable p = lift ()\r\n for a in seq do\r\n p <- p |> bind (fun () -> body a)\r\n p\r\n\r\n []\r\n member _.For(p: JS.Promise<'T1>, f: 'T1 -> JS.Promise<'T2>): JS.Promise<'T2> = jsNative\r\n\r\n member this.While(guard: unit -> bool, p: JS.Promise): JS.Promise =\r\n if guard()\r\n then bind (fun () -> this.While(guard, p)) p\r\n else lift()\r\n\r\n []\r\n member _.Return(a: 'T): JS.Promise<'T> = jsNative\r\n\r\n []\r\n member _.ReturnFrom(p: JS.Promise<'T>): JS.Promise<'T> = jsNative\r\n\r\n []\r\n member _.Zero(): JS.Promise = jsNative\r\n\r\n member _.TryFinally(p: JS.Promise<'T>, compensation: unit -> unit): JS.Promise<'T> =\r\n either (fun (x: 'T) -> compensation(); x) (fun er -> compensation(); raise er) p\r\n\r\n []\r\n member _.TryWith(p: JS.Promise<'T>, catchHandler: exn -> JS.Promise<'T>): JS.Promise<'T> = jsNative\r\n\r\n // Delay must generate a cold promise-like object that re-runs every time it's called,\r\n // so we cannot use the JS Promise constructor which is stateful\r\n member _.Delay(generator: unit -> JS.Promise<'T>): JS.Promise<'T> =\r\n !!createObj[\r\n \"then\" ==> fun onSuccess onError ->\r\n try generator().``then``(onSuccess, onError)\r\n with er ->\r\n if isNull(box onError) then reject er\r\n else\r\n try onError er |> lift\r\n with er -> reject er\r\n \"catch\" ==> fun onError ->\r\n try generator().catch(onError)\r\n with er ->\r\n try onError er |> lift\r\n with er -> reject er\r\n ]\r\n\r\n // Make sure we call `then` because this may be used with \"cold\" fake promises generated by Delay\r\n member _.Run(p:JS.Promise<'T>): JS.Promise<'T> = p.``then``(id)\r\n\r\n member this.Using<'T1, 'T2 when 'T1 :> IDisposable>(resource: 'T1, binder: 'T1 -> JS.Promise<'T2>): JS.Promise<'T2> =\r\n this.TryFinally(binder(resource), fun () -> resource.Dispose())\r\n\r\n []\r\n member _.MergeSources(a: JS.Promise<'T1>, b: JS.Promise<'T2>): JS.Promise<'T1 * 'T2> = jsNative\r\n\r\n []\r\n member _.MergeSources3(a: JS.Promise<'T1>, b: JS.Promise<'T2>, c: JS.Promise<'T3>): JS.Promise<'T1 * 'T2 * 'T3> = jsNative\r\n\r\n []\r\n member _.MergeSources4(a: JS.Promise<'T1>, b: JS.Promise<'T2>, c: JS.Promise<'T3>, d: JS.Promise<'T4>): JS.Promise<'T1 * 'T2 * 'T3 * 'T4> = jsNative\r\n\r\n []\r\n member _.MergeSources5(a: JS.Promise<'T1>, b: JS.Promise<'T2>, c: JS.Promise<'T3>, d: JS.Promise<'T4>, e: JS.Promise<'T5>): JS.Promise<'T1 * 'T2 * 'T3 * 'T4 * 'T5> = jsNative\r\n\r\n []\r\n member _.MergeSources6(a: JS.Promise<'T1>, b: JS.Promise<'T2>, c: JS.Promise<'T3>, d: JS.Promise<'T4>, e: JS.Promise<'T5>, f: JS.Promise<'T6>): JS.Promise<'T1 * 'T2 * 'T3 * 'T4 * 'T5 * 'T6> = jsNative\r\n\r\n// member _.BindReturn(y: JS.Promise<'T1>, f) = map f y\r\n\r\n [ $3(a,b))\")>]\r\n []\r\n member _.Merge(a: JS.Promise<'T1>, b: JS.Promise<'T2>, [] resultSelector : 'T1 -> 'T2 -> 'R): JS.Promise<'R> = jsNative\r\n","namespace Fulma\n\nopen Fable.React\nopen Fable.React.Props\n\nmodule Reflection =\n\n open Microsoft.FSharp.Reflection\n open System\n\n let getCaseName (case : 'T) =\n#if FABLE_COMPILER\n Fable.Core.Reflection.getCaseName case\n#else\n // Get UnionCaseInfo value from the F# reflection tools\n let (caseInfo, _args) = FSharpValue.GetUnionFields(case, typeof<'T>)\n caseInfo.GetCustomAttributes()\n |> Seq.tryPick (function\n | :? CompiledNameAttribute as att -> Some att.CompiledName\n | _ -> None)\n |> Option.defaultWith (fun () -> caseInfo.Name)\n#endif\n\n let getCaseTag (case : 'T) =\n#if FABLE_COMPILER\n Fable.Core.Reflection.getCaseTag case\n#else\n let (caseInfo, _args) = FSharpValue.GetUnionFields(case, typeof<'T>)\n caseInfo.Tag\n#endif\n\n[]\ntype Screen =\n | All\n | [] Desktop\n | [] Tablet\n | [] Mobile\n | [] WideScreen\n | [] Touch\n | [] FullHD\n\n static member ToString (screen : Screen) =\n match screen with\n | All -> \"\"\n | Desktop\n | Tablet\n | Mobile\n | WideScreen\n | Touch\n | FullHD -> \"-\" + Reflection.getCaseName screen\n\n[]\nmodule Color =\n\n type IColor =\n | [] IsBlack\n | [] IsDark\n | [] IsLight\n | [] IsWhite\n | [] IsPrimary\n | [] IsInfo\n | [] IsSuccess\n | [] IsWarning\n | [] IsDanger\n | [] IsLink\n | [] IsBlackBis\n | [] IsBlackTer\n | [] IsGreyDarker\n | [] IsGreyDark\n | [] IsGrey\n | [] IsGreyLight\n | [] IsGreyLighter\n | [] IsWhiteTer\n | [] IsWhiteBis\n /// Allow you to specify a custom color. The color will be prefixed by \"is-\"\n | IsCustomColor of string\n /// Allow you to specify a NoColor case.\n | NoColor\n\n let ofColor level =\n match level with\n | NoColor -> \"\"\n | IsCustomColor color -> \"is-\" + color\n | IsBlack\n | IsDark\n | IsLight\n | IsWhite\n | IsPrimary\n | IsInfo\n | IsSuccess\n | IsWarning\n | IsDanger\n | IsLink\n | IsBlackBis\n | IsBlackTer\n | IsGreyDarker\n | IsGreyDark\n | IsGrey\n | IsGreyLight\n | IsGreyLighter\n | IsWhiteTer\n | IsWhiteBis -> Reflection.getCaseName level\n\n[]\nmodule Size =\n\n type ISize =\n | [] IsSmall\n | [] IsMedium\n | [] IsLarge\n\n let inline ofSize size =\n Reflection.getCaseName size\n\n[]\nmodule TextSize =\n type Option =\n | Is1\n | Is2\n | Is3\n | Is4\n | Is5\n | Is6\n | Is7\n\n static member ToString (x: Option) =\n Reflection.getCaseTag x + 1 |> string\n\n let inline generic screen size =\n \"is-size-\" + Option.ToString size + Screen.ToString screen\n\n let inline only screen size =\n match screen with\n | Screen.Tablet\n | Screen.Desktop\n | Screen.WideScreen ->\n \"is-size-\" + Option.ToString size + Screen.ToString screen + \"-only\"\n | x ->\n Fable.Core.JS.console.warn(\"Screen `%s` does not support `is-size-xxx-only`.\" + string x)\n \"\"\n\n[]\nmodule TextAlignment =\n\n type Option =\n /// Add `has-text-centered`\n | [] Centered\n /// Add `has-text-justified`\n | [] Justified\n /// Add `has-text-left`\n | [] Left\n /// Add `has-text-right`\n | [] Right\n\n static member inline ToString opt =\n Reflection.getCaseName opt\n\n let inline generic screen alignment =\n Option.ToString alignment + Screen.ToString screen\n\n let inline only screen alignment =\n match screen with\n | Screen.Tablet\n | Screen.Desktop\n | Screen.WideScreen ->\n Option.ToString alignment + Screen.ToString screen + \"-only\"\n | x ->\n Fable.Core.JS.console.warn(\"Screen `%s` does not support `is-size-xxx-only`.\" + string x)\n \"\"\n\n[]\nmodule FlexDirection =\n\n type Option =\n /// Add is-flex-direction-row\n | [] Row\n /// Add is-flex-direction-row-reverse\n | [] RowReverse\n /// Add is-flex-direction-column\n | [] Column\n /// Add is-flex-direction-column-reverse\n | [] ColumnReverse\n\n static member inline toClass (opt : Option) =\n Reflection.getCaseName opt\n\n[]\nmodule FlexWrap =\n\n type Option =\n /// Add is-flex-wrap-nowrap\n | [] NoWrap\n /// Add is-flex-wrap-wrap\n | [] Wrap\n /// Add is-flex-wrap-wrap-reverse\n | [] WrapReverse\n\n static member inline toClass (opt : Option) =\n Reflection.getCaseName opt\n\n[]\nmodule FlexJustifyContent =\n\n type Option =\n /// Add is-justify-content-flex-start\n | [] FlexStart\n /// Add is-justify-content-flex-end\n | [] FlexEnd\n /// Add is-justify-content-center\n | [] Center\n /// Add is-justify-content-space-between\n | [] SpaceBetween\n /// Add is-justify-content-space-around\n | [] SpaceAround\n /// Add is-justify-content-space-evenly\n | [] SpaceEvenly\n /// Add is-justify-content-start\n | [] Start\n /// Add is-justify-content-end\n | [] End\n /// Add is-justify-content-left\n | [] Left\n /// Add is-justify-content-right\n | [] Right\n\n static member inline toClass (opt : Option) =\n Reflection.getCaseName opt\n\n[]\nmodule FlexAlignContent =\n\n type Option =\n /// Add is-align-content-flex-start\n | [] FlexStart\n /// Add is-align-content-flex-end\n | [] FlexEnd\n /// Add is-align-content-center\n | [] Center\n /// Add is-align-content-space-between\n | [] SpaceBetween\n /// Add is-align-content-space-around\n | [] SpaceAround\n /// Add is-align-content-space-evenly\n | [] SpaceEvenly\n /// Add is-align-content-stretch\n | [] Stretch\n /// Add is-align-content-start\n | [] Start\n /// Add is-align-content-end\n | [] End\n /// Add is-align-content-baseline\n | [] Baseline\n\n static member inline toClass (opt : Option) =\n Reflection.getCaseName opt\n\n\n[]\nmodule FlexAlignItems =\n\n type Option =\n /// Add is-align-items-stretch\n | [] Stretch\n /// Add is-align-items-flex-start\n | [] FlexStart\n /// Add is-align-items-flex-end\n | [] FlexEnd\n /// Add is-align-items-center\n | [] Center\n /// Add is-align-items-baseline\n | [] Baseline\n /// Add is-align-items-start\n | [] Start\n /// Add is-align-items-end\n | [] End\n /// Add is-align-items-self-start\n | [] SelfStart\n /// Add is-align-items-self-end\n | [] SelfEnd\n\n static member inline toClass (opt : Option) =\n Reflection.getCaseName opt\n\n[]\nmodule FlexAlignSelf =\n\n type Option =\n /// Add is-align-self-auto\n | [] Auto\n /// Add is-align-self-flex-start\n | [] FlexStart\n /// Add is-align-self-flex-end\n | [] FlexEnd\n /// Add is-align-self-center\n | [] Center\n /// Add is-align-self-baseline\n | [] Baseline\n /// Add is-align-self-stretch\n | [] Stretch\n\n static member inline toClass (opt : Option) =\n Reflection.getCaseName opt\n\n[]\nmodule FlexGrow =\n\n type Option =\n /// Add is-flex-grow-0\n | [] Is0\n /// Add is-flex-grow-1\n | [] Is1\n /// Add is-flex-grow-2\n | [] Is2\n /// Add is-flex-grow-3\n | [] Is3\n /// Add is-flex-grow-4\n | [] Is4\n /// Add is-flex-grow-5\n | [] Is5\n\n static member inline toClass (opt : Option) =\n Reflection.getCaseName opt\n\n[]\nmodule FlexShrink =\n\n type Option =\n /// Add is-flex-shrink-0\n | [] Is0\n /// Add is-flex-shrink-1\n | [] Is1\n /// Add is-flex-shrink-2\n | [] Is2\n /// Add is-flex-shrink-3\n | [] Is3\n /// Add is-flex-shrink-4\n | [] Is4\n /// Add is-flex-shrink-5\n | [] Is5\n\n static member inline toClass (opt : Option) =\n Reflection.getCaseName opt\n\n\n[]\nmodule TextWeight =\n\n type Option =\n /// Add `has-text-weight-light`\n | [] Light\n /// Add `has-text-weight-normal`\n | [] Normal\n /// Add `has-text-weight-semibold`\n | [] SemiBold\n /// Add `has-text-weight-bold`\n | [] Bold\n /// Add `has-text-weight-medium`\n | [] Medium\n\n let inline internal ofOption opt =\n Reflection.getCaseName opt\n\n[]\nmodule TextTransform =\n\n type Option =\n /// Add `is-capitalized`\n | [] Capitalized\n /// Add `is-lowercase`\n | [] LowerCase\n /// Add `is-uppercase`\n | [] UpperCase\n /// Add `is-italic`\n | [] Italic\n /// Add `is-underlined`\n | [] Underlined\n\n static member inline toClass opt =\n Reflection.getCaseName opt\n\n[]\nmodule Display =\n\n type Option =\n | [] Block\n | [] Flex\n | [] Inline\n | [] InlineBlock\n | [] InlineFlex\n\n static member inline toClass opt =\n Reflection.getCaseName opt\n\n let internal toDisplayClass screen display =\n let display = Option.toClass display\n let screen = Screen.ToString screen\n\n \"is-\" + display + screen\n\n let internal toDisplayOnlyClass screen display =\n match screen with\n | Screen.Tablet\n | Screen.Desktop\n | Screen.WideScreen ->\n let display = Option.toClass display\n let screen = Screen.ToString screen\n \"is-\" + display + screen + \"-only\"\n\n | x ->\n Fable.Core.JS.console.warn(\"Screen `%s` does not support display only.\" + string x)\n \"\"\n\n[]\nmodule Spacing =\n type TypeAndDirection =\n | [] Margin\n | [] MarginTop\n | [] MarginRight\n | [] MarginBottom\n | [] MarginLeft\n | [] MarginTopAndBottom\n | [] MarginLeftAndRight\n | [] Padding\n | [] PaddingTop\n | [] PaddingRight\n | [] PaddingBottom\n | [] PaddingLeft\n | [] PaddingTopAndBottom\n | [] PaddingLeftAndRight\n\n static member inline toClass opt =\n Reflection.getCaseName opt\n\n type Amount =\n | [] IsAuto\n | [] Is0\n | [] Is1\n | [] Is2\n | [] Is3\n | [] Is4\n | [] Is5\n | [] Is6\n\n static member inline toClass opt =\n Reflection.getCaseName opt\n\n let internal toSpacingClass typ amount =\n let typ = TypeAndDirection.toClass typ\n let amount = Amount.toClass amount\n\n typ + \"-\" + amount\n\n[]\nmodule Modifier =\n let internal ofBackground level =\n match level with\n | NoColor -> \"\"\n | IsCustomColor color -> \"has-background-\" + color\n | IsBlack\n | IsDark\n | IsLight\n | IsWhite\n | IsPrimary\n | IsInfo\n | IsSuccess\n | IsWarning\n | IsDanger\n | IsLink\n | IsBlackBis\n | IsBlackTer\n | IsGreyDarker\n | IsGreyDark\n | IsGrey\n | IsGreyLight\n | IsGreyLighter\n | IsWhiteTer\n | IsWhiteBis -> \"has-background-\" + (Reflection.getCaseName level).[3..]\n\n let internal ofText level =\n match level with\n | NoColor -> \"\"\n | IsCustomColor color -> \"has-text-\" + color\n | IsBlack\n | IsDark\n | IsLight\n | IsWhite\n | IsPrimary\n | IsInfo\n | IsSuccess\n | IsWarning\n | IsDanger\n | IsLink\n | IsBlackBis\n | IsBlackTer\n | IsGreyDarker\n | IsGreyDark\n | IsGrey\n | IsGreyLight\n | IsGreyLighter\n | IsWhiteTer\n | IsWhiteBis -> \"has-text-\" + (Reflection.getCaseName level).[3..]\n\n let internal ofInvisible screen =\n \"is-invisible\" + Screen.ToString screen\n\n let internal ofHidden screen =\n \"is-hidden\" + Screen.ToString screen\n\n let internal ofInvisibleOnly screen =\n match screen with\n | Screen.Tablet\n | Screen.Desktop\n | Screen.WideScreen ->\n \"is-invisible\" + Screen.ToString screen + \"-only\"\n | x ->\n Fable.Core.JS.console.warn(\"Screen `%s` does not support `is-invisible-xxx-only`.\" + string x)\n \"\"\n\n let internal ofHiddenOnly screen =\n match screen with\n | Screen.Tablet\n | Screen.Desktop\n | Screen.WideScreen ->\n \"is-hidden\" + Screen.ToString screen + \"-only\"\n | x ->\n Fable.Core.JS.console.warn(\"Screen `%s` does not support `is-hidden-xxx-only`.\" + string x)\n \"\"\n\n type IModifier =\n | BackgroundColor of IColor\n | TextColor of IColor\n | TextWeight of TextWeight.Option\n | TextSize of Screen * TextSize.Option\n | TextSizeOnly of Screen * TextSize.Option\n | TextAlignment of Screen * TextAlignment.Option\n | TextAlignmentOnly of Screen * TextAlignment.Option\n | TextTransform of TextTransform.Option\n | Display of Screen * Display.Option\n | DisplayOnly of Screen * Display.Option\n | [] IsClearfix\n | [] IsPulledLeft\n | [] IsPulledRight\n | [] IsMarginless\n | [] IsPaddingless\n | [] IsOverlay\n | [] IsClipped\n | [] IsRadiusless\n | [] IsShadowless\n | [] IsUnselectable\n | [] IsClickable\n | [] IsRelative\n | [] IsFlex\n | IsInvisible of Screen * bool\n | IsHidden of Screen * bool\n | IsInvisibleOnly of Screen * bool\n | IsHiddenOnly of Screen * bool\n | IsSrOnly\n | IsScreenReaderOnly\n | Spacing of Spacing.TypeAndDirection * Spacing.Amount\n // Flexbox helpers\n | FlexDirection of FlexDirection.Option\n | FlexWrap of FlexWrap.Option\n | FlexJustifyContent of FlexJustifyContent.Option\n | FlexAlignContent of FlexAlignContent.Option\n | FlexAlignItems of FlexAlignItems.Option\n | FlexAlignSelf of FlexAlignSelf.Option\n | FlexGrow of FlexGrow.Option\n | FlexShrink of FlexShrink.Option\n\n\n\n // | IsGap (screen, size) ->\n // if not (List.contains \"is-variable\" result.Classes) then\n // result.AddClass(\"is-variable\").AddClass(gapSizeGeneric screen size)\n // else\n // result.AddClass(gapSizeGeneric screen size)\n\n\n\n let parseModifiers options =\n let parseOptions result option =\n match option with\n | BackgroundColor color -> (ofBackground color)::result\n | TextColor color -> (ofText color)::result\n | TextWeight textWeight -> (TextWeight.ofOption textWeight)::result\n | TextSize (screen, size) -> (TextSize.generic screen size)::result\n | TextSizeOnly (screen, size) -> (TextSize.only screen size)::result\n | TextAlignment (screen, size) -> (TextAlignment.generic screen size)::result\n | TextAlignmentOnly (screen, size) -> (TextAlignment.only screen size)::result\n | TextTransform transform -> (TextTransform.Option.toClass transform)::result\n | Display (screen, display) -> (Display.toDisplayClass screen display)::result\n | DisplayOnly (screen, display) -> (Display.toDisplayOnlyClass screen display)::result\n | IsInvisible (screen, b) -> if b then (ofInvisible screen)::result else result\n | IsInvisibleOnly (screen, b) -> if b then (ofInvisibleOnly screen)::result else result\n | IsHidden (screen, b) -> if b then (ofHidden screen)::result else result\n | IsHiddenOnly (screen, b) -> if b then (ofHiddenOnly screen)::result else result\n | IsSrOnly\n | IsScreenReaderOnly -> \"is-sr-only\"::result\n | IsClearfix\n | IsPulledLeft\n | IsPulledRight\n | IsMarginless\n | IsPaddingless\n | IsOverlay\n | IsClipped\n | IsRadiusless\n | IsShadowless\n | IsClickable\n | IsUnselectable\n | IsFlex\n | IsRelative -> (Reflection.getCaseName option)::result\n | Spacing (typ, amount) -> (Spacing.toSpacingClass typ amount)::result\n | FlexDirection direction ->\n if not (List.contains \"is-flex\" result) then\n \"is-flex\"::(FlexDirection.Option.toClass direction)::result\n else\n (FlexDirection.Option.toClass direction)::result\n | FlexWrap option ->\n if not (List.contains \"is-flex\" result) then\n \"is-flex\"::(FlexWrap.Option.toClass option)::result\n else\n (FlexWrap.Option.toClass option)::result\n | FlexJustifyContent option ->\n if not (List.contains \"is-flex\" result) then\n \"is-flex\"::(FlexJustifyContent.Option.toClass option)::result\n else\n (FlexJustifyContent.Option.toClass option)::result\n | FlexAlignContent option ->\n if not (List.contains \"is-flex\" result) then\n \"is-flex\"::(FlexAlignContent.Option.toClass option)::result\n else\n (FlexAlignContent.Option.toClass option)::result\n | FlexAlignItems option ->\n if not (List.contains \"is-flex\" result) then\n \"is-flex\"::(FlexAlignItems.Option.toClass option)::result\n else\n (FlexAlignItems.Option.toClass option)::result\n\n | FlexAlignSelf option ->\n (FlexAlignSelf.Option.toClass option)::result\n\n | FlexGrow size ->\n (FlexGrow.Option.toClass size)::result\n\n | FlexShrink size ->\n (FlexShrink.Option.toClass size)::result\n\n options |> List.fold parseOptions []\n\n[]\nmodule Common =\n type GenericOption =\n | CustomClass of string\n | Props of IHTMLProp list\n | Modifiers of Modifier.IModifier list\n\n type GenericOptions =\n { Props : IHTMLProp list\n Classes : string list\n RemovedClasses : string list }\n\n static member Empty =\n { Props = []; Classes = []; RemovedClasses = [] }\n\n static member Parse(options, parser, ?baseClass, ?baseProps) =\n let result = options |> List.fold parser GenericOptions.Empty\n\n let result =\n match baseClass with\n | Some baseClass -> result.AddClass(baseClass)\n | None -> result\n\n match baseProps with\n | Some baseProps -> result.AddProps(baseProps)\n | None -> result\n\n member this.AddProp(prop : IHTMLProp) =\n { this with Props = prop::this.Props }\n\n member this.AddProps(props : IHTMLProp list) =\n { this with Props = props@this.Props }\n\n member this.AddClass(cl: string) =\n { this with Classes = cl::this.Classes }\n\n member this.RemoveClass(cl: string) =\n { this with RemovedClasses = cl::this.RemovedClasses }\n\n member this.AddCaseName(case: 'T) =\n Reflection.getCaseName case |> this.AddClass\n\n member this.AddModifiers(modifiers) =\n { this with Classes = (modifiers |> Modifier.parseModifiers) @ this.Classes }\n\n member this.ToAttributes() =\n match this.Classes |> List.filter (fun cls -> not (System.String.IsNullOrEmpty cls) && not (List.contains cls this.RemovedClasses)) with\n | [] -> this.Props\n | classes -> (classes |> String.concat \" \" |> ClassName :> _) :: this.Props\n\n /// Convert to standard element\n member this.ToReactElement(el : IHTMLProp list -> ReactElement list -> ReactElement, ?children): ReactElement =\n let children = defaultArg children []\n el (this.ToAttributes ()) children\n\n /// Convert to self closing element\n member this.ToReactElement(el : IHTMLProp list -> ReactElement): ReactElement =\n el (this.ToAttributes ())\n\n let parseOptions (result : GenericOptions) option =\n match option with\n | Props props -> result.AddProps props\n | CustomClass customClass -> result.AddClass customClass\n | Modifiers modifiers -> result.AddModifiers modifiers\n\n module Helpers =\n\n []\n let classes std (options : string option list) (booleans: (string * bool) list) =\n let std = (std, options) ||> List.fold (fun complete option ->\n match option with\n | Some name -> complete + \" \" + name\n | None -> complete )\n (std, booleans) ||> List.fold (fun complete (name, flag) ->\n if flag then complete + \" \" + name else complete)\n |> ClassName :> IHTMLProp\n\n[]\nmodule Text =\n open Fable.React\n\n let p (options: GenericOption list) children =\n GenericOptions.Parse(options, parseOptions).ToReactElement(p, children)\n\n let div (options: GenericOption list) children =\n GenericOptions.Parse(options, parseOptions).ToReactElement(div, children)\n\n let span (options: GenericOption list) children =\n GenericOptions.Parse(options, parseOptions).ToReactElement(span, children)\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Notification =\r\n\r\n type Option =\r\n | Color of IColor\r\n /// Add `is-light` class\r\n | [] IsLight\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
\r\n let notification (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Color color -> ofColor color |> result.AddClass\r\n | IsLight -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"notification\").ToReactElement(div, children)\r\n\r\n /// Generate \r\n let delete (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"delete\").ToReactElement(button, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Heading =\r\n\r\n type Option =\r\n /// Add `is-1` class\r\n | []Is1\r\n /// Add `is-2` class\r\n | []Is2\r\n /// Add `is-3` class\r\n | []Is3\r\n /// Add `is-4` class\r\n | []Is4\r\n /// Add `is-5` class\r\n | []Is5\r\n /// Add `is-6` class\r\n | []Is6\r\n /// Add `subtitle` class\r\n | []IsSubtitle\r\n /// Add `is-spaced` class\r\n | []IsSpaced\r\n // Extra\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let internal title (element : IHTMLProp list -> ReactElement list -> ReactElement) (options : Option list)\r\n (children) =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n // Sizes\r\n | Is1\r\n | Is2\r\n | Is3\r\n | Is4\r\n | Is5\r\n | Is6\r\n | IsSpaced -> result.AddCaseName option\r\n // Styles\r\n | IsSubtitle ->\r\n result.RemoveClass(\"title\").AddClass(\"subtitle\")\r\n // Extra\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, baseClass=\"title\").ToReactElement(element, children)\r\n\r\n // Alias\r\n /// Generate

\r\n /// Class can be `subtitle` if you pass `Heading.IsSubtitle`\r\n let h1 (options : Option list) = title h1 (Is1 :: options)\r\n /// Generate

\r\n /// Class can be `subtitle` if you pass `Heading.IsSubtitle`\r\n let h2 (options : Option list) = title h2 (Is2 :: options)\r\n /// Generate

\r\n /// Class can be `subtitle` if you pass `Heading.IsSubtitle`\r\n let h3 (options : Option list) = title h3 (Is3 :: options)\r\n /// Generate

\r\n /// Class can be `subtitle` if you pass `Heading.IsSubtitle`\r\n let h4 (options : Option list) = title h4 (Is4 :: options)\r\n /// Generate
\r\n /// Class can be `subtitle` if you pass `Heading.IsSubtitle`\r\n let h5 (options : Option list) = title h5 (Is5 :: options)\r\n /// Generate
\r\n /// Class can be `subtitle` if you pass `Heading.IsSubtitle`\r\n let h6 (options : Option list) = title h6 (Is6 :: options)\r\n /// Generate

\r\n /// Class can be `subtitle` if you pass `Heading.IsSubtitle`\r\n let p opts children = title p opts children\r\n","namespace Fulma\n\nopen Fulma\nopen Fable.React\nopen Fable.React.Props\n\n[]\nmodule Icon =\n\n type Option =\n // Sizes\n | Size of ISize\n /// Add `is-left` class\n | [] IsLeft\n /// Add `is-right` class\n | [] IsRight\n // Extra\n | CustomClass of string\n | Props of IHTMLProp list\n | Modifiers of Modifier.IModifier list\n\n /// Generate \n let icon options children =\n let parseOptions (result : GenericOptions) option =\n match option with\n // Sizes\n | Size size -> ofSize size |> result.AddClass\n // Position\n | IsLeft\n | IsRight -> result.AddCaseName option\n // Extra\n | Props props -> result.AddProps props\n | CustomClass customClass -> result.AddClass customClass\n | Modifiers modifiers -> result.AddModifiers modifiers\n\n GenericOptions.Parse(options, parseOptions, \"icon\").ToReactElement(span, children)\n\n module Text =\n\n let span (options: GenericOption list) children =\n GenericOptions.Parse(options, parseOptions, \"icon-text\").ToReactElement(span, children)\n\n let div (options: GenericOption list) children =\n GenericOptions.Parse(options, parseOptions, \"icon-text\").ToReactElement(div, children)\n","namespace Fable.FontAwesome\n\nopen Fable.Core\nopen Fable.React\nopen Fable.React.Props\n\nmodule internal Helpers =\n\n let classes std (options : string option list) (booleans: (string * bool) list) =\n let std = (std, options) ||> List.fold (fun complete opt ->\n match opt with Some name -> complete + \" \" + name | None -> complete)\n (std, booleans) ||> List.fold (fun complete (name, flag) ->\n if flag then complete + \" \" + name else complete)\n |> ClassName :> IHTMLProp\n\n[]\nmodule Fa =\n\n module Classes =\n module Size =\n let [] FaExtraSmall = \"fa-xs\"\n let [] FaSmall = \"fa-sm\"\n let [] FaLarge = \"fa-lg\"\n let [] Fa2x = \"fa-2x\"\n let [] Fa3x = \"fa-3x\"\n let [] Fa4x = \"fa-4x\"\n let [] Fa5x = \"fa-5x\"\n let [] Fa6x = \"fa-6x\"\n let [] Fa7x = \"fa-7x\"\n let [] Fa8x = \"fa-8x\"\n let [] Fa9x = \"fa-9x\"\n let [] Fa10 = \"fa-10x\"\n\n module Style =\n let [] FixedWidth = \"fa-fw\"\n let [] IsLi = \"fa-li\"\n let [] Border = \"fa-border\"\n let [] Inverse = \"fa-inverse\"\n\n module Rotations =\n let [] Rotate90 = \"fa-rotate-90\"\n let [] Rotate180 = \"fa-rotate-180\"\n let [] Rotate270 = \"fa-rotate-270\"\n\n module Flips =\n let [] Horizontal = \"fa-flip-horizontal\"\n let [] Vertical = \"fa-flip-vertical\"\n\n module Animations =\n let [] Spin = \"fa-spin\"\n let [] Pulse = \"fa-pulse\"\n\n module Pull =\n let [] Right = \"fa-pull-right\"\n let [] Left = \"fa-pull-left\"\n\n module Stack =\n\n let [] Container = \"fa-stack\"\n\n module Size =\n let [] Fa1x = \"fa-stack-1x\"\n let [] Fa2x = \"fa-stack-2x\"\n\n type ISize =\n | FaExtraSmall\n | FaSmall\n | FaLarge\n | Fa2x\n | Fa3x\n | Fa4x\n | Fa5x\n | Fa6x\n | Fa7x\n | Fa8x\n | Fa9x\n | Fa10\n\n type IconOption =\n | Size of ISize\n | Border\n | PullLeft\n | PullRight\n | Inverse\n | Rotate90\n | Rotate180\n | Rotate270\n | FlipHorizontal\n | FlipVertical\n | IsLi\n | Icon of string\n | Spin\n | Pulse\n | Props of IHTMLProp list\n | CustomClass of string\n | FixedWidth\n | Stack1x\n | Stack2x\n\n let internal ofSize (size : ISize) =\n match size with\n | FaExtraSmall -> Classes.Size.FaExtraSmall\n | FaSmall -> Classes.Size.FaSmall\n | FaLarge -> Classes.Size.FaLarge\n | Fa2x -> Classes.Size.Fa2x\n | Fa3x -> Classes.Size.Fa3x\n | Fa4x -> Classes.Size.Fa4x\n | Fa5x -> Classes.Size.Fa5x\n | Fa6x -> Classes.Size.Fa6x\n | Fa7x -> Classes.Size.Fa7x\n | Fa8x -> Classes.Size.Fa8x\n | Fa9x -> Classes.Size.Fa9x\n | Fa10 -> Classes.Size.Fa10\n\n type IconOptions =\n { Icon : string option\n Size : string option\n Border : string option\n Pull : string option\n HaveSpin : bool\n HavePulse : bool\n Rotation : string option\n Flip : string option\n IsInverse : bool\n Props : IHTMLProp list\n FixedWidth : bool\n IsLi : bool\n StackSize : string option\n CustomClass : string option }\n\n static member Empty =\n { Icon = None\n Size = None\n Border = None\n Pull = None\n HaveSpin = false\n HavePulse = false\n Rotation = None\n Flip = None\n IsInverse = false\n Props = [ ]\n FixedWidth = false\n IsLi = false\n StackSize = None\n CustomClass = None }\n\n let toIconOptions (faOptions: IconOption list) =\n let parseOptions (result: IconOptions) (option: IconOption) =\n match option with\n | Size s ->\n { result with Size = ofSize s |> Some }\n | Border ->\n { result with Border = Some Classes.Style.Border }\n | PullLeft ->\n { result with Pull = Some Classes.Pull.Left }\n | PullRight ->\n { result with Pull = Some Classes.Pull.Right }\n | Inverse ->\n { result with IsInverse = true }\n | Icon faIcon ->\n { result with Icon = faIcon |> Some }\n | Rotate90 ->\n { result with Rotation = Classes.Rotations.Rotate90 |> Some }\n | Rotate180 ->\n { result with Rotation = Classes.Rotations.Rotate180 |> Some }\n | Rotate270 ->\n { result with Rotation = Classes.Rotations.Rotate270 |> Some }\n | FlipHorizontal ->\n { result with Rotation = Classes.Flips.Horizontal |> Some }\n | FlipVertical ->\n { result with Rotation = Classes.Flips.Vertical |> Some }\n | Spin ->\n { result with HaveSpin = true }\n | Pulse ->\n { result with HavePulse = true }\n | Props props ->\n { result with Props = props }\n | FixedWidth ->\n { result with FixedWidth = true }\n | IsLi ->\n { result with IsLi = true }\n | CustomClass customClass ->\n { result with CustomClass = Some customClass }\n | Stack1x ->\n { result with StackSize = Some Classes.Stack.Size.Fa1x }\n | Stack2x ->\n { result with StackSize = Some Classes.Stack.Size.Fa2x }\n\n faOptions |> List.fold parseOptions IconOptions.Empty\n\n /// Logic used to display one icon alone or as one item in an unordered list:\n let internal displayIcon baseElement baseClass (opts: IconOptions) children =\n let classes =\n Helpers.classes baseClass\n [ opts.Icon\n opts.Size\n opts.Border\n opts.Pull\n opts.Rotation\n opts.Flip\n opts.CustomClass\n opts.StackSize ]\n [ Classes.Style.FixedWidth, opts.FixedWidth\n Classes.Style.IsLi, opts.IsLi\n Classes.Animations.Pulse, opts.HavePulse\n Classes.Animations.Spin, opts.HaveSpin\n Classes.Style.Inverse, opts.IsInverse ]\n\n baseElement (classes::opts.Props)\n children\n\n let ul props children =\n ul [ ClassName \"fa-ul\" ]\n children\n\n let ol props children =\n ol [ ClassName \"fa-ul\" ]\n children\n\n let i (faOptions: IconOption list) children =\n let opts = toIconOptions faOptions\n displayIcon i \"\" opts children\n\n let span (faOptions: IconOption list) children =\n let opts = toIconOptions faOptions\n displayIcon span \"\" opts children\n\n module Stack =\n type Option =\n | Size of ISize\n | CustomClass of string\n | Props of IHTMLProp list\n\n type internal Options =\n { Size : string option\n Props : IHTMLProp list\n CustomClass : string option }\n\n static member Empty =\n { Size = None\n Props = [ ]\n CustomClass = None }\n\n\n let stack options children =\n let parseOption (result : Stack.Options) opt =\n match opt with\n | Stack.Size size ->\n { result with Size = ofSize size |> Some }\n | Stack.CustomClass customClass ->\n { result with CustomClass = Some customClass }\n | Stack.Props props ->\n { result with Props = props }\n\n let opts = options |> List.fold parseOption Stack.Options.Empty\n let classes = Helpers.classes\n Classes.Stack.Container\n ( opts.Size\n :: opts.CustomClass\n :: [] )\n [ ]\n\n Fable.React.Standard.span (classes::opts.Props)\n children\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Columns =\r\n\r\n type ISize =\r\n | [] Is1\r\n | [] Is2\r\n | [] Is3\r\n | [] Is4\r\n | [] Is5\r\n | [] Is6\r\n | [] Is7\r\n | [] Is8\r\n\r\n static member ToString (x : ISize)=\r\n Reflection.getCaseName x\r\n\r\n let inline private gapSizeGeneric (screen : Screen) (size : ISize) =\r\n ISize.ToString size + Screen.ToString screen\r\n\r\n let inline private gapSizeOnly (screen : Screen) (size : ISize) =\r\n match screen with\r\n | Screen.Tablet\r\n | Screen.Desktop\r\n | Screen.WideScreen ->\r\n ISize.ToString size + Screen.ToString screen + \"-only\"\r\n | x ->\r\n let msg = sprintf \"Screen `%s` does not support `is-%s-%s-only`.\" (Screen.ToString x) (ISize.ToString size) (Screen.ToString x)\r\n Fable.Core.JS.console.warn(msg)\r\n \"\"\r\n\r\n type Option =\r\n /// Add `is-centered` class\r\n | [] IsCentered\r\n /// Add `is-vcentered` class\r\n | [] IsVCentered\r\n /// Add `is-multiline` class\r\n | [] IsMultiline\r\n /// Add `is-gapless` class\r\n | [] IsGapless\r\n /// Add `is-mobile` class\r\n | [] IsMobile\r\n /// Add `is-desktop` class\r\n | [] IsDesktop\r\n /// Configure the gap size. You can configure the display and gap size\r\n /// Example: Columns.IsGap (Columns.Desktop, Columns.Is6)\r\n /// Becomes: `is-6-desktop`\r\n | IsGap of Screen * ISize\r\n /// Configure the gap size. You can configure the display and gap size\r\n /// Example: Columns.IsGapOnly (Columns.Tablet, Columns.Is6)\r\n /// Becomes: `is-6-tablet-only`\r\n | IsGapOnly of Screen * ISize\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
\r\n let columns (options: Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsCentered\r\n | IsVCentered\r\n | IsMultiline\r\n | IsGapless\r\n | IsMobile\r\n | IsDesktop -> result.AddCaseName option\r\n | IsGap (screen, size) ->\r\n if not (List.contains \"is-variable\" result.Classes) then\r\n result.AddClass(\"is-variable\").AddClass(gapSizeGeneric screen size)\r\n else\r\n result.AddClass(gapSizeGeneric screen size)\r\n | IsGapOnly (screen, size) ->\r\n if not (List.contains \"is-variable\" result.Classes) then\r\n result.AddClass(\"is-variable\").AddClass(gapSizeOnly screen size)\r\n else\r\n result.AddClass(gapSizeOnly screen size)\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"columns\").ToReactElement(div, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Column =\r\n\r\n type ISize =\r\n | [] IsOneQuarter\r\n | [] IsOneThird\r\n | [] IsHalf\r\n | [] IsTwoThirds\r\n | [] IsThreeQuarters\r\n | [] Is1\r\n | [] Is2\r\n | [] Is3\r\n | [] Is4\r\n | [] Is5\r\n | [] Is6\r\n | [] Is7\r\n | [] Is8\r\n | [] Is9\r\n | [] Is10\r\n | [] Is11\r\n | [] Is12\r\n | [] IsNarrow\r\n | [] IsFull\r\n | [] IsOneFifth\r\n | [] IsTwoFifths\r\n | [] IsThreeFifths\r\n | [] IsFourFifths\r\n\r\n type Option =\r\n /// Configure the width of the column. You can configure the display and size\r\n /// Example: Column.Width (Column.Desktop, Column.Is6)\r\n /// Becomes: `is-6-desktop`\r\n | Width of Screen * ISize\r\n /// Configure the offset of the column. You can configure the display and offset size\r\n /// Example: Column.Offset (Column.Desktop, Column.Is6)\r\n /// Becomes: `is-offset-6-desktop`\r\n | Offset of Screen * ISize\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let private suffix = function\r\n | Screen.All -> \"\"\r\n | Screen.Desktop -> \"-desktop\"\r\n | Screen.Tablet -> \"-tablet\"\r\n | Screen.Mobile -> \"-mobile\"\r\n | Screen.WideScreen -> \"-widescreen\"\r\n | Screen.FullHD -> \"-fullhd\"\r\n | Screen.Touch -> \"-touch\"\r\n\r\n let internal ofWidth (screen, size) =\r\n Reflection.getCaseName size + suffix screen\r\n\r\n let internal ofOffset (screen, offset) =\r\n let className = Reflection.getCaseName offset\r\n \"is-offset-\" + className.[3..] + suffix screen\r\n\r\n /// Generate
\r\n let column (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Width (screen, width) ->\r\n ofWidth (screen, width) |> result.AddClass\r\n | Offset (screen, offset) ->\r\n ofOffset (screen, offset) |> result.AddClass\r\n | CustomClass customClass ->\r\n result.AddClass customClass\r\n | Props props ->\r\n result.AddProps props\r\n | Modifiers modifiers ->\r\n result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"column\")\r\n .ToReactElement(div, children)\r\n","namespace Client\n\nopen System\nopen Fable.FontAwesome\nopen Fable.React.Props\nopen Fable.React.Helpers\nopen Fable.React.Standard\nopen Fulma\nopen Thoth.Elmish\n\n[]\nmodule Toast =\n let renderToastWithFulma =\n { new Toast.IRenderer with\n member _.Toast children color =\n Notification.notification [ Notification.CustomClass color ] children\n\n member _.CloseButton onClick =\n Notification.delete [ Props [ DOMAttr.OnClick onClick ] ] []\n\n member _.Title txt = Heading.h5 [] [ str txt ]\n\n member _.Icon(icon: Fa.IconOption) =\n Icon.icon [ Icon.Size IsMedium ] [ Fa.i [ icon; Fa.Size Fa.Fa2x ] [] ]\n\n member _.SingleLayout title message = div [] [ title; message ]\n\n member _.Message txt = span [] [ str txt ]\n\n member _.SplittedLayout iconView title message =\n Columns.columns [ Columns.IsGapless; Columns.IsVCentered ] [\n Column.column [ Column.Width(Screen.All, Column.Is2) ] [ iconView ]\n Column.column [] [ title; message ]\n ]\n\n member _.StatusToColor status =\n match status with\n | Toast.Success -> \"is-success\"\n | Toast.Warning -> \"is-warning\"\n | Toast.Error -> \"is-danger\"\n | Toast.Info -> \"is-info\"\n }\n\n\n let create message =\n Toast.message message\n |> Toast.position Toast.TopRight\n |> Toast.timeout (TimeSpan.FromSeconds 3.0)\n |> Toast.withCloseButton\n\n let errorTitle code toast =\n let title = sprintf \"Fehlernummer: %d\" code\n\n Toast.title title toast","namespace Shared.Infrastructure\n\n[]\nmodule List =\n /// This function only maps items that return true for the predicate\n let filteredMap (predicate: 'a -> bool) (f: 'a -> 'a) (list: 'a list) : 'a list =\n list |> List.map (fun item -> if predicate item then f item else item)\n\n let addToListIfSome (list: 'a list) (maybeItem: 'a option) : 'a list =\n match maybeItem with\n | Some item -> item :: list\n | None -> list\n\n let appendToListIfSome (list: 'a list) (maybeItem: 'a option) : 'a list =\n match maybeItem with\n | Some item -> List.append list [ item ]\n | None -> list\n\n /// This will return \"Some(list)\" if the provided list is not empty\n let noneIfEmpty (list: 'a list) : 'a list option =\n if List.isEmpty list then None else Some list","namespace Fulma\n\nopen Fulma\nopen Fable.React\nopen Fable.React.Props\nopen Browser.Types\n\n[]\nmodule Button =\n\n type Option =\n // Colors\n | Color of IColor\n | Size of ISize\n /// Add `is-fullwidth` class\n | [] IsFullWidth\n /// Add `is-link` class\n | [] IsLink\n /// Add `is-outlined` class\n | [] IsOutlined\n /// Add `is-inverted` class\n | [] IsInverted\n /// Add `is-text` class\n | [] IsText\n /// Add `is-ghost` class\n | [] IsGhost\n /// Add `is-rounded` class\n | [] IsRounded\n /// Add `is-expanded` class\n | [] IsExpanded\n /// Add `is-hovered` class if true\n | [] IsHovered of bool\n /// Add `is-focused` class if true\n | [] IsFocused of bool\n /// Add `is-active` class if true\n | [] IsActive of bool\n /// Add `is-loading` class if true\n | [] IsLoading of bool\n /// Add `is-static` class if true\n | [] IsStatic of bool\n /// Add `is-light` class\n | [] IsLight\n /// Set `disabled` HTMLAttr\n | Disabled of bool\n | Props of IHTMLProp list\n | OnClick of (MouseEvent -> unit)\n | CustomClass of string\n | Modifiers of Modifier.IModifier list\n\n let internal btnView element (options : Option list) children =\n let parseOptions (result : GenericOptions) option =\n match option with\n | Color color -> ofColor color |> result.AddClass\n | Size size -> ofSize size |> result.AddClass\n // Styles\n | IsLink\n | IsFullWidth\n | IsOutlined\n | IsInverted\n | IsText\n | IsRounded\n | IsExpanded\n | IsGhost\n | IsLight -> result.AddCaseName option\n // States\n | IsHovered state\n | IsFocused state\n | IsActive state\n | IsLoading state\n | IsStatic state -> if state then result.AddCaseName option else result\n | Disabled isDisabled -> Fable.React.Props.Disabled isDisabled |> result.AddProp\n | OnClick cb -> DOMAttr.OnClick cb |> result.AddProp\n | Props props -> result.AddProps props\n | CustomClass customClass -> result.AddClass customClass\n | Modifiers modifiers -> result.AddModifiers modifiers\n\n GenericOptions.Parse(options, parseOptions, \"button\").ToReactElement(element, children)\n\n /// Generate \n let button options children = btnView button options children\n /// Generate \n let span options children = btnView span options children\n /// Generate \n let a options children = btnView a options children\n\n module Input =\n let internal btnInput typ options =\n let hasProps =\n options\n |> List.exists (fun opts ->\n match opts with\n | Props _ -> true\n | _ -> false\n )\n\n if hasProps then\n let newOptions =\n options\n |> List.map (fun opts ->\n match opts with\n | Props props -> Props ((Type typ :> IHTMLProp) ::props)\n | forward -> forward\n )\n btnView (fun options _ -> input options) newOptions [ ]\n\n else\n btnView (fun options _ -> input options) ((Props [ Type typ ])::options) [ ]\n\n /// Generate \n let reset options = btnInput \"reset\" options\n /// Generate \n let submit options = btnInput \"submit\" options\n\n module List =\n\n type Option =\n /// Add `has-addons` class\n | [] HasAddons\n /// Add `is-centered` class\n | [] IsCentered\n | [] IsRight\n /// Add `are-small` class\n | [] AreSmall\n /// Add `are-medium` class\n | [] AreMedium\n /// Add `are-large` class\n | [] AreLarge\n // | Size of ISize\n | Props of IHTMLProp list\n | CustomClass of string\n | Modifiers of Modifier.IModifier list\n\n /// Generate
\n let list (options : List.Option list) children =\n let parseOptions (result : GenericOptions) option =\n match option with\n | List.HasAddons\n | List.IsCentered\n | List.IsRight\n | List.AreSmall\n | List.AreMedium\n | List.AreLarge -> result.AddCaseName option\n | List.Props props -> result.AddProps props\n | List.CustomClass customClass -> result.AddClass customClass\n | List.Modifiers modifiers -> result.AddModifiers modifiers\n\n GenericOptions.Parse(options, parseOptions, \"buttons\").ToReactElement(div, children)\n","module Client.Components.SubmitButton\n\nopen Browser.Types\nopen Fulma\n\nlet onClick (f: MouseEvent -> Unit) =\n Button.OnClick(fun event ->\n event.preventDefault ()\n\n f event\n )","namespace Fulma\r\n\r\nopen Fable.React\r\nopen Fulma\r\n\r\n[]\r\nmodule Box =\r\n\r\n /// Generate
\r\n let box' (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"box\").ToReactElement(div, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Field =\r\n\r\n type Option =\r\n /// Add `has-addons` class\r\n | [] HasAddons\r\n /// Add `has-addons-centered` class\r\n | [] HasAddonsCentered\r\n /// Add `has-addons-right` class\r\n | [] HasAddonsRight\r\n /// Add `has-addons-fullwidth` class\r\n | [] HasAddonsFullWidth\r\n /// Add `is-grouped` class\r\n | [] IsGrouped\r\n /// Add `is-grouped-centered` class\r\n | [] IsGroupedCentered\r\n /// Add `is-grouped-right` class\r\n | [] IsGroupedRight\r\n /// Add `is-grouped-multiline` class\r\n | [] IsGroupedMultiline\r\n /// Add `is-horizontal` class\r\n | [] IsHorizontal\r\n /// Add `is-expanded` class\r\n | [] IsExpanded\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Label =\r\n\r\n type Option =\r\n | Size of ISize\r\n /// Add `is-normal` class\r\n | [] IsNormal\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
\r\n let body (options : GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"field-body\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let label options children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Label.Size size -> ofSize size |> result.AddClass\r\n | Label.IsNormal -> result.AddCaseName option\r\n | Label.Props props -> result.AddProps props\r\n | Label.CustomClass customClass -> result.AddClass customClass\r\n | Label.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"field-label\").ToReactElement(div, children)\r\n\r\n let internal fieldView element options children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | HasAddonsCentered -> result.AddClass(\"has-addons\").AddCaseName option\r\n | HasAddonsRight -> result.AddClass(\"has-addons\").AddCaseName option\r\n | HasAddonsFullWidth -> result.AddClass(\"has-addons\").AddCaseName option\r\n | IsGroupedCentered -> result.AddClass(\"is-grouped\").AddCaseName option\r\n | IsGroupedRight -> result.AddClass(\"is-grouped\").AddCaseName option\r\n | IsGroupedMultiline -> result.AddClass(\"is-grouped\").AddCaseName option\r\n | HasAddons\r\n | IsGrouped\r\n | IsHorizontal\r\n | IsExpanded -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"field\").ToReactElement(element, children)\r\n\r\n /// Generate
\r\n let div x y = fieldView div x y\r\n /// Generate

\r\n let p x y = fieldView p x y\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Label =\r\n\r\n type Option =\r\n | Size of ISize\r\n /// Set `For` HTMLAttr\r\n | For of string\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate \r\n let label options children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Size size -> ofSize size |> result.AddClass\r\n | For htmlFor -> HtmlFor htmlFor |> result.AddProp\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"label\").ToReactElement(label, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Control =\r\n\r\n type Option =\r\n /// Add `has-icons-right` class\r\n | [] HasIconRight\r\n /// Add `has-icons-left` class\r\n | [] HasIconLeft\r\n /// Add `is-loading` class if true\r\n | [] IsLoading of bool\r\n /// Add `is-expanded` class\r\n | [] IsExpanded\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let internal controlView element options children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | HasIconRight\r\n | HasIconLeft\r\n | IsExpanded -> result.AddCaseName option\r\n | IsLoading state -> if state then result.AddCaseName option else result\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"control\").ToReactElement(element, children)\r\n\r\n /// Generate
\r\n let div x y = controlView div x y\r\n /// Generate

\r\n let p x y = controlView p x y\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\nopen Browser.Types\r\n\r\n[]\r\nmodule Input =\r\n\r\n module Classes =\r\n let [] Container = \"input\"\r\n module State =\r\n let [] IsFocused = \"is-focused\"\r\n let [] IsActive = \"is-active\"\r\n let [] IsHovered = \"is-hovered\"\r\n let [] IsLoading = \"is-loading\"\r\n let [] IsStatic = \"is-static\"\r\n module Styles =\r\n let [] IsRounded = \"is-rounded\"\r\n module Size =\r\n let [] IsSmall = \"is-small\"\r\n let [] IsMedium = \"is-medium\"\r\n let [] IsLarge = \"is-large\"\r\n let [] IsFullwidth = \"is-fullwidth\"\r\n let [] IsInline = \"is-inline\"\r\n\r\n type IInputType =\r\n | Text\r\n | Password\r\n | DatetimeLocal\r\n | Date\r\n | Month\r\n | Time\r\n | Week\r\n | Number\r\n | Email\r\n | Url\r\n | Search\r\n | Tel\r\n | ColorType\r\n\r\n type Option =\r\n | Size of ISize\r\n /// Set `Type` HTMLAttr\r\n /// Don't use if you used one of the helpers like: `Input.password`\r\n | Type of IInputType\r\n | Color of IColor\r\n /// Set `Id` HTMLAttr\r\n | Id of string\r\n /// Add `disabled` HTMLAttr if true\r\n | Disabled of bool\r\n /// Set `IsReadOnly` HTMLAttr\r\n | IsReadOnly of bool\r\n /// Add `is-static` class if true\r\n | [] IsStatic of bool\r\n /// Add `is-rounded` class\r\n | [] IsRounded\r\n /// Set `Value` HTMLAttr\r\n | Value of string\r\n | Key of string\r\n /// Set `DefaultValue` HTMLAttr\r\n | DefaultValue of string\r\n /// `Ref` callback that sets the value of an input textbox after DOM element is created.\r\n | ValueOrDefault of string\r\n /// Set `Placeholder` HTMLAttr\r\n | Placeholder of string\r\n | OnChange of (Event -> unit)\r\n | Ref of (Element->unit)\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let private ofType (typ : IInputType) =\r\n match typ with\r\n | Text -> \"text\"\r\n | Password -> \"password\"\r\n | DatetimeLocal -> \"datetime-local\"\r\n | Date -> \"date\"\r\n | Month -> \"month\"\r\n | Time -> \"time\"\r\n | Week -> \"week\"\r\n | Number -> \"number\"\r\n | Email -> \"email\"\r\n | Url -> \"url\"\r\n | Search -> \"search\"\r\n | Tel -> \"tel\"\r\n | IInputType.ColorType -> \"color\"\r\n\r\n open Fable.Core.JsInterop\r\n\r\n /// Generate \r\n let input (options : Option list) =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsStatic state -> if state then result.AddCaseName option else result\r\n | IsRounded -> result.AddCaseName option\r\n | Size size -> ofSize size |> result.AddClass\r\n | Color color -> ofColor color |> result.AddClass\r\n | Type type' -> Props.Type (ofType type') |> result.AddProp\r\n | Id id -> Props.Id id |> result.AddProp\r\n | Disabled disabled -> Props.Disabled disabled |> result.AddProp\r\n | IsReadOnly state -> Props.ReadOnly state |> result.AddProp\r\n | Value value -> Props.Value value |> result.AddProp\r\n | DefaultValue defaultValue -> Props.DefaultValue defaultValue |> result.AddProp\r\n | ValueOrDefault valueOrDefault ->\r\n Props.Ref <| (fun e ->\r\n if e |> isNull |> not\r\n && !!e?value <> valueOrDefault then\r\n e?value <- valueOrDefault\r\n ) |> result.AddProp\r\n | Placeholder placeholder -> Props.Placeholder placeholder |> result.AddProp\r\n | OnChange cb -> Props.OnChange cb |> result.AddProp\r\n | Ref ref -> Props.Ref ref |> result.AddProp\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n | Key k -> Props.Prop.Key k |> result.AddProp\r\n\r\n GenericOptions.Parse(options, parseOptions, \"input\").ToReactElement(input)\r\n\r\n /// Generate \r\n let inline text options = input (Type Text :: options)\r\n /// Generate \r\n let inline password options = input (Type Password :: options)\r\n /// Generate \r\n let inline datetimeLocal options = input (Type DatetimeLocal :: options)\r\n /// Generate \r\n let inline date options = input (Type Date :: options)\r\n /// Generate \r\n let inline month options = input (Type Month :: options)\r\n /// Generate \r\n let inline time options = input (Type Time :: options)\r\n /// Generate \r\n let inline week options = input (Type Week :: options)\r\n /// Generate \r\n let inline number options = input (Type Number :: options)\r\n /// Generate \r\n let inline email options = input (Type Email :: options)\r\n /// Generate \r\n let inline url options = input (Type Url :: options)\r\n /// Generate \r\n let inline search options = input (Type Search :: options)\r\n /// Generate \r\n let inline tel options = input (Type Tel :: options)\r\n /// Generate \r\n let inline color options = input (Type IInputType.ColorType :: options)\r\n","namespace Shared.Infrastructure\n\nopen System\n\n[]\nmodule String =\n let toOption (str: string) =\n if System.String.IsNullOrWhiteSpace str then\n None\n else\n Some str\n\n let fromOption (maybeString: string option) =\n match maybeString with\n | Some str -> str\n | None -> \"\"\n\n let join (separator: string) (strings: string list) = String.Join(separator, strings)\n\n let replace (search: string) (replace: string) (str: string) : string = str.Replace(search, replace)","[]\r\nmodule Fable.React.Extensions\r\n\r\ntype Browser.Types.Event with\r\n /// Access the value from target\r\n /// Equivalent to `(this.target :?> HTMLInputElement).value`\r\n member this.Value =\r\n (this.target :?> Browser.Types.HTMLInputElement).value\r\n\r\n /// Access the checked property from target\r\n /// Equivalent to `(this.target :?> HTMLInputElement).checked`\r\n member this.Checked =\r\n (this.target :?> Browser.Types.HTMLInputElement).``checked``\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Level =\r\n\r\n module Level =\r\n\r\n type Option =\r\n | Props of IHTMLProp list\r\n /// Add `is-mobile` class\r\n | [] IsMobile\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Item =\r\n\r\n type Option =\r\n | Props of IHTMLProp list\r\n /// Add `has-text-centered` class\r\n | [] HasTextCentered\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate \r\n let level (options : Level.Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Level.Option.IsMobile -> result.AddCaseName option\r\n | Level.Props props -> result.AddProps props\r\n | Level.CustomClass customClass -> result.AddClass customClass\r\n | Level.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"level\").ToReactElement(nav, children)\r\n\r\n /// Generate
\r\n let left (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"level-left\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let right (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"level-right\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let item (options : Item.Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Item.HasTextCentered -> result.AddCaseName option\r\n | Item.Props props -> result.AddProps props\r\n | Item.CustomClass customClass -> result.AddClass customClass\r\n | Item.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"level-item\").ToReactElement(div, children)\r\n\r\n /// Generate

\r\n let heading (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"heading\").ToReactElement(p, children)\r\n\r\n /// Generate

\r\n let title (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"title\").ToReactElement(p, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Hero =\r\n\r\n type Option =\r\n /// Add `is-bold` class\r\n | [] IsBold\r\n /// Add `is-medium` class\r\n | [] IsMedium\r\n /// Add `is-large` class\r\n | [] IsLarge\r\n /// Add `is-halfheight` class\r\n | [] IsHalfHeight\r\n /// Add `is-fullheight-with-navbar` class\r\n | [] IsFullheightWithNavbar\r\n /// Add `is-fullheight` class\r\n | [] IsFullHeight\r\n | Color of IColor\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
\r\n let hero (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsMedium\r\n | IsLarge\r\n | IsHalfHeight\r\n | IsFullHeight\r\n | IsFullheightWithNavbar\r\n | IsBold -> result.AddCaseName option\r\n | Color color -> ofColor color |> result.AddClass\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"hero\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let head (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"hero-head\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let body (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"hero-body\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let foot (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"hero-foot\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let video (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"hero-video\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let buttons (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"hero-buttons\").ToReactElement(div, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Container =\r\n\r\n type Option =\r\n /// Add `is-fluid` class\r\n | [] IsFluid\r\n /// Add `is-widescreen` class\r\n | [] IsWideScreen\r\n /// Add `is-fullhd` class\r\n | [] IsFullHD\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
\r\n let container (options: Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsFluid\r\n | IsWideScreen\r\n | IsFullHD -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"container\").ToReactElement(div, children)\r\n","module Client.Page.Login\n\nopen Client.Infrastructure.Api\nopen Client\nopen Client.Components\nopen Client.DomainTypes.Msg\nopen Client.DomainTypes\nopen Elmish\nopen Fable.FontAwesome\nopen Fulma\nopen Shared\nopen Fable.React\nopen Shared.Dto.Dto\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\ntype LoginModel = {\n Mail: string option\n Password: string option\n RequestRunning: bool\n Target: Route\n}\n\ntype Model =\n | Login of LoginModel\n | Loading\n\nlet init (route: Route) (session: Session) : Model * Cmd =\n let model = {\n Mail = None\n Password = None\n RequestRunning = false\n Target = route\n }\n\n match session with\n | Anonymous -> Login model, Cmd.none\n | UserSession _ -> Login model, Cmd.ofMsg (GoToRoute route |> Global)\n\n\nlet update (msg: LoginMsg) (model: Model) : Model * Cmd =\n match (msg, model) with\n | LoginMsg.MailUpdated mail, Login loginModel -> Login { loginModel with Mail = mail }, Cmd.none\n | LoginMsg.PasswordChanged password, Login loginModel -> Login { loginModel with Password = password }, Cmd.none\n | LoginMsg.LoginButtonPressed data, Login loginModel ->\n let cmd = Cmd.OfAsync.perform api.login data LoginResult\n\n Login { loginModel with RequestRunning = true }, Cmd.map Msg.Login cmd\n | LoginMsg.LoginResult response, Login loginModel ->\n match response with\n | Unsuccessful message ->\n let toastCmd = Toast.create message |> Toast.error\n\n Login { loginModel with RequestRunning = false }, toastCmd\n | Successful userSession ->\n Login { loginModel with RequestRunning = false }, Cmd.ofMsg (GoToRoute loginModel.Target |> Global)\n | _, _ -> model, Cmd.none\n\nlet buttonOptions (model: LoginModel) dispatch =\n let maybeRequestData =\n Option.map2\n (fun mail password -> {\n Mail = mail\n Password = password\n })\n model.Mail\n model.Password\n\n let buttonOptions = [\n Button.Color IsLink\n Button.IsLoading model.RequestRunning\n Button.Disabled(Option.isNone maybeRequestData)\n ]\n\n maybeRequestData\n |> Option.map (fun requestData ->\n SubmitButton.onClick (fun _ -> dispatch (LoginButtonPressed requestData |> Msg.Login))\n )\n |> List.addToListIfSome buttonOptions\n\nlet containerBox (model: LoginModel) (dispatch: Msg.Msg -> unit) =\n Box.box' [] [\n form [] [\n Field.div [] [\n Label.label [] [ str \"E-Mail Adresse\" ]\n Control.div [ Control.HasIconLeft ] [\n Input.email [\n Input.Id \"mail\"\n Input.Value(String.fromOption model.Mail)\n Input.Placeholder \"z. B. max.mustermann@example.com\"\n Input.OnChange(fun x -> LoginMsg.MailUpdated(String.toOption x.Value) |> Msg.Login |> dispatch)\n ]\n\n Icon.icon [ Icon.Size IsSmall; Icon.IsLeft ] [ Fa.i [ Fa.Solid.Envelope ] [] ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Passwort\" ]\n Control.div [ Control.HasIconLeft ] [\n Input.password [\n Input.Id \"password\"\n Input.Value(String.fromOption model.Password)\n Input.Placeholder \"z. B. 1234\"\n Input.OnChange(fun x ->\n LoginMsg.PasswordChanged(String.toOption x.Value) |> Msg.Login |> dispatch\n )\n ]\n\n Icon.icon [ Icon.Size IsSmall; Icon.IsLeft ] [ Fa.i [ Fa.Solid.Key ] [] ]\n ]\n ]\n Level.level [] [\n Level.left [] [\n Level.item [] [\n Control.p [] [\n Button.a [\n Button.Color IsLight\n Button.OnClick(fun _ -> dispatch (GoToRoute Route.PasswordLost |> Global))\n ] [ str \"Passwort vergessen?\" ]\n ]\n ]\n ]\n Level.right [] [\n Level.item [] [\n Control.p [] [\n Button.button (buttonOptions model dispatch) [\n Icon.icon [] [ Fa.i [ Fa.Solid.SignInAlt ] [] ]\n span [] [ str \"Einloggen\" ]\n ]\n ]\n ]\n ]\n ]\n ]\n ]\n\nlet loginView (model: LoginModel) dispatch =\n Hero.body [] [\n Container.container [] [\n Column.column [\n Column.Width(Screen.All, Column.Is6)\n Column.Offset(Screen.All, Column.Is3)\n ] [\n Heading.p [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ] [ str \"MySens - Login\" ]\n containerBox model dispatch\n ]\n ]\n ]\n\nlet loadingView: ReactElement =\n Hero.body [] [\n Container.container [] [\n Column.column [\n Column.Width(Screen.All, Column.Is6)\n Column.Offset(Screen.All, Column.Is3)\n ] [\n Heading.p [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ] [ str \"Wird geladen\" ]\n ]\n ]\n ]\n\nlet view (model: Model) dispatch =\n match model with\n | Login loginModel -> loginView loginModel dispatch\n | Loading -> loadingView","namespace Client.Infrastructure\n\nopen Browser.Types\nopen Client.DomainTypes\nopen Client.DomainTypes.Msg\n\nmodule Clickable =\n let onClickPreventDefault (f: MouseEvent -> unit) (event: MouseEvent) =\n event.preventDefault ()\n\n f event\n\n let goToRouteMsg (route: Route) = GoToRoute route |> Global\n\n let onClickGoToRoute (dispatch: Msg -> unit) (route: Route) (event: MouseEvent) =\n let f _ = route |> goToRouteMsg |> dispatch\n\n onClickPreventDefault f event","namespace Elmish\n\n\n[]\n[]\nmodule internal Option =\n\n let tuple a b =\n match (a,b) with\n | Some a, Some b -> Some (a,b)\n | _ -> None\n\n let ofFunc f arg =\n try\n Some (f arg)\n with _ ->\n None","(** UrlParser\n------\nThis port of the Elm library helps you turn URLs into nicely structured data.\nIt is designed to be used with `Navigation` module to help folks create\nsingle-page applications (SPAs) where you manage browser navigation yourself.\n*)\n\nmodule Elmish.UrlParser\n\n\n(**\n#### Types\n*)\n\ntype State<'v> =\n { visited : string list\n unvisited : string list\n args : Map\n value : 'v }\n\n[]\n[]\nmodule internal State =\n let mkState visited unvisited args value =\n { visited = visited\n unvisited = unvisited\n args = args\n value = value }\n\n let map f { visited = visited; unvisited = unvisited; args = args; value = value } =\n { visited = visited\n unvisited = unvisited\n args = args\n value = f value }\n\n\n/// Turn URLs like `/blog/42/cat-herding-techniques` into nice data.\ntype Parser<'a,'b> = State<'a> -> State<'b> list\n\n\n(**\n#### Parse segments\nCreate a custom path segment parser. You can use it to define something like “only CSS files” like this:\n```\n let css =\n custom \"CSS_FILE\" <| fun segment ->\n if String.EndsWith \".css\" then\n Ok segment\n else\n Error \"Does not end with .css\"\n```\n*)\nlet custom tipe (stringToSomething: string->Result<_,_>) : Parser<_,_> =\n let inner { visited = visited; unvisited = unvisited; args = args; value = value } =\n match unvisited with\n | [] -> []\n | next :: rest ->\n match stringToSomething next with\n | Ok nextValue ->\n [ State.mkState (next :: visited) rest args (value nextValue) ]\n\n | Error msg ->\n []\n inner\n\n\n(** Parse a segment of the path as a `string`.\n```\n parse str location\n```\n
\n    /alice/  ==>  Some \"alice\"\n    /bob     ==>  Some \"bob\"\n    /42/     ==>  Some \"42\"\n
\n*)\nlet str state =\n custom \"string\" Ok state\n\n\n(** Parse a segment of the path as an `int`.\n```\n parse i32 location\n```\n
\n    /alice/  ==>  None\n    /bob     ==>  None\n    /42/     ==>  Some 42\n
\n*)\nlet i32 state =\n custom \"i32\" (System.Int32.TryParse >> function true, value -> Ok value | _ -> Error \"Can't parse int\" ) state\n\n\n(** Parse a segment of the path if it matches a given string.\n```\n s \"blog\" // can parse /blog/\n // but not /glob/ or /42/ or anything else\n```\n*)\nlet s str : Parser<_,_> =\n let inner { visited = visited; unvisited = unvisited; args = args; value = value } =\n match unvisited with\n | [] -> []\n | next :: rest ->\n if next = str then\n [ State.mkState (next :: visited) rest args value ]\n else\n []\n inner\n\n\n\n(**\n#### Combining parsers\nParse a path with multiple segments.\n\n```\n parse (s \"blog\" i32) location\n```\n
\n    /blog/35/  ==>  Some 35\n    /blog/42   ==>  Some 42\n    /blog/     ==>  None\n    /42/       ==>  None\n
\n```\n parse (s \"search\" str) location\n```\n
\n    /search/cats/  ==>  Some \"cats\"\n    /search/frog   ==>  Some \"frog\"\n    /search/       ==>  None\n    /cats/         ==>  None\n
\n*)\nlet inline () (parseBefore: Parser<_,_>) (parseAfter: Parser<_,_>) =\n fun state ->\n List.collect parseAfter (parseBefore state)\n\n\n(** Transform a path parser.\n```\n type Comment = { author : string; id : int }\n rawComment =\n s \"user\" str s \"comments\" i32\n comment =\n map (fun a id -> { author = a; id = id }) rawComment\n parse comment location\n```\n
\n    /user/bob/comments/42  ==>  Some { author = \"bob\"; id = 42 }\n    /user/tom/comments/35  ==>  Some { author = \"tom\"; id = 35 }\n    /user/sam/             ==>  None\n
\n*)\nlet map (subValue: 'a) (parse: Parser<'a,'b>) : Parser<'b->'c,'c> =\n let inner { visited = visited; unvisited = unvisited; args = args; value = value } =\n List.map (State.map value)\n <| parse { visited = visited\n unvisited = unvisited\n args = args\n value = subValue }\n inner\n\n\n\n(** Try a bunch of different path parsers.\n```\n type Route\n = Search of string\n | Blog of int\n | User of string\n | Comment of string*int\n route =\n oneOf\n [ map Search (s \"search\" str)\n map Blog (s \"blog\" i32)\n map User (s \"user\" str)\n map (fun u c -> Comment (u,c)) (s \"user\" str \"comments\" i32) ]\n parse route location\n```\n
\n    /search/cats           ==>  Some (Search \"cats\")\n    /search/               ==>  None\n    /blog/42               ==>  Some (Blog 42)\n    /blog/cats             ==>  None\n    /user/sam/             ==>  Some (User \"sam\")\n    /user/bob/comments/42  ==>  Some (Comment \"bob\" 42)\n    /user/tom/comments/35  ==>  Some (Comment \"tom\" 35)\n    /user/                 ==>  None\n
\n*)\nlet oneOf parsers state =\n List.collect (fun parser -> parser state) parsers\n\n\n(** A parser that does not consume any path segments.\n```\n type BlogRoute = Overview | Post of int\n blogRoute =\n oneOf\n [ map Overview top\n map Post (s \"post\" i32) ]\n parse (s \"blog\" blogRoute) location\n```\n
\n    /blog/         ==>  Some Overview\n    /blog/post/42  ==>  Some (Post 42)\n
\n*)\nlet top state=\n [state]\n\n\n\n(**\n#### Query parameters\nTurn query parameters like `?name=tom&age=42` into nice data.\n\n*)\n\ntype QueryParser<'a,'b> = State<'a> -> State<'b> list\n\n\n(** Parse some query parameters.\n```\n type Route = BlogList (Option string) | BlogPost Int\n route =\n oneOf\n [ map BlogList (s \"blog\" stringParam \"search\")\n map BlogPost (s \"blog\" i32) ]\n parse route location\n```\n
\n    /blog/              ==>  Some (BlogList None)\n    /blog/?search=cats  ==>  Some (BlogList (Some \"cats\"))\n    /blog/42            ==>  Some (BlogPost 42)\n
\n*)\nlet inline () (parser: Parser<_,_>) (queryParser:QueryParser<_,_>) : Parser<_,_> =\n fun state ->\n List.collect queryParser (parser state)\n\n(** Create a custom query parser. You could create parsers like these:\n```\n val jsonParam : string -> Decoder a -> QueryParser (Option a -> b) b\n val enumParam : string -> Map -> QueryParser (Option a -> b) b\n```\n*)\nlet customParam (key: string) (func: string option -> _) : QueryParser<_,_> =\n let inner { visited = visited; unvisited = unvisited; args = args; value = value } =\n [ State.mkState visited unvisited args (value (func (Map.tryFind key args))) ]\n inner\n\n\n(** Parse a query parameter as a `string`.\n```\n parse (s \"blog\" stringParam \"search\") location\n```\n
\n    /blog/              ==>  Some (Overview None)\n    /blog/?search=cats  ==>  Some (Overview (Some \"cats\"))\n
\n*)\nlet stringParam name =\n customParam name id\n\nlet internal intParamHelp =\n Option.bind\n (fun (value: string) ->\n match System.Int32.TryParse value with\n | (true,x) -> Some x\n | _ -> None)\n\n(** Parse a query parameter as an `int`. Option you want to show paginated\nsearch results. You could have a `start` query parameter to say which result\nshould appear first.\n```\n parse (s \"results\" intParam \"start\") location\n```\n
\n    /results           ==>  Some None\n    /results?start=10  ==>  Some (Some 10)\n
\n*)\nlet intParam name =\n customParam name intParamHelp\n\n\n// PARSER HELPERS\n\nlet rec internal parseHelp states =\n match states with\n | [] ->\n None\n | state :: rest ->\n match state.unvisited with\n | [] ->\n Some state.value\n | [\"\"] ->\n Some state.value\n | _ ->\n parseHelp rest\n\nlet internal splitUrl (url: string) =\n match List.ofArray <| url.Split([|'/'|]) with\n | \"\" :: segments ->\n segments\n | segments ->\n segments\n\n/// parse a given part of the location\nlet parse (parser: Parser<'a->'a,'a>) url args =\n { visited = []\n unvisited = splitUrl url\n args = args\n value = id }\n |> parser\n |> parseHelp\n\nopen Fable.Core\n\nlet internal toKeyValuePair (segment: string) =\n match segment.Split('=') with\n | [| key; value |] ->\n Option.tuple (Option.ofFunc JS.decodeURIComponent key) (Option.ofFunc JS.decodeURIComponent value)\n | _ -> None\n\n\nlet internal parseParams (querystring: string) =\n if querystring.Length > 1 then\n querystring.Substring(1).Split('&')\n |> Seq.map toKeyValuePair\n |> Seq.choose id\n |> Map.ofSeq\n else Map.empty\n\nopen Browser.Types\n\n(**\n#### Parsers\nParse based on `location.pathname` and `location.search`. This parser\nignores the hash entirely.\n*)\nlet parsePath (parser: Parser<_,_>) (location: Location) =\n parse parser location.pathname (parseParams location.search)\n\n(** Parse based on `location.hash`. This parser ignores the normal\npath entirely.\n*)\nlet parseHash (parser: Parser<_,_>) (location: Location) =\n let hash, search =\n let hash =\n if location.hash.Length > 1 then location.hash.Substring 1\n else \"\"\n if hash.Contains(\"?\") then\n let h = hash.Substring(0, hash.IndexOf(\"?\"))\n h, hash.Substring(h.Length)\n else\n hash, \"?\"\n\n parse parser hash (parseParams search)\n","namespace Client.Domain\n\nopen Client\nopen Client.DomainTypes\nopen Elmish\nopen Elmish.UrlParser\n\n[]\nmodule Routing =\n let parseRoute: Parser Route, Route> =\n oneOf [\n map Home top\n map PublicMap (s \"public-map\")\n map Login (s \"login\")\n map TtnSensorList (s \"physical-sensor-list\")\n map MySensSensorList (s \"my-sens-sensor-list\")\n map GatewayList (s \"gateway-list\")\n map UserList (s \"user-list\")\n map (SensorMap None) (s \"sensor-map\")\n map MySettings (s \"my-settings\")\n map PasswordLost (s \"password-lost\")\n map ResetPassword (s \"reset-password\" str)\n map CalculationConfiguration (s \"calculation-configuration\")\n map MySensSensor (s \"mysens-sensor\" i32)\n map AlertsList (s \"alerts-list\")\n map MyAlerts (s \"my-alerts\")\n map MySensorsData (s \"my-sensors-data\")\n map UserDefinedMapSensorProperties (s \"map-sensor-properties\" i32)\n map MyMapSensors (s \"my-map-sensors\")\n map RimPro (s \"disease-models\" s \"rim-pro\")\n map MyGateways (s \"my-gateways\")\n map ScabData (s \"scab-data\" i32)\n map MyScabStations (s \"my-scab-stations\")\n map MyUserGroups (s \"my-user-groups\")\n map MyPeronosporaStations (s \"my-peronospora-stations\")\n map PeronosporaData (s \"peronospora-data\" i32)\n map GroupList (s \"group-list\")\n ]\n\n let routeToUrl route =\n match route with\n | Home -> \"/\"\n | TtnSensorList -> \"/physical-sensor-list\"\n | Login -> \"/login\"\n | MySensSensorList -> \"/my-sens-sensor-list\"\n | GatewayList -> \"/gateway-list\"\n | UserList -> \"/user-list\"\n | SensorMap _ -> \"/sensor-map\"\n | PublicMap -> \"/public-map\"\n | MySettings -> \"/my-settings\"\n | PasswordLost -> \"/password-lost\"\n | CalculationConfiguration -> \"/calculation-configuration\"\n | ResetPassword token -> sprintf \"/reset-password/%s\" token\n | MySensSensor id -> sprintf \"/mysens-sensor/%d\" id\n | AlertsList -> \"/alerts-list\"\n | MyAlerts -> \"/my-alerts\"\n | MySensorsData -> \"/my-sensors-data\"\n | UserDefinedMapSensorProperties id -> sprintf \"/map-sensor-properties/%d\" id\n | MyMapSensors -> \"/my-map-sensors\"\n | RimPro -> \"/disease-models/rim-pro\"\n | MyGateways -> \"/my-gateways\"\n | NotFound -> failwith \"NotFound Page doesn't have a route\"\n | ScabData id -> sprintf \"/scab-data/%d\" id\n | MyScabStations -> \"/my-scab-stations\"\n | MyUserGroups -> \"/my-user-groups\"\n | MyPeronosporaStations -> \"/my-peronospora-stations\"\n | PeronosporaData id -> sprintf \"/peronospora-data/%d\" id\n | GroupList -> \"/group-list\"\n\n let routeToAdditionalCommands route =\n match route with\n | SensorMap(Some location) -> Msg.MapMsg.MoveToLocation location |> Msg.Map |> Cmd.ofMsg\n | _ -> Cmd.none","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\nopen Browser.Types\r\n\r\n[]\r\nmodule Navbar =\r\n\r\n type Option =\r\n | Color of IColor\r\n /// Add `has-shadow` class\r\n | [] HasShadow\r\n /// Add `is-transparent` class\r\n | [] IsTransparent\r\n /// Add `is-fixed-top` class\r\n /// You also need to add `has-navbar-fixed-top` to your html tag\r\n | [] IsFixedTop\r\n /// Add `is-fixed-bottom` class\r\n /// You also need to add `has-navbar-fixed-bottom` to your html tag\r\n | [] IsFixedBottom\r\n /// Add `is-spaced` class\r\n /// Increases horizontal and vertical padding of the navbar\r\n | [] IsSpaced\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Menu =\r\n\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Burger =\r\n\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n | OnClick of (MouseEvent -> unit)\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Item =\r\n\r\n type Option =\r\n /// Add `is-tab` class\r\n | [] IsTab\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n /// Add `is-hoverable` class\r\n | [] IsHoverable\r\n /// Add `has-dropdown` class\r\n | [] HasDropdown\r\n /// Add `is-expanded` class\r\n | [] IsExpanded\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let internal item element options children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsActive state -> if state then result.AddCaseName option else result\r\n | IsExpanded\r\n | IsTab\r\n | IsHoverable\r\n | HasDropdown -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"navbar-item\").ToReactElement(element, children)\r\n\r\n /// Generate
\r\n let div x y = item div x y\r\n /// Generate \r\n let a x y = item a x y\r\n\r\n module Link =\r\n\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n /// Add `is-arrowless`\r\n | [] IsArrowless\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let internal link element (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsActive state -> if state then result.AddCaseName option else result\r\n | IsArrowless -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"navbar-link\").ToReactElement(element, children)\r\n\r\n /// Generate
\r\n let div x y = link div x y\r\n /// Generate \r\n let a x y = link a x y\r\n\r\n module Dropdown =\r\n\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n /// Add `is-boxed` class\r\n | [] IsBoxed\r\n /// Add `is-right` class\r\n | [] IsRight\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let internal dropdown element (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsActive state -> if state then result.AddCaseName option else result\r\n | IsBoxed\r\n | IsRight -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"navbar-dropdown\").ToReactElement(element, children)\r\n\r\n /// Generate
\r\n let div x y = dropdown div x y\r\n /// Generate \r\n let a x y = dropdown a x y\r\n\r\n module Brand =\r\n let internal brand element (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"navbar-brand\").ToReactElement(element, children)\r\n\r\n /// Generate
\r\n let div x y = brand div x y\r\n /// Generate \r\n let a x y = brand a x y\r\n\r\n module Start =\r\n let internal start element (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"navbar-start\").ToReactElement(element, children)\r\n\r\n /// Generate
\r\n let div x y = start div x y\r\n /// Generate \r\n let a x y = start a x y\r\n\r\n module End =\r\n let internal ``end`` element (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"navbar-end\").ToReactElement(element, children)\r\n\r\n /// Generate
\r\n let div x y = ``end`` div x y\r\n /// Generate \r\n let a x y = ``end`` a x y\r\n\r\n /// Generate \r\n let navbar (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | HasShadow\r\n | IsFixedTop\r\n | IsFixedBottom\r\n | IsTransparent\r\n | IsSpaced -> result.AddCaseName option\r\n | Color color -> ofColor color |> result.AddClass\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"navbar\").ToReactElement(nav, children)\r\n\r\n /// Generate
\r\n let menu options children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Menu.IsActive state -> if state then result.AddCaseName option else result\r\n | Menu.Props props -> result.AddProps props\r\n | Menu.CustomClass customClass -> result.AddClass customClass\r\n | Menu.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"navbar-menu\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let burger options children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Burger.IsActive state -> if state then result.AddCaseName option else result\r\n | Burger.OnClick cb -> DOMAttr.OnClick cb |> result.AddProp\r\n | Burger.Props props -> result.AddProps props\r\n | Burger.CustomClass customClass -> result.AddClass customClass\r\n | Burger.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"navbar-burger\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let content (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"navbar-content\").ToReactElement(div, children)\r\n\r\n /// Generate
\r\n let divider (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"navbar-divider\").ToReactElement(div, children)\r\n","module Client.Domain.PageSkeleton\n\nopen Client.Domain\nopen Client.Infrastructure\nopen Client.DomainTypes\nopen Fable.FontAwesome\nopen Fable.React.Props\nopen Fulma\n\nopen Fable.React\nopen Client.DomainTypes.Msg\nopen Shared.Dto.User\nopen Shared.Infrastructure\n\n\nlet mySensFooter =\n Columns.columns [\n Columns.IsCentered\n Columns.Modifiers [\n Modifier.BackgroundColor Color.IsLight\n Modifier.Spacing(Spacing.MarginTop, Spacing.Is4)\n ]\n Columns.IsGapless\n ] [\n Column.column [ Column.Width(Screen.All, Column.Is6) ] [\n Level.level [\n Level.Level.Modifiers [\n Modifier.Spacing(Spacing.PaddingTopAndBottom, Spacing.Is1)\n ]\n ] [\n Level.item [ Level.Item.HasTextCentered ] [\n a [\n Href \"https://mysens.eu/datenschutzerklaerung-mysens-network/\"\n Target \"_blank\"\n ] [ str \"Datenschutzerklärung\" ]\n ]\n Level.item [ Level.Item.HasTextCentered ] [\n a [\n Href \"https://mysens.eu/nutzungsbedingungen-mysens-network/\"\n Target \"_blank\"\n ] [ str \"Nutzungsbedingungen\" ]\n ]\n Level.item [ Level.Item.HasTextCentered ] [\n a [\n Href \"https://mysens.eu/impressum-mysens-network/\"\n Target \"_blank\"\n ] [ str \"Impressum\" ]\n ]\n ]\n ]\n ]\n\nlet adminMenu (user: UserDto) dispatch =\n let navbarProps (route: Route) : IHTMLProp list = [\n Clickable.onClickGoToRoute dispatch route |> OnClick\n Href(Routing.routeToUrl route)\n ]\n\n match user.Role with\n | Admin ->\n Some\n <| Navbar.Item.div [\n Navbar.Item.HasDropdown\n Navbar.Item.IsHoverable\n ] [\n Navbar.Link.a [] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Tools ] [] ]\n span [] [ str \"Administration\" ]\n ]\n Navbar.Dropdown.div [] [\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.TtnSensorList)\n ] [ str \"Physikalische Sensoren\" ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.MySensSensorList)\n ] [ str \"Karten Sensoren\" ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.GatewayList)\n ] [ str \"Gateways\" ]\n Navbar.Item.a [ Navbar.Item.Props(navbarProps Route.UserList) ] [ str \"Benutzer\" ]\n Navbar.Item.a [ Navbar.Item.Props(navbarProps Route.GroupList) ] [ str \"Benutzergruppen\" ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.AlertsList)\n ] [ str \"Aktive Bewarnungen\" ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.CalculationConfiguration)\n ] [ str \"Konfiguration Berechnungsmodelle\" ]\n ]\n ]\n | Role.RegularUser\n | Role.TestUser -> None\n\n\nlet navbarStart (user: UserDto) isBurgerOpen dispatch =\n let navbarProps (route: Route) : IHTMLProp list = [\n Clickable.onClickGoToRoute dispatch route |> OnClick\n Href(Routing.routeToUrl route)\n ]\n\n let items = [\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps (Route.SensorMap None))\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.MapMarkedAlt ] [] ]\n span [] [ str \"Karte\" ]\n ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.MySensorsData)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.ChartLine ] [] ]\n span [] [ str \"Messwerte\" ]\n ]\n Navbar.Item.a [ Navbar.Item.Props(navbarProps Route.MyAlerts) ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.ExclamationTriangle ] [] ]\n span [] [ str \"Bewarnung\" ]\n ]\n Navbar.Item.div [\n Navbar.Item.HasDropdown\n Navbar.Item.IsHoverable\n ] [\n Navbar.Link.a [] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Bug ] [] ]\n span [] [ str \"Schadmodelle\" ]\n ]\n Navbar.Dropdown.div [] [\n Navbar.Item.a [ Navbar.Item.Props(navbarProps Route.RimPro) ] [ str \"RimPro Schorf\" ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.MyScabStations)\n ] [ str \"Mills Schorf\" ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.MyPeronosporaStations)\n ] [ str \"Peronospora\" ]\n ]\n ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.MyGateways)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.BroadcastTower ] [] ]\n span [] [ str \"Empfänger\" ]\n ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.MyMapSensors)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Cog ] [] ]\n span [] [ str \"Sensoren\" ]\n ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.MyUserGroups)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Users ] [] ]\n span [] [ str \"Gruppen\" ]\n ]\n Navbar.Item.a [\n Navbar.Item.Props(navbarProps Route.MySettings)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.SlidersH ] [] ]\n span [] [ str \"Einstellungen\" ]\n ]\n Navbar.Item.a [\n Navbar.Item.Props [\n Href \"https://mysens.eu/mysens-faq_4738ug519825dxis677s87gd628jw99o1/\"\n Target \"_blank\"\n ]\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.InfoCircle ] [] ]\n span [] [ str \"Hilfe\" ]\n ]\n ]\n\n adminMenu user dispatch |> List.addToListIfSome items\n\n\nlet navbar (user: UserDto) isBurgerOpen dispatch =\n Navbar.navbar [\n Navbar.Color Color.IsLight\n Navbar.Props [ Style [ Height \"3.25rem\" ] ]\n ] [\n Navbar.Brand.div [] [\n Navbar.Item.a [\n Navbar.Item.Props [\n Clickable.onClickGoToRoute dispatch Route.Home |> OnClick\n ]\n ] [ img [ Src \"/mysens_logo.png\" ] ]\n Navbar.burger [\n Navbar.Burger.OnClick(fun _ -> dispatch (Global ToggleBurger))\n Navbar.Burger.IsActive isBurgerOpen\n ] [ span [] []; span [] []; span [] [] ]\n ]\n Navbar.menu [ Navbar.Menu.IsActive isBurgerOpen ] [\n Navbar.Start.div [] (navbarStart user isBurgerOpen dispatch)\n Navbar.End.div [] [\n Navbar.Item.div [] [\n Button.button [\n Button.Color IsGrey\n Button.OnClick(fun _ -> LogoutPressed |> Global |> dispatch)\n ] [\n Icon.icon [ Icon.Size IsSmall ] [ Fa.i [ Fa.Solid.SignOutAlt ] [] ]\n span [] [ str \"Ausloggen\" ]\n ]\n ]\n ]\n ]\n ]\n\nlet contentWrapper (content: ReactElement list) : ReactElement =\n div [ Class \"content-wrapper\" ] [ yield! content; mySensFooter ]\n\n\nlet skeleton (user: UserDto) isBurgerOpen dispatch content =\n div [] [\n navbar user isBurgerOpen dispatch\n contentWrapper content\n ]\n\nlet skeletonWithoutContentWrapper (user: UserDto) isBurgerOpen dispatch content =\n div [] [ navbar user isBurgerOpen dispatch; content ]\n\nlet centeredHeading (text: string) =\n Column.column [\n Column.Width(Screen.All, Column.IsNarrow)\n Column.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ] [ Heading.h3 [] [ str text ] ]\n\nlet headingOnlyPageContent (text: string) =\n Columns.columns [\n Columns.IsCentered\n Columns.Props [ Style [ Height \"100%\" ] ]\n ] [ centeredHeading text ]","namespace Client.Domain\n\nopen Fable.FontAwesome\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\n\ntype Loadable<'a, 'b> =\n | Loading of 'b\n | Data of 'a\n | Error of string\n\n[]\nmodule Loadable =\n let loadingView maybeText size =\n let spinner = Fa.i [ Fa.Solid.CircleNotch; Fa.Spin; Fa.Size size ] []\n\n let content =\n match maybeText with\n | Some text -> [ spinner; Heading.h1 [] [ str text ] ]\n | None -> [ spinner ]\n\n Columns.columns [\n Columns.IsCentered\n Columns.Props [ Style [ Height \"100%\" ] ]\n ] [\n Column.column\n [\n Column.Width(Screen.All, Column.IsNarrow)\n Column.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ]\n content\n ]\n\n let errorView message =\n PageSkeleton.headingOnlyPageContent message\n\n let view f (loadable: Loadable<'a, 'b>) : ReactElement =\n match loadable with\n | Loadable.Loading _ -> loadingView None Fa.Fa6x\n | Loadable.Data data -> f data\n | Loadable.Error message -> errorView message\n\n let listView f (loadable: Loadable<'a, 'b>) : ReactElement list =\n match loadable with\n | Loadable.Loading _ -> [ loadingView None Fa.Fa6x ]\n | Loadable.Data data -> f data\n | Loadable.Error message -> [ PageSkeleton.headingOnlyPageContent message ]\n\n let toOption (loadable: Loadable<_, _>) =\n match loadable with\n | Loadable.Data data -> Some data\n | _ -> None","namespace Fable.React\r\n\r\nopen Fable.Core\r\nopen Fable.Core.JsInterop\r\nopen Browser\r\nopen Props\r\n\r\n#if !FABLE_COMPILER\r\ntype HTMLNode =\r\n | Text of string\r\n | RawText of string\r\n | Node of string * IProp seq * ReactElement seq\r\n | List of ReactElement seq\r\n | Empty\r\nwith interface ReactElement\r\n\r\ntype ServerElementType =\r\n | Tag\r\n | Fragment\r\n | Component\r\n\r\ntype ReactElementTypeWrapper<'P> =\r\n | Comp of obj\r\n | Fn of ('P -> ReactElement)\r\n | HtmlTag of string\r\n interface ReactElementType<'P>\r\n\r\n[]\r\nmodule ServerRendering =\r\n let [] private ChildrenName = \"children\"\r\n\r\n let private createServerElementPrivate(tag: obj, props: obj, children: ReactElement seq, elementType: ServerElementType) =\r\n match elementType with\r\n | ServerElementType.Tag ->\r\n HTMLNode.Node (string tag, props :?> IProp seq, children) :> ReactElement\r\n | ServerElementType.Fragment ->\r\n HTMLNode.List children :> ReactElement\r\n | ServerElementType.Component ->\r\n let tag = tag :?> System.Type\r\n let comp = System.Activator.CreateInstance(tag, props)\r\n let childrenProp = tag.GetProperty(ChildrenName)\r\n childrenProp.SetValue(comp, children |> Seq.toArray)\r\n let render = tag.GetMethod(\"render\")\r\n render.Invoke(comp, null) :?> ReactElement\r\n\r\n let private createServerElementByFnPrivate(f, props, children) =\r\n let propsType = props.GetType()\r\n let props =\r\n if propsType.GetProperty (ChildrenName) |> isNull then\r\n props\r\n else\r\n let values = ResizeArray ()\r\n let properties = propsType.GetProperties()\r\n for p in properties do\r\n if p.Name = ChildrenName then\r\n values.Add (children |> Seq.toArray)\r\n else\r\n values.Add (FSharp.Reflection.FSharpValue.GetRecordField(props, p))\r\n FSharp.Reflection.FSharpValue.MakeRecord(propsType, values.ToArray()) :?> 'P\r\n f props\r\n\r\n // In most cases these functions are inlined (mainly for Fable optimizations)\r\n // so we create a proxy to avoid inlining big functions every time\r\n\r\n let createServerElement(tag: obj, props: obj, children: ReactElement seq, elementType: ServerElementType) =\r\n createServerElementPrivate(tag, props, children, elementType)\r\n\r\n let createServerElementByFn(f, props, children) =\r\n createServerElementByFnPrivate(f, props, children)\r\n#endif\r\n\r\n[]\r\n[]\r\nmodule ReactElementType =\r\n let inline ofComponent<'comp, 'props, 'state when 'comp :> Component<'props, 'state>> : ReactElementType<'props> =\r\n#if FABLE_REPL_LIB\r\n failwith \"Cannot create React components from types in Fable REPL\"\r\n#else\r\n#if FABLE_COMPILER\r\n jsConstructor<'comp> |> unbox\r\n#else\r\n Comp (typeof<'comp>) :> _\r\n#endif\r\n#endif\r\n\r\n let inline ofFunction<'props> (f: 'props -> ReactElement): ReactElementType<'props> =\r\n#if FABLE_COMPILER\r\n f |> unbox\r\n#else\r\n Fn f :> _\r\n#endif\r\n\r\n let inline ofHtmlElement<'props> (name: string): ReactElementType<'props> =\r\n#if FABLE_COMPILER\r\n unbox name\r\n#else\r\n HtmlTag name :> ReactElementType<'props>\r\n#endif\r\n\r\n /// Create a ReactElement to be rendered from an element type, props and children\r\n let inline create<'props> (comp: ReactElementType<'props>) (props: 'props) (children: ReactElement seq): ReactElement =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(comp, props, children)\r\n#else\r\n match (comp :?> ReactElementTypeWrapper<'props>) with\r\n | Comp obj -> ServerRendering.createServerElement(obj, props, children, ServerElementType.Component)\r\n | Fn f -> ServerRendering.createServerElementByFn(f, props, children)\r\n | HtmlTag obj -> ServerRendering.createServerElement(obj, props, children, ServerElementType.Tag)\r\n#endif\r\n\r\n /// React.memo is a higher order component. It’s similar to React.PureComponent but for function components instead of classes.\r\n /// If your function component renders the same result given the same props, you can wrap it in a call to React.memo.\r\n /// React will skip rendering the component, and reuse the last rendered result.\r\n /// By default it will only shallowly compare complex objects in the props object. If you want control over the comparison, you can use `memoWith`.\r\n let memo<'props> (render: 'props -> ReactElement) =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.memo(render, unbox null)\r\n#else\r\n ofFunction render\r\n#endif\r\n\r\n /// React.memo is a higher order component. It’s similar to React.PureComponent but for function components instead of classes.\r\n /// If your function renders the same result given the \"same\" props (according to `areEqual`), you can wrap it in a call to React.memo.\r\n /// React will skip rendering the component, and reuse the last rendered result.\r\n /// By default it will only shallowly compare complex objects in the props object. If you want control over the comparison, you can use `memoWith`.\r\n /// This version allow you to control the comparison used instead of the default shallow one by provide a custom comparison function.\r\n let memoWith<'props> (areEqual: 'props -> 'props -> bool) (render: 'props -> ReactElement) =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.memo(render, areEqual)\r\n#else\r\n ofFunction render\r\n#endif\r\n\r\n\r\n[]\r\nmodule Helpers =\r\n []\r\n let inline createElement(comp: obj, props: obj, [] children: ReactElement seq): ReactElement =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(comp, props, children)\r\n#else\r\n HTMLNode.Empty :> _\r\n#endif\r\n\r\n /// Instantiate a component from a type inheriting React.Component\r\n /// Example: `ofType { myProps = 5 } []`\r\n let inline ofType<'T,'P,'S when 'T :> Component<'P,'S>> (props: 'P) (children: ReactElement seq): ReactElement =\r\n ReactElementType.create ReactElementType.ofComponent<'T,_,_> props children\r\n\r\n []\r\n let inline com<'T,'P,'S when 'T :> Component<'P,'S>> (props: 'P) (children: ReactElement seq): ReactElement =\r\n ofType<'T, 'P, 'S> props children\r\n\r\n let inline ofFunction<'P> (f: 'P -> ReactElement) (props: 'P) (children: ReactElement seq): ReactElement =\r\n ReactElementType.create (ReactElementType.ofFunction f) props children\r\n\r\n /// Instantiate an imported React component. The first two arguments must be string literals, \"default\" can be used for the first one.\r\n /// Example: `ofImport \"Map\" \"leaflet\" { x = 10; y = 50 } []`\r\n let inline ofImport<'P> (importMember: string) (importPath: string) (props: 'P) (children: ReactElement seq): ReactElement =\r\n#if FABLE_REPL_LIB\r\n failwith \"Cannot import React components in Fable REPL\"\r\n#else\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(import importMember importPath, props, children)\r\n#else\r\n failwith \"Cannot import React components in .NET\"\r\n#endif\r\n#endif\r\n\r\n#if FABLE_COMPILER\r\n []\r\n let private isFunction (x: obj): bool = jsNative\r\n\r\n []\r\n let private isNonEnumerableObject (x: obj): bool = jsNative\r\n#endif\r\n\r\n /// Normal structural F# comparison, but ignores top-level functions (e.g. Elmish dispatch).\r\n /// Can be used e.g. with the `FunctionComponent.Of` `memoizeWith` parameter.\r\n let equalsButFunctions (x: 'a) (y: 'a) =\r\n#if FABLE_COMPILER\r\n if obj.ReferenceEquals(x, y) then\r\n true\r\n elif isNonEnumerableObject x && not(isNull(box y)) then\r\n let keys = JS.Constructors.Object.keys x\r\n let length = keys.Count\r\n let mutable i = 0\r\n let mutable result = true\r\n while i < length && result do\r\n let key = keys.[i]\r\n i <- i + 1\r\n let xValue = x?(key)\r\n result <- isFunction xValue || xValue = y?(key)\r\n result\r\n else\r\n (box x) = (box y)\r\n#else\r\n // Server rendering, won't be actually used\r\n // Avoid `x = y` because it will force 'a to implement structural equality\r\n false\r\n#endif\r\n\r\n /// Comparison similar to default React.memo, but ignores functions (e.g. Elmish dispatch).\r\n /// Performs a memberwise comparison where value types and strings are compared by value,\r\n /// and other types by reference.\r\n /// Can be used e.g. with the `FunctionComponent.Of` `memoizeWith` parameter.\r\n let memoEqualsButFunctions (x: 'a) (y: 'a) =\r\n#if FABLE_COMPILER\r\n if obj.ReferenceEquals(x, y) then\r\n true\r\n elif isNonEnumerableObject x && not(isNull(box y)) then\r\n let keys = JS.Constructors.Object.keys x\r\n let length = keys.Count\r\n let mutable i = 0\r\n let mutable result = true\r\n while i < length && result do\r\n let key = keys.[i]\r\n i <- i + 1\r\n let xValue = x?(key)\r\n result <- isFunction xValue || obj.ReferenceEquals(xValue, y?(key))\r\n result\r\n else\r\n false\r\n#else\r\n // Server rendering, won't be actually used\r\n // Avoid `x = y` because it will force 'a to implement structural equality\r\n false\r\n#endif\r\n\r\n []\r\n let memoBuilder<'props> (name: string) (render: 'props -> ReactElement) : 'props -> ReactElement =\r\n#if FABLE_COMPILER\r\n render?displayName <- name\r\n#endif\r\n let memoType = ReactElementType.memo render\r\n fun props ->\r\n ReactElementType.create memoType props []\r\n\r\n []\r\n let memoBuilderWith<'props> (name: string) (areEqual: 'props -> 'props -> bool) (render: 'props -> ReactElement) : 'props -> ReactElement =\r\n#if FABLE_COMPILER\r\n render?displayName <- name\r\n#endif\r\n let memoType = ReactElementType.memoWith areEqual render\r\n fun props ->\r\n ReactElementType.create memoType props []\r\n\r\n []\r\n let inline from<'P> (com: ReactElementType<'P>) (props: 'P) (children: ReactElement seq): ReactElement =\r\n ReactElementType.create com props children\r\n\r\n /// Alias of `ofString`\r\n let inline str (s: string): ReactElement =\r\n#if FABLE_COMPILER\r\n unbox s\r\n#else\r\n HTMLNode.Text s :> ReactElement\r\n#endif\r\n\r\n /// Cast a string to a React element (erased in runtime)\r\n let inline ofString (s: string): ReactElement =\r\n str s\r\n \r\n /// The equivalent of `sprintf (...) |> str`\r\n let inline strf format =\r\n Printf.kprintf str format\r\n\r\n /// Cast an option value to a React element (erased in runtime)\r\n let inline ofOption (o: ReactElement option): ReactElement =\r\n match o with Some o -> o | None -> null // Option.toObj(o)\r\n\r\n []\r\n let opt (o: ReactElement option): ReactElement =\r\n ofOption o\r\n\r\n /// Cast an int to a React element (erased in runtime)\r\n let inline ofInt (i: int): ReactElement =\r\n#if FABLE_COMPILER\r\n unbox i\r\n#else\r\n HTMLNode.RawText (string i) :> ReactElement\r\n#endif\r\n\r\n /// Cast a float to a React element (erased in runtime)\r\n let inline ofFloat (f: float): ReactElement =\r\n#if FABLE_COMPILER\r\n unbox f\r\n#else\r\n HTMLNode.RawText (string f) :> ReactElement\r\n#endif\r\n\r\n /// Returns a list **from .render() method**\r\n let inline ofList (els: ReactElement list): ReactElement =\r\n#if FABLE_COMPILER\r\n unbox(List.toArray els)\r\n#else\r\n HTMLNode.List els :> ReactElement\r\n#endif\r\n\r\n /// Returns an array **from .render() method**\r\n let inline ofArray (els: ReactElement array): ReactElement =\r\n#if FABLE_COMPILER\r\n unbox els\r\n#else\r\n HTMLNode.List els :> ReactElement\r\n#endif\r\n\r\n /// A ReactElement when you don't want to render anything (null in javascript)\r\n let nothing: ReactElement =\r\n#if FABLE_COMPILER\r\n null\r\n#else\r\n HTMLNode.Empty :> ReactElement\r\n#endif\r\n\r\n /// Instantiate a DOM React element\r\n let inline domEl (tag: string) (props: IHTMLProp seq) (children: ReactElement seq): ReactElement =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(tag, keyValueList CaseRules.LowerFirst props, children)\r\n#else\r\n ServerRendering.createServerElement(tag, (props |> Seq.cast), children, ServerElementType.Tag)\r\n#endif\r\n\r\n /// Instantiate a DOM React element (void)\r\n let inline voidEl (tag: string) (props: IHTMLProp seq) : ReactElement =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(tag, keyValueList CaseRules.LowerFirst props, [])\r\n#else\r\n ServerRendering.createServerElement(tag, (props |> Seq.cast), [], ServerElementType.Tag)\r\n#endif\r\n\r\n /// Instantiate an SVG React element\r\n let inline svgEl (tag: string) (props: IProp seq) (children: ReactElement seq): ReactElement =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(tag, keyValueList CaseRules.LowerFirst props, children)\r\n#else\r\n ServerRendering.createServerElement(tag, (props |> Seq.cast), children, ServerElementType.Tag)\r\n#endif\r\n\r\n /// Instantiate a React fragment\r\n let inline fragment (props: IFragmentProp seq) (children: ReactElement seq): ReactElement =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(ReactBindings.React.Fragment, keyValueList CaseRules.LowerFirst props, children)\r\n#else\r\n ServerRendering.createServerElement(typeof, (props |> Seq.cast), children, ServerElementType.Fragment)\r\n#endif\r\n\r\n /// Accepts a context value to be passed to consuming components that are descendants of this Provider.\r\n /// One Provider can be connected to many consumers. Providers can be nested to override values deeper within the tree.\r\n /// Important: In SSR, this is ignored, and the DEFAULT value is consumed!\r\n /// More info at https://reactjs.org/docs/context.html#contextprovider\r\n let inline contextProvider (ctx: IContext<'T>) (value: 'T) (children: ReactElement seq): ReactElement =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(ctx?Provider, createObj [\"value\" ==> value], children)\r\n#else\r\n fragment [] children\r\n#endif\r\n\r\n /// Consumes a context value, either from the nearest parent in the tree, or from the default value.\r\n /// Important: in SSR, this will always consume the context DEFAULT value!\r\n /// More info at https://reactjs.org/docs/context.html#contextconsumer\r\n let inline contextConsumer (ctx: IContext<'T>) (children: 'T -> ReactElement): ReactElement =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createElement(ctx?Consumer, null, [!!children])\r\n#else\r\n let ctx = ctx :?> ISSRContext<_>\r\n fragment [] [children(ctx.DefaultValue)]\r\n#endif\r\n\r\n /// Creates a Context object. When React renders a component that subscribes to this Context\r\n /// object it will read the current context value from the closest matching Provider above it\r\n /// in the tree. More info at https://reactjs.org/docs/context.html#reactcreatecontext\r\n let inline createContext (defaultValue: 'T): IContext<'T> =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createContext(defaultValue)\r\n#else\r\n upcast { new ISSRContext<_> with member __.DefaultValue = defaultValue }\r\n#endif\r\n\r\n /// To be used in constructors of class components\r\n /// (for function components use `useRef` hook)\r\n let inline createRef (initialValue: 'T): IRefValue<'T> =\r\n#if FABLE_COMPILER\r\n ReactBindings.React.createRef(initialValue)\r\n#else\r\n { new IRefValue<_> with\r\n member __.current with get() = initialValue and set _ = () }\r\n#endif\r\n\r\n // Class list helpers\r\n let classBaseList baseClass classes =\r\n classes\r\n |> Seq.choose (fun (name, condition) ->\r\n if condition && not(System.String.IsNullOrEmpty(name)) then Some name\r\n else None)\r\n |> Seq.fold (fun state name -> state + \" \" + name) baseClass\r\n |> ClassName\r\n\r\n let classList classes = classBaseList \"\" classes\r\n\r\n /// Finds a DOM element by its ID and mounts the React element there\r\n /// Important: Not available in SSR\r\n let inline mountById (domElId: string) (reactEl: ReactElement): unit =\r\n#if FABLE_COMPILER\r\n ReactDom.render(reactEl, document.getElementById(domElId))\r\n#else\r\n failwith \"mountById is not available for SSR\"\r\n#endif\r\n /// Finds the first DOM element matching a CSS selector and mounts the React element there\r\n /// Important: Not available in SSR\r\n let inline mountBySelector (domElSelector: string) (reactEl: ReactElement): unit =\r\n#if FABLE_COMPILER\r\n ReactDom.render(reactEl, document.querySelector(domElSelector))\r\n#else\r\n failwith \"mountBySelector is not available for SSR\"\r\n#endif\r\n","module Client.Page.Home\n\nopen Client.Infrastructure.Api\nopen Client.Domain\nopen Client.Infrastructure\nopen Client.DomainTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Shared.Dto.Dashboard\nopen Shared.Dto.Dto\nopen Shared.Dto.User\nopen Shared\n\nlet stringNoneIfEmpty str =\n if System.String.IsNullOrEmpty str then None else Some str\n\ntype Model = {\n Devices: Loadable\n Session: UserSession\n}\n\nlet update msg model =\n match msg with\n | HomeMsg.DashboardResponseReceived response ->\n match response with\n | Ok data -> { model with Devices = Loadable.Data data }, Cmd.none\n | AuthenticatedResponse.Error _ ->\n { model with Devices = Loadable.Error \"Fehler beim Laden des Geräte Status\" }, Cmd.none\n\n\nlet init (session: UserSession) =\n let request = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n {\n Devices = Loadable.Loading()\n Session = session\n },\n Cmd.OfAsync.perform api.getDashboard request (HomeMsg.DashboardResponseReceived >> Home)\n\nlet private sensorsDeviceRow (data: DevicesOnlineSummary) =\n let text, imgSrc =\n match data with\n | AllOnline count ->\n let text = sprintf \"Alle %d aktiven Sensoren sind online\" count\n\n text, Some \"/images/green-mark.png\"\n | NoDevicesFound -> \"Keine aktiven Sensoren im System gefunden\", None\n | NotAllOnline amount ->\n let text =\n sprintf \"%d von %d aktiven Sensore(n) sind online\" amount.Online amount.TotalCount\n\n text, Some \"/images/warning-sign.png\"\n\n [\n Icon.icon [] [ Fa.i [ Fa.Solid.MapMarker ] [] ]\n span [ classList [ \"text\", true ] ] [ str text ]\n\n match imgSrc with\n | Some src ->\n img [\n Src src\n Style [ MarginLeft \"0.5rem\"; Height \"1.5rem\" ]\n ]\n | None -> ()\n ]\n\nlet private gatewayDeviceRow (data: DevicesOnlineSummary) =\n let text, imgSrc =\n match data with\n | AllOnline count ->\n let text = sprintf \"Alle %d aktiven Empfänger sind online\" count\n\n text, Some \"/images/green-mark.png\"\n | NoDevicesFound -> \"Keine aktiven Empfänger im System gefunden\", None\n | NotAllOnline amount ->\n let text =\n sprintf \"%d von %d aktiven Empfänger sind online\" amount.Online amount.TotalCount\n\n text, Some \"/images/warning-sign.png\"\n\n [\n Icon.icon [] [ Fa.i [ Fa.Solid.BroadcastTower ] [] ]\n span [ classList [ \"text\", true ] ] [ str text ]\n\n match imgSrc with\n | Some src ->\n img [\n Src src\n Style [ MarginLeft \"0.5rem\"; Height \"1.5rem\" ]\n ]\n | None -> ()\n ]\n\nlet private devicesView (data: DashboardResponse) =\n div [ classList [ \"dashboard\", true ] ] [\n p\n [\n Style [\n Display DisplayOptions.Flex\n AlignItems AlignItemsOptions.Center\n ]\n ]\n (sensorsDeviceRow data.Sensors)\n\n p\n [\n Style [\n Display DisplayOptions.Flex\n AlignItems AlignItemsOptions.Center\n ]\n ]\n (gatewayDeviceRow data.Gateways)\n ]\n\nlet view (model: Model) dispatch =\n Hero.hero [ Hero.IsFullheightWithNavbar ] [\n Hero.head [] []\n Hero.body [\n GenericOption.CustomClass \"centered\"\n GenericOption.Props [ Style [ FlexDirection \"column\" ] ]\n ] [\n Heading.h1 [ Heading.CustomClass \"has-text-centered\" ] [ str \"Willkommen bei MySens\" ]\n\n Heading.h3 [ Heading.Is6; Heading.IsSubtitle ] [\n str (\"Eingeloggt als \" + (getFullName model.Session.User))\n ]\n\n (*Bulma.message [\n Bulma.color.isWarning\n prop.children [\n Bulma.messageHeader [ prop.text \"Server Updates\" ]\n Bulma.messageBody [\n prop.text\n \"Am 25. und 26. November 2024 werden die Server gewartet und auf den neuesten Stand gebracht.\n Aufgrund dessen kann es in diesen zwei Tagen vorkommen, dass die Webseite nicht immer erreichbar ist.\"\n ]\n ]\n ]*)\n\n p [ Style [ MarginTop \"3rem\" ] ] [\n Button.button [\n Button.Color Color.IsLink\n Clickable.onClickGoToRoute dispatch (Route.SensorMap None) |> Button.OnClick\n Button.IsOutlined\n ] [\n Icon.icon [ Icon.Size IsSmall ] [ Fa.i [ Fa.Solid.MapMarkedAlt ] [] ]\n span [] [ str \"Zur Karte\" ]\n ]\n ]\n p [ Style [ Margin \"1.5rem\" ] ] [\n Button.button [\n Button.Color Color.IsLink\n Clickable.onClickGoToRoute dispatch Route.MySensorsData |> Button.OnClick\n Button.IsOutlined\n ] [\n Icon.icon [ Icon.Size IsSmall ] [ Fa.i [ Fa.Solid.ChartLine ] [] ]\n span [] [ str \"Zu den aktuellen Messwerten\" ]\n ]\n ]\n\n Heading.h3 [\n Heading.Props [ Style [ Margin \"2rem\" ] ]\n Heading.IsSpaced\n ] [ str \"Meine Geräte\" ]\n\n Loadable.view devicesView model.Devices\n ]\n ]","module Client.Forms.ChangePassword\n\nopen Elmish\nopen Client.Infrastructure.Api\nopen Fable.FontAwesome\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Client\nopen Client.Components\nopen Shared\nopen Shared.Infrastructure\nopen Client.DomainTypes.Msg\nopen Shared.Dto.Dto\nopen Thoth.Elmish\n\ntype Model = {\n Session: UserSession\n OldPassword: string option\n NewPassword: string option\n NewPasswordRepeated: string option\n RequestRunning: bool\n}\n\nlet init session = {\n Session = session\n OldPassword = None\n NewPassword = None\n NewPasswordRepeated = None\n RequestRunning = false\n}\n\nlet update (msg: ChangePasswordMsg) (model: Model) =\n match msg with\n | OldPasswordUpdated oldPassword -> { model with OldPassword = oldPassword }, Cmd.none\n | NewPasswordUpdated newPassword -> { model with NewPassword = newPassword }, Cmd.none\n | NewPasswordRepeatedUpdated newPasswordRepeated ->\n { model with NewPasswordRepeated = newPasswordRepeated }, Cmd.none\n | Request(oldPassword, newPassword) ->\n let cmd =\n Cmd.OfAsync.perform\n api.updatePassword\n {\n SessionKey = model.Session.SessionKey\n Data = (oldPassword, newPassword)\n }\n Response\n\n { model with RequestRunning = true }, cmd\n | Response successful ->\n if successful then\n let toastCmd = Toast.create \"Passwort wurde geändert\" |> Toast.success\n\n init model.Session, toastCmd\n else\n let toastCmd = Toast.create \"Ein Fehler ist aufgetreten\" |> Toast.error\n\n model, toastCmd\n\n\nlet buttonOptions (model: Model) dispatch =\n let maybeRequestData =\n Option.map3\n (fun oldPassword newPassword newPasswordRepeated ->\n if newPassword = newPasswordRepeated then\n Some(oldPassword, newPassword)\n else\n None\n )\n model.OldPassword\n model.NewPassword\n model.NewPasswordRepeated\n |> Option.flatten\n\n let buttonOptions = [\n Button.Color IsLink\n Button.IsLoading model.RequestRunning\n Button.Disabled(Option.isNone maybeRequestData)\n Button.Props [ HTMLAttr.Type \"submit\" ]\n ]\n\n maybeRequestData\n |> Option.map (fun requestData -> SubmitButton.onClick (fun _ -> dispatch (Request requestData)))\n |> List.addToListIfSome buttonOptions\n\nlet view (model: Model) dispatch =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Altes Passwort\" ]\n Control.div [ Control.HasIconLeft ] [\n Input.password [\n Input.Id \"password\"\n Input.OnChange(fun event -> event.Value |> String.toOption |> OldPasswordUpdated |> dispatch)\n ]\n\n Icon.icon [ Icon.Size IsSmall; Icon.IsLeft ] [ Fa.i [ Fa.Solid.Key ] [] ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Neues Passwort\" ]\n Control.div [ Control.HasIconLeft ] [\n Input.password [\n Input.Id \"newPassword\"\n Input.OnChange(fun event -> event.Value |> String.toOption |> NewPasswordUpdated |> dispatch)\n ]\n\n Icon.icon [ Icon.Size IsSmall; Icon.IsLeft ] [ Fa.i [ Fa.Solid.Key ] [] ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Neues Passwort wiederholen\" ]\n Control.div [ Control.HasIconLeft ] [\n Input.password [\n Input.Id \"newPasswordRepeated\"\n Input.OnChange(fun event ->\n event.Value |> String.toOption |> NewPasswordRepeatedUpdated |> dispatch\n )\n ]\n\n Icon.icon [ Icon.Size IsSmall; Icon.IsLeft ] [ Fa.i [ Fa.Solid.Key ] [] ]\n ]\n ]\n Field.div [ Field.IsGroupedRight ] [\n Control.p [] [\n\n Button.button (buttonOptions model dispatch) [ str \"Passwort ändern\" ]\n ]\n ]\n ]","namespace Client.Components\n\nopen Fable.React\nopen Fulma\n\n[]\nmodule Box =\n let wrap (content: ReactElement list) = Box.box' [] content\n\n let wrapWithHeading (headingContent: ReactElement) (content: ReactElement list) =\n let heading = Heading.p [ Heading.Is3 ] [ headingContent ]\n\n wrap (heading :: content)","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Content =\r\n\r\n type Option =\r\n | Size of ISize\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
\r\n let content (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Size size -> ofSize size |> result.AddClass\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"content\").ToReactElement(div, children)\r\n\r\n module Ol =\r\n\r\n type Option =\r\n | [] IsLowerRoman\r\n | [] IsUpperRoman\r\n | [] IsLowerAlpha\r\n | [] IsUpperAlpha\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n | Props of IHTMLProp list\r\n\r\n /// Generate
    \r\n let ol (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsLowerRoman\r\n | IsUpperRoman\r\n | IsLowerAlpha\r\n | IsUpperAlpha -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions).ToReactElement(ol, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Checkbox =\r\n\r\n /// Generate \r\n let checkbox (options : GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"checkbox\").ToReactElement(label, children)\r\n\r\n /// Generate \r\n let input (options : GenericOption list) =\r\n GenericOptions.Parse(options, parseOptions, \"checkbox\", [ Type \"checkbox\" :> IHTMLProp ]).ToReactElement(input)\r\n","module Client.Forms.NotificationSettings\n\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\n\nlet view =\n form [] [\n Field.div [] [\n Control.div [] [\n Checkbox.checkbox [] [\n Checkbox.input []\n str \"Benachrichtigung per Mail senden, wenn ein Sensor seit einem Tag keine Daten mehr gesendet hat\"\n ]\n ]\n ]\n Field.div [] [\n Control.div [] [\n Checkbox.checkbox [ GenericOption.Props [ HTMLAttr.Disabled true ] ] [\n Checkbox.input [\n GenericOption.Props [ HTMLAttr.Disabled true; HTMLAttr.Checked false ]\n ]\n str\n \"Benachrichtigung per Mail senden, wenn ein Gateway seit mehr als einem Tag nicht mehr online ist\"\n ]\n ]\n ]\n Field.div [ Field.IsGroupedRight ] [\n Control.p [] [\n\n Button.button [] [ str \"Speichern\" ]\n ]\n ]\n ]","namespace Client.InfrastructureTypes\n\nopen Fulma\n\n[]\nmodule Container =\n let isFullWidth = Container.CustomClass \"full-width\"","module Client.Page.User.MySettings\n\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Domain\nopen Client.DomainTypes\nopen Client.InfrastructureTypes\nopen Elmish\nopen Fable.React.Props\nopen Fulma\nopen Shared\nopen Shared.Dto.Page.UserList\nopen Shared.Dto.User\nopen Fable.React\nopen Client.Forms\nopen Client.DomainTypes.Msg\nopen Shared.Dto.Dto\nopen Shared.Infrastructure\n\n\ntype DataModel = {\n Session: UserSession\n Profile: FullUserDto\n ChangePasswordModel: ChangePassword.Model\n OpenTab: MySettingsTabs.Tab\n}\n\ntype Model = Loadable\n\nlet private profileBox (model: DataModel) =\n let heading = Heading.p [] [ str \"Benutzerdaten\" ]\n\n let form =\n form [] [\n Field.div [ Field.IsHorizontal ] [\n Field.body [] [\n Field.div [] [\n Label.label [] [ str \"Vorname\" ]\n\n Input.text [\n Input.IsReadOnly true\n Input.IsStatic true\n Input.Value(getFirstName model.Profile)\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Nachname\" ]\n\n Input.text [\n Input.IsReadOnly true\n Input.IsStatic true\n Input.Value(getLastName model.Profile)\n ]\n ]\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"E-Mail Adresse\" ]\n Input.text [\n Input.IsReadOnly true\n Input.IsStatic true\n Input.Value(getMail model.Profile)\n ]\n ]\n\n Field.div [ Field.IsHorizontal ] [\n Field.body [] [\n Field.div [] [\n Label.label [] [ str \"Benutzer-Typ\" ]\n Input.text [\n Input.IsReadOnly true\n Input.IsStatic true\n Input.Value(userTypeToString model.Profile)\n ]\n ]\n\n match model.Profile with\n | FullUserDto.Admin _\n | FullUserDto.RegularUser _ -> ()\n | FullUserDto.TestUser testUser ->\n Field.div [] [\n Label.label [] [ str \"Benutzer gültig bis\" ]\n Input.text [\n Input.IsReadOnly true\n Input.IsStatic true\n Input.Value(testUser.ValidUntil |> DateTime.toShortString)\n ]\n ]\n ]\n ]\n ]\n\n Box.wrapWithHeading heading [ form ]\n\nlet private passwordBox (model: DataModel) dispatch =\n let headingContent = str \"Passwort ändern\"\n\n let boxContent =\n ChangePassword.view model.ChangePasswordModel (MySettingsMsg.ChangePasswordForm >> dispatch)\n\n Box.wrapWithHeading headingContent [ boxContent ]\n\nlet private getUserPackages (user: FullUserDto) =\n match user with\n | FullUserDto.Admin _\n | FullUserDto.TestUser _ -> None\n | FullUserDto.RegularUser user -> Some user.Packages\n\nlet private userHasBookedPackages (user: FullUserDto) =\n match getUserPackages user with\n | Some _ -> true\n | None -> false\n\nlet bookedPackagesBox (model: DataModel) =\n match model.Profile with\n | FullUserDto.Admin _ -> None\n | FullUserDto.TestUser _ -> None\n | FullUserDto.RegularUser user ->\n let packages =\n user.Packages\n |> List.map (fun package -> package.Value.Package |> getPackageLabel)\n |> List.map (fun text -> li [] [ str text ])\n\n let headingContent = str \"Gebuchte Pakete\"\n\n [ Content.content [] [ ul [] packages ] ]\n |> Box.wrapWithHeading headingContent\n |> Some\n\nlet private createTab dispatch (label: string) (tab: MySettingsTabs.Tab) (openTab: MySettingsTabs.Tab) =\n let onClick = (fun _ -> dispatch (MySettingsMsg.ChangeTab tab))\n\n Tabs.tab [ Tabs.Tab.IsActive(tab = openTab) ] [ a [ DOMAttr.OnClick onClick ] [ str label ] ]\n\nlet private createTabView dispatch (model: DataModel) =\n match model.OpenTab with\n | MySettingsTabs.Profile -> profileBox model\n | MySettingsTabs.BoughtPackages ->\n bookedPackagesBox model\n |> Option.defaultValue (div [] [ str \"Das darf nicht passieren\" ])\n | MySettingsTabs.ChangePassword -> passwordBox model dispatch\n | MySettingsTabs.NotificationSettings ->\n Box.wrapWithHeading (str \"Benachrichtigungs-Einstellungen\") [ NotificationSettings.view ]\n\nlet dataView dispatch (model: DataModel) =\n let tabs =\n Tabs.tabs [ Tabs.Size IsMedium ] [\n createTab dispatch \"Profil\" MySettingsTabs.Profile model.OpenTab\n\n if userHasBookedPackages model.Profile then\n createTab dispatch \"Gebuchte Pakete\" MySettingsTabs.BoughtPackages model.OpenTab\n else\n ()\n\n createTab dispatch \"Passwort ändern\" MySettingsTabs.ChangePassword model.OpenTab\n ]\n\n Container.container [ Container.isFullWidth ] [\n Heading.h1 [] [ str \"Einstellungen\" ]\n\n tabs\n\n createTabView dispatch model\n ]\n\nlet init (session: UserSession) =\n let requestData: AuthenticatedRequest = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n Loadable.Loading session, Cmd.OfAsync.perform api.getMyProfile requestData (ProfileLoaded >> MySettings)\n\nlet map (modelMap: 'model -> Model) (cmdMap: 'msg -> Msg) (subModel: 'model, subCmd: Cmd<'msg>) =\n modelMap subModel, Cmd.map cmdMap subCmd\n\nlet update (msg: MySettingsMsg) (model: Model) =\n match msg, model with\n | MySettingsMsg.ChangePasswordForm formMsg, Loadable.Data data ->\n ChangePassword.update formMsg data.ChangePasswordModel\n |> (fun (formModel, cmd) ->\n Loadable.Data { data with ChangePasswordModel = formModel }, Cmd.map (ChangePasswordForm >> MySettings) cmd\n )\n | MySettingsMsg.ProfileLoaded response, Loading loading ->\n match response with\n | Result.Ok profile ->\n Loadable.Data {\n Session = loading\n Profile = profile\n ChangePasswordModel = ChangePassword.init loading\n OpenTab = MySettingsTabs.Profile\n },\n Cmd.none\n | Result.Error _ -> Loadable.Error \"Ein Fehler beim Laden des Profils ist aufgetreten\", Cmd.none\n | MySettingsMsg.ChangeTab tab, Loadable.Data data -> Loadable.Data { data with OpenTab = tab }, Cmd.none\n | _, _ -> model, Cmd.none\n\nlet view dispatch (model: Model) = Loadable.view (dataView dispatch) model","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Tabs =\r\n\r\n type Option =\r\n | Size of ISize\r\n /// Add `is-centered` class\r\n | [] IsCentered\r\n /// Add `is-right` class\r\n | [] IsRight\r\n /// Add `is-boxed` class\r\n | [] IsBoxed\r\n /// Add `is-toggle` class\r\n | [] IsToggle\r\n /// Add `is-toggle-rounded` class\r\n | [] IsToggleRounded\r\n /// Add `is-fullwidth` class\r\n | [] IsFullWidth\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Tab =\r\n\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
      \r\n let tabs (options: Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsCentered\r\n | IsRight\r\n | IsBoxed\r\n | IsToggle\r\n | IsToggleRounded\r\n | IsFullWidth -> result.AddCaseName option\r\n | Size size -> ofSize size |> result.AddClass\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"tabs\").ToReactElement(div, [ ul [ ] children ])\r\n\r\n /// Generate
    • \r\n let tab (options: Tab.Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Tab.IsActive state -> if state then result.AddCaseName option else result\r\n | Tab.Props props -> result.AddProps props\r\n | Tab.CustomClass customClass -> result.AddClass customClass\r\n | Tab.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions).ToReactElement(li, children)\r\n","module Client.Map.MapMarker\n\nopen System\nopen Fable.Core\nopen ReactLeaflet\nopen Leaflet\nopen Shared.Dto.MapSensorData\nopen Fable.Core.JsInterop\n\n\ntype IconFactory =\n abstract createIcon: props: obj -> Icon\n\n[]\nlet iconFactory: IconFactory = jsNative\n\ntype IconProps =\n | IconUrl of string\n | IconSize of obj array\n | IconAnchor of obj array\n | PopupAnchor of obj array\n | TooltipAnchor of obj array\n\nlet makePosition latitude longitude =\n LatLngExpression.Case3(latitude, longitude)\n\nlet createIcon (fileName: string) =\n let iconOptions =\n keyValueList CaseRules.LowerFirst [\n IconUrl(sprintf \"flags/%s\" fileName)\n IconSize [| box 25; box 41 |]\n IconAnchor [| box 12; box 41 |]\n PopupAnchor [| box 0; box -42 |]\n ]\n\n iconFactory.createIcon iconOptions |> U2.Case1\n\nlet getTotalMinutesLimit (data: MapSensorData) =\n match data with\n | NoDataAvailable\n | NoPublicData -> None\n | WeatherStationData _ -> Some 15.0\n | AirData _\n | RainFallData _\n | AverageWindSpeedData _\n | LiquidLevelData _ -> Some 30.0\n | GroundData _\n | LeafletMoistureData _\n | SoilPhData _\n | SolarRadiationData _ -> Some 50.0\n\nlet isOldAgeData (data: MapSensorData) =\n let totalMinutesLimit = (getTotalMinutesLimit data)\n\n getSensorDataDate data\n |> Option.map (fun date -> (DateTimeOffset.UtcNow - date).TotalMinutes)\n |> Option.map2 (fun limit totalMinutes -> totalMinutes > limit) totalMinutesLimit\n |> Option.defaultValue true\n\n\nlet getIconNameByMapSensorData (data: MapSensorData) =\n let isOldAge = isOldAgeData data\n\n match (data, isOldAge) with\n | NoDataAvailable, _\n | NoPublicData, _ -> \"Grey.png\"\n | AirData _, true -> \"TL_grey.svg\"\n | AirData _, false -> \"TL.svg\"\n | GroundData _, true -> \"BT_grey.svg\"\n | GroundData _, false -> \"BT_brown.svg\"\n | RainFallData _, true -> \"RF_grey.svg\"\n | RainFallData _, false -> \"RF_blue.svg\"\n | LeafletMoistureData _, true -> \"BN_grey.svg\"\n | LeafletMoistureData _, false -> \"BN_blue.svg\"\n | SoilPhData _, true -> \"PH_grey.svg\"\n | SoilPhData _, false -> \"PH_gold.svg\"\n | AverageWindSpeedData _, true -> \"WI_grey.svg\"\n | AverageWindSpeedData _, false -> \"WI_violett.svg\"\n | WeatherStationData _, true -> \"WS_grey.svg\"\n | WeatherStationData _, false -> \"WS_orange.svg\"\n | LiquidLevelData _, true -> \"FS_grey.png\"\n | LiquidLevelData _, false -> \"FS_black.png\"\n | SolarRadiationData _, true -> \"SR_grey.svg\"\n | SolarRadiationData _, false -> \"SR_yellow.svg\"\n\n\nlet makeMarker data latLong popupContent =\n let icon = getIconNameByMapSensorData data |> createIcon\n\n marker [\n MarkerProps.Position latLong\n MarkerProps.Icon icon\n ] [\n popup [\n PopupProps.KeepInView false\n PopupProps.MaxWidth 800.\n PopupProps.MinWidth 250.\n ] [ popupContent ]\n ]","import { icon } from 'leaflet';\n\nfunction createIcon(props) {\n return icon(props);\n}\n\nexport { createIcon };","module Client.Domain.MeasuredValueString\n\nlet temperatureToString = sprintf \"%.2f °C\"\n\nlet conductivityToString conductivity = sprintf \"%.0f μS/cm\" conductivity\n\nlet percentageToString = sprintf \"%.2f %%\"\n\nlet rainFallToString = sprintf \" %.1f mm\"\n\nlet windSpeedToString = sprintf \"%.1f km/h\"\n\nlet windDirectionToString = sprintf \"%.1f °\"\n\nlet liquidLevelToString = sprintf \"%d mm\"\n\nlet solarRadiationToString = sprintf \"%d W/m²\"","namespace Fulma.Extensions.Wikiki\n\nopen Fable.React.Props\n\n[]\nmodule Tooltip =\n\n let [] ClassName = \"tooltip\"\n let [] IsTooltipTop = \"has-tooltip-top\"\n let [] IsTooltipRight = \"has-tooltip-right\"\n let [] IsTooltipBottom = \"has-tooltip-bottom\"\n let [] IsTooltipLeft = \"has-tooltip-left\"\n let [] IsMultiline = \"has-tooltip-multiline\"\n let [] IsPrimary = \"has-tooltip-primary\"\n let [] IsInfo = \"has-tooltip-info\"\n let [] IsSuccess = \"has-tooltip-success\"\n let [] IsWarning = \"has-tooltip-warning\"\n let [] IsDanger = \"has-tooltip-danger\"\n let [] IsActive = \"has-tooltip-active\"\n\n let dataTooltip d = Data (\"tooltip\", d)\n","namespace Client.Map.Symbol\n\nopen Shared.Dto.MapSensorData\n\n\n[]\nmodule SignalStrength =\n type T =\n | Unknown\n | VeryBad\n | Bad\n | Ok\n | Good\n | VeryGood\n\n\n let fromRssi rssi =\n if rssi > -100 then VeryGood\n else if rssi > -110 then Good\n else if rssi > -120 then Ok\n else if rssi > -124 then Bad\n else VeryBad\n\n let fromMapSensorData (data: MapSensorData) =\n match data with\n | NoDataAvailable\n | NoPublicData -> None\n | AirData airData -> Option.map fromRssi airData.Rssi\n | GroundData groundData -> Option.map fromRssi groundData.Rssi\n | RainFallData data -> Option.map fromRssi data.Rssi\n | LeafletMoistureData data -> Option.map fromRssi data.Rssi\n | SoilPhData data -> Option.map fromRssi data.Rssi\n | AverageWindSpeedData data -> Option.map fromRssi data.Rssi\n | WeatherStationData data -> Option.map fromRssi data.Rssi\n | LiquidLevelData data -> Option.map fromRssi data.Rssi\n | SolarRadiationData data -> Option.map fromRssi data.Rssi\n\n let toImageSrc (strength: T) =\n let fileName =\n match strength with\n | Unknown -> \"sgrau\"\n | VeryBad -> \"s0\"\n | Bad -> \"s1\"\n | Ok -> \"s2\"\n | Good -> \"s3\"\n | VeryGood -> \"s4\"\n\n sprintf \"/signal-strength/%s.svg\" fileName","module internal Client.Map.Symbol.LeafletWetness\n\nopen System\nopen Shared.Dto.MapSensorData\nopen Shared.DtoTypes.LeafletWetness\n\nlet getLeafletWetness (data: MapSensorData) =\n match data with\n | AirData airData ->\n let minutesSinceLastData = (DateTimeOffset.UtcNow - airData.Date).TotalMinutes\n\n if minutesSinceLastData <= 60.0 then\n Some airData.LeafletWetness\n else\n None\n | WeatherStationData weatherStationSensorData ->\n let minutesSinceLastData =\n (DateTimeOffset.UtcNow - weatherStationSensorData.Date).TotalMinutes\n\n if minutesSinceLastData <= 60.0 then\n Some weatherStationSensorData.LeafletWetness\n else\n None\n | _ -> None\n\nlet getLeafletMoisture (data: MapSensorData) =\n match data with\n | LeafletMoistureData moistureData ->\n let minutesSinceLastData = (DateTimeOffset.UtcNow - moistureData.Date).TotalMinutes\n\n if minutesSinceLastData <= 60.0 then\n Some moistureData.LeafletMoisture\n else\n None\n | _ -> None\n\nlet toImageSrc (wetness: LeafletWetness) =\n let file =\n match wetness with\n | Wet _ -> \"BN100\"\n | Dry -> \"BN0\"\n\n sprintf \"/images/leaflet-wetness/%s.svg\" file\n\nlet percentageToImageSrc (moisture: float) =\n let fileName =\n if moisture < 2. then \"BN0\"\n else if moisture < 5. then \"BN50\"\n else \"BN100\"\n\n sprintf \"/images/leaflet-wetness/%s.svg\" fileName","namespace Shared.Infrastructure\n\nopen System\n\n[]\nmodule Math =\n let round (digits: int) (value: float) : float = Math.Round(value, digits)","module Client.Map.Symbol.RainFall\n\nopen Shared.Infrastructure\nopen Shared.Dto.MapSensorData\n\n\ntype RainFallIntensity =\n | NoRain\n | LightRain\n | Rain\n | IntenseRain\n\nlet rainFallAmountToIntensity amount =\n if amount = 0.0 then NoRain\n else if amount < 1.0 then LightRain\n else if amount >= 1.0 && amount < 3.0 then Rain\n else IntenseRain\n\nlet toImageSrc (severity: RainFallIntensity) =\n let file =\n match severity with\n | NoRain -> \"R0\"\n | LightRain -> \"R1\"\n | Rain -> \"R2\"\n | IntenseRain -> \"R3\"\n\n sprintf \"/images/rain-intensity/%s.svg\" file\n\nlet getRainFallIntensity (sensorData: MapSensorData) =\n match sensorData with\n | RainFallData data -> data.CurrentRainFall |> Math.round 1 |> rainFallAmountToIntensity |> Some\n | _ -> None","module Client.Map.Symbol.AverageWindSpeed\n\nopen Shared.Dto.MapSensorData\n\nlet mapSensorDataToAverageWindSpeed (data: MapSensorData) =\n match data with\n | AverageWindSpeedData data -> Some data.AverageWindSpeed\n | WeatherStationData data -> Some(Option.defaultValue 0. data.AverageWindSpeed)\n | _ -> None\n\nlet getIconForWindSpeed (windSpeed: float) : string =\n let category =\n if windSpeed <= 1.8 then \"0\"\n else if windSpeed <= 3.6 then \"1\"\n else if windSpeed <= 9.0 then \"2\"\n else \"3\"\n\n sprintf \"/images/wind-speed/wind_%s.svg\" category","module Client.Map.Symbol.SoilPh\n\nopen Shared.Dto.MapSensorData\n\nlet toSoilPhData (data: MapSensorData) =\n match data with\n | SoilPhData data -> Some data\n | _ -> None\n\nlet toImageSrc (data: SoilPhSensorData) =\n let ph = data.SoilPh\n\n let category =\n if ph < 4.0 then \"3.5\"\n else if ph < 4.5 then \"4.0\"\n else if ph < 5.0 then \"4.5\"\n else if ph < 5.5 then \"5.0\"\n else if ph < 6.0 then \"5.5\"\n else if ph < 6.5 then \"6.0\"\n else if ph < 7.0 then \"6.5\"\n else if ph < 7.5 then \"7.0\"\n else if ph < 8.0 then \"7.5\"\n else if ph < 8.5 then \"8.0\"\n else if ph < 9.0 then \"8.5\"\n else if ph < 9.5 then \"9.0\"\n else if ph < 10.0 then \"9.5\"\n else if ph < 10.5 then \"10.0\"\n else \"10.5\"\n\n\n sprintf \"/images/soil-ph/ph%s.svg\" category","module Client.Map.Symbol.SoilMoisture\n\nopen Shared.Dto.MapSensorData\n\nlet toImageSrc (moisture: SoilMoistureSection) =\n let fileName =\n match moisture with\n | F1 -> \"F1\"\n | F2 -> \"F2\"\n | F3 -> \"F3\"\n | F4 -> \"F4\"\n | F5 -> \"F5\"\n | F6 -> \"F6\"\n | F7 -> \"F7\"\n | F8 -> \"F8\"\n | F9 -> \"F9\"\n\n sprintf \"/images/soil-moisture/%s.svg\" fileName\n\nlet getGroundMoisture (data: MapSensorData) : SoilMoistureSection option =\n match data with\n | GroundData groundData -> groundData.MoistureSection\n | _ -> None","module Client.Map.Symbol.RadiationIntensity\n\nopen Shared.Dto.MapSensorData\n\ntype RadiationIntensity =\n | VeryHigh\n | High\n | Medium\n | Low\n\nlet toImageSrc (intensity: RadiationIntensity) =\n let intensity =\n match intensity with\n | VeryHigh -> \"3\"\n | High -> \"2\"\n | Medium -> \"1\"\n | Low -> \"0\"\n\n sprintf \"/images/radiation-intensity/SR%s.svg\" intensity\n\nlet private solarRadiationToIntensity (solarRadiation: int) : RadiationIntensity =\n if solarRadiation > 1000 then VeryHigh\n else if solarRadiation > 400 then High\n else if solarRadiation > 100 then Medium\n else Low\n\nlet getRadiationIntensity (sensorData: MapSensorData) =\n match sensorData with\n | SolarRadiationData data -> data.SolarRadiation |> solarRadiationToIntensity |> Some\n | _ -> None","namespace Client.Map.Symbol\n\nopen Shared.Dto.Dto\n\n[]\nmodule internal BatteryLevel =\n let toImageSrc (level: BatteryLevel) =\n let fileName =\n match level with\n | Full -> 1\n | TwoQuarters -> 2\n | OneQuarter -> 3\n | Low -> 4\n | Danger -> 5\n\n sprintf \"/images/battery-level/batt%i.svg\" fileName","namespace Shared.Infrastructure\n\nopen System\n\n[]\nmodule TimeSpan =\n let countToString number singleString multipleString =\n if number > 1 || number = 0 then\n sprintf \"%d %s\" number multipleString\n else if number = 1 then\n sprintf \"1 %s\" singleString\n else\n raise (Exception(\"Negative numbers are not allowed here\"))\n\n let toHumanReadable (timespan: TimeSpan) : string =\n if timespan.Days > 0 then\n countToString timespan.Days \"Tag\" \"Tage\"\n else if timespan.Hours > 0 then\n countToString timespan.Hours \"Stunde\" \"Stunden\"\n else if timespan.Minutes > 0 then\n countToString timespan.Minutes \"Minute\" \"Minuten\"\n else\n \"ca. 1 Minute\"\n\n let toRoundedMinutes (timespan: TimeSpan) : int =\n timespan.TotalMinutes |> Math.round 0 |> int\n\n let createElapsedTime (dateTime: DateTimeOffset) = DateTimeOffset.Now - dateTime\n\n let createTimeSinceString (dateTime: DateTimeOffset) =\n dateTime |> createElapsedTime |> toHumanReadable |> sprintf \"vor %s\"","module Client.Map.SensorPopup\n\nopen System\nopen Client.DomainTypes\nopen Client.DomainTypes.Msg\nopen Client.Domain.MeasuredValueString\nopen Client.Infrastructure\nopen Client.Map.Symbol\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Fulma.Extensions.Wikiki\nopen Shared\nopen Shared.Dto.MapSensorData\nopen Shared.DtoTypes.MapSensorData\nopen Shared.DtoTypes.LeafletWetness\nopen Shared.Infrastructure\n\nlet private popupSecondColCls = \"second-column\"\nlet private popupMeasurementCls = \"measurement-data\"\n\nlet private iconCls = \"icon\"\n\nlet private signalStrengthCls = \"signal-strength\"\n\nlet private rainIntensityCls = \"rain-intensity\"\n\nlet private wideIconCls = \"wide-icon\"\n\nlet private leafletWetnessCls = \"leaflet-wetness\"\n\nlet private detailsButtonCls = \"details-button\"\n\nlet getSensorNameLinkColor (data: MapSensorData) =\n match data with\n | NoDataAvailable\n | NoPublicData -> \"black\"\n | AirData _ -> \"#369fd9\"\n | GroundData _ -> \"#8f5c30\"\n | RainFallData _ -> \"#0033ab\"\n | LeafletMoistureData _ -> \"#4c70c4\"\n | SoilPhData _ -> \"#cc9933\"\n | AverageWindSpeedData _ -> \"#663399\"\n | WeatherStationData _ -> \"#E6821E\"\n | LiquidLevelData _ -> \"#4d4d4d\"\n | SolarRadiationData _ -> \"#8B8000\"\n\nlet createDetailsSensorNameLink props (sensor: MapSensor) dispatch =\n let customProps = [\n sensor.Id\n |> Route.MySensSensor\n |> Clickable.onClickGoToRoute dispatch\n |> OnClick\n :> IHTMLProp\n Style [ Color(getSensorNameLinkColor sensor.Data) ] :> IHTMLProp\n ]\n\n a (List.append customProps props) [ str sensor.Name ]\n\n\ntype private AggregatedValue = {\n Label: string\n SubLabel: string\n Value: string\n}\n\nlet private createAggregatedValueRow (index: int) (value: AggregatedValue) =\n let todayColumnContent = if index = 0 then [ str \"Heute\" ] else []\n\n let labelColumn = [\n str value.Label\n sub [] [ str value.SubLabel ]\n str \":\"\n ]\n\n tr [] [\n td [] todayColumnContent\n td [] labelColumn\n td [ Class popupSecondColCls ] [ str value.Value ]\n ]\n\nlet private aggregatedValuesDailyPopup aggregatedValues =\n let rows = List.mapi createAggregatedValueRow aggregatedValues\n\n let table = table [ Style [ Width \"100%\" ] ] [ tbody [] rows ]\n\n tr [] [ td [ ColSpan 2 ] [ table ] ]\n\nlet private createAggregatedMinMaxTemperaturePopup minValue maxValue =\n let datedTemperatureString = DatedValue.toString temperatureToString\n\n [\n {\n Label = \"T\"\n SubLabel = \"min\"\n Value = datedTemperatureString minValue\n }\n {\n Label = \"T\"\n SubLabel = \"max\"\n Value = datedTemperatureString maxValue\n }\n ]\n\nlet private createAggregatedMinMaxHumidityPopup minValue maxValue =\n let datedPercentageString = DatedValue.toString percentageToString\n\n [\n {\n Label = \"BF\"\n SubLabel = \"min\"\n Value = datedPercentageString minValue\n }\n {\n Label = \"BF\"\n SubLabel = \"max\"\n Value = datedPercentageString maxValue\n }\n ]\n\nlet private createAggregatedMaxWindSpeedPopup (maxValue: DatedValue option) =\n let datedWindSpeedString = DatedValue.toString windSpeedToString\n\n let value =\n match maxValue with\n | Some max -> datedWindSpeedString max\n | None -> \"-\"\n\n [\n {\n Label = \"Wind\"\n SubLabel = \"max\"\n Value = value\n }\n ]\n\n\nlet detailsButtonRow (sensor: MapSensor) dispatch =\n tr [] [\n td [ ColSpan 2; Class detailsButtonCls ] [\n Button.button [\n Button.Color Color.IsLink\n Button.OnClick(fun _ -> dispatch (Route.MySensSensor sensor.Id |> GoToRoute |> Global))\n Button.IsOutlined\n ] [ str \"Detailseite\" ]\n ]\n ]\n\nlet makeMarkerPopupHeader (sensor: MapSensor) dispatch =\n let factory =\n if sensor.DetailsAllowed then\n createDetailsSensorNameLink\n else\n fun props sensor _ -> span props [ str sensor.Name ]\n\n let nameProperties: IHTMLProp list = [ Class \"popup-sensor-name\" :> IHTMLProp ]\n\n let sensorName = factory nameProperties sensor dispatch\n\n\n tr [ Class \"header\" ] [\n td [] [ sensorName ]\n td [ Class popupSecondColCls ] [ str (DateTime.toDateString DateTime.Now) ]\n ]\n\nlet private createPopupSymbol cls toolTip src =\n div [\n classList [\n Tooltip.ClassName, true\n iconCls, true\n cls, true\n ]\n Tooltip.dataTooltip toolTip\n ] [ img [ Src src ] ]\n\nlet makeMarkerSymbolRow (data: MapSensorData) =\n let signalStrength = SignalStrength.fromMapSensorData data\n\n let leafletWetness = LeafletWetness.getLeafletWetness data\n\n let leafletMoisture = LeafletWetness.getLeafletMoisture data\n\n let rainIntensity = RainFall.getRainFallIntensity data\n\n let averageWindSpeed = AverageWindSpeed.mapSensorDataToAverageWindSpeed data\n\n let soilPh = SoilPh.toSoilPhData data\n\n let soilMoisture = SoilMoisture.getGroundMoisture data\n\n let radiationIntensity = RadiationIntensity.getRadiationIntensity data\n\n let leftContent =\n List.choose id [\n signalStrength\n |> Option.map SignalStrength.toImageSrc\n |> Option.map (createPopupSymbol signalStrengthCls \"Empfangsstärke\")\n (getBatteryLevel data)\n |> Option.map BatteryLevel.toImageSrc\n |> Option.map (createPopupSymbol signalStrengthCls \"Batterie\")\n ]\n\n let leafletWetnessTooltipText =\n match leafletWetness with\n | Some(Wet _) -> \"Blatt nass\"\n | Some Dry -> \"Blatt trocken\"\n | None -> \"\"\n\n let rightContent =\n List.choose id [\n leafletWetness\n |> Option.map LeafletWetness.toImageSrc\n |> Option.map (createPopupSymbol leafletWetnessCls leafletWetnessTooltipText)\n leafletMoisture\n |> Option.map LeafletWetness.percentageToImageSrc\n |> Option.map (createPopupSymbol rainIntensityCls \"Blattnässe\")\n rainIntensity\n |> Option.map RainFall.toImageSrc\n |> Option.map (createPopupSymbol rainIntensityCls \"Regenmenge\")\n averageWindSpeed\n |> Option.map AverageWindSpeed.getIconForWindSpeed\n |> Option.map (createPopupSymbol wideIconCls \"Windgeschwindigkeit\")\n soilPh\n |> Option.map SoilPh.toImageSrc\n |> Option.map (createPopupSymbol wideIconCls \"PH-Wert\")\n soilMoisture\n |> Option.map SoilMoisture.toImageSrc\n |> Option.map (createPopupSymbol leafletWetnessCls \"Bodenfeuchtigkeit\")\n radiationIntensity\n |> Option.map RadiationIntensity.toImageSrc\n |> Option.map (createPopupSymbol rainIntensityCls \"Globalstrahlung\")\n ]\n\n tr [] [\n td [] leftContent\n td [ Class popupSecondColCls ] rightContent\n ]\n\nlet popupUpdateRow date =\n let timeElapsed = (DateTime.Now - date) |> TimeSpan.toHumanReadable\n\n let timeElapsedToolTip =\n sprintf \"%s (%s)\" (DateTime.toDayMonthString date) (DateTime.toTimeString date)\n\n tr [] [\n td [] [ str \"Aktualisiert:\" ]\n td [\n classList [\n (popupSecondColCls, true)\n (Tooltip.ClassName, true)\n ]\n Tooltip.dataTooltip timeElapsedToolTip\n ] [ sprintf \"vor %s\" timeElapsed |> str ]\n ]\n\nlet popupDataRow label number =\n tr [] [\n td [] [ sprintf \"%s:\" label |> str ]\n td [\n classList [\n popupSecondColCls, true\n (popupMeasurementCls, true)\n ]\n ] [ str number ]\n ]\n\nlet private noPublicSensorDataPopup = [\n tr [] [\n td [ ColSpan 2 ] [\n str\n \"Für diesen Sensor gibt es keine öffentlich sichtbaren Daten. Wenn du die Daten sehen möchtest, dann logge dich bitte ein\"\n ]\n ]\n]\n\nlet private airDataToPopup (data: AirSensorData) = [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"Temperatur\" (temperatureToString data.AirTemperature)\n popupDataRow \"Rel. Luftfeuchte\" (sprintf \" %.2f %%\" data.AirHumidity)\n popupDataRow \"Feuchttemperatur\" (temperatureToString data.HumidTemperature)\n popupDataRow \"Taupunkt\" (temperatureToString data.DewPoint)\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n createAggregatedMinMaxTemperaturePopup data.MinAirTemperature data.MaxAirTemperature\n |> aggregatedValuesDailyPopup\n]\n\nlet private groundDataToPopup (data: GroundSensorData) = [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"Rel. Bodenfeuchte\" (sprintf \" %.2f %%\" data.GroundHumidity)\n popupDataRow \"Bodentemperatur\" (temperatureToString data.GroundTemperature)\n popupDataRow \"Leitfähigkeit\" (conductivityToString data.SoilConductivity)\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n createAggregatedMinMaxHumidityPopup data.MinGroundHumidity data.MaxGroundHumidity\n |> aggregatedValuesDailyPopup\n]\n\nlet private rainFallDataToPopup (data: RainFallSensorData) =\n let maybeRainFallToString = Option.map rainFallToString >> Option.defaultValue \"-\"\n\n [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"Regen aktuell\" (rainFallToString data.CurrentRainFall)\n popupDataRow \"Regen letzte Stunde\" (maybeRainFallToString data.RainFallLastHour)\n popupDataRow \"Regen letzte 24 Stunden\" (maybeRainFallToString data.RainFallLast24h)\n ]\n\nlet private leafletMoistureDataToPopup (data: LeafletMoistureSensorData) = [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"Blattnässe\" (percentageToString data.LeafletMoisture)\n popupDataRow \"Blatttemperatur\" (temperatureToString data.LeafletTemperature)\n]\n\nlet private soilPhDataToPopup (data: SoilPhSensorData) = [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"PH-Wert\" (sprintf \"%.2f\" data.SoilPh)\n popupDataRow \"Bodentemperatur\" (temperatureToString data.SoilTemperature)\n]\n\nlet private averageWindSpeedDataToPopup (data: AverageWindSensorData) = [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"Ø Windgeschwindigkeit\" (windSpeedToString data.AverageWindSpeed)\n]\n\nlet private createCurrentWindRow (currentWind: Wind) : ReactElement =\n let direction =\n match currentWind with\n | Wind wind ->\n sprintf\n \"%s (%s)\"\n (windSpeedToString wind.WindSpeed)\n (windDirectionToCompassDirection wind.WindDirection |> compassDirectionToLabel)\n | NoWind -> \"-\"\n\n popupDataRow \"akt. Wind\" direction\n\nlet private createAverageWindSpeedRow (maybeAverageWindSpeed: float option) =\n let text =\n match maybeAverageWindSpeed with\n | Some average -> windSpeedToString average\n | None -> windSpeedToString 0.0\n\n popupDataRow \"durchschn. Windgeschw.\" text\n\n\nlet private weatherStationDataToPopup (data: WeatherStationSensorData) =\n let aggregatedValues =\n [\n createAggregatedMinMaxTemperaturePopup data.MinTemperature data.MaxTemperature\n createAggregatedMaxWindSpeedPopup data.MaxWindSpeed\n ]\n |> List.collect id\n |> aggregatedValuesDailyPopup\n\n [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"Temperatur\" (temperatureToString data.AirTemperature)\n popupDataRow \"Rel. Luftfeuchte\" (sprintf \" %.2f %%\" data.AirHumidity)\n createAverageWindSpeedRow data.AverageWindSpeed\n createCurrentWindRow data.CurrentWind\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n aggregatedValues\n ]\n\nlet private liquidLevelDataToPopup (data: LiquidLevelData) = [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"Füllstand\" (liquidLevelToString data.LiquidLevel)\n]\n\nlet private solarRadiationDataToPopup (data: SolarRadiationData) = [\n popupUpdateRow data.Date.LocalDateTime\n tr [] [ td [ ColSpan 2 ] [ hr [] ] ]\n popupDataRow \"Globalstrahlung\" (solarRadiationToString data.SolarRadiation)\n]\n\nlet noSensorDataToolTip = [\n tr [] [\n td [ ColSpan 2 ] [ str \"Heute noch keine Daten empfangen\" ]\n ]\n]\n\nlet private sensorDataToPopup (data: MapSensorData) =\n match data with\n | NoDataAvailable -> noSensorDataToolTip\n | NoPublicData -> noPublicSensorDataPopup\n | AirData airData -> airDataToPopup airData\n | GroundData groundData -> groundDataToPopup groundData\n | RainFallData rainFallData -> rainFallDataToPopup rainFallData\n | LeafletMoistureData sensorData -> leafletMoistureDataToPopup sensorData\n | SoilPhData sensorData -> soilPhDataToPopup sensorData\n | AverageWindSpeedData sensorData -> averageWindSpeedDataToPopup sensorData\n | WeatherStationData weatherStationSensorData -> weatherStationDataToPopup weatherStationSensorData\n | LiquidLevelData liquidLevelData -> liquidLevelDataToPopup liquidLevelData\n | SolarRadiationData data -> solarRadiationDataToPopup data\n\nlet makeMarkerPopup (sensor: MapSensor) dispatch =\n let rows = [\n makeMarkerPopupHeader sensor dispatch\n makeMarkerSymbolRow sensor.Data\n ]\n\n let rows = List.append rows (sensorDataToPopup sensor.Data)\n\n table [ Style [ Width \"100%\" ] ] [ tbody [] rows ]","// ts2fable 0.5.2\r\nmodule rec ReactLeaflet\r\n\r\nopen Fable.Core\r\nopen Fable.Core.JsInterop\r\nopen Fable.React\r\n\r\n[]\r\ntype GridLayerProps =\r\n | TileSize of U2\r\n | Opacity of float\r\n | UpdateWhenIdle of bool\r\n | UpdateWhenZooming of bool\r\n | UpdateInterval of float\r\n | Attribution of string\r\n | ZIndex of float\r\n | Bounds of Leaflet.LatLngBoundsExpression\r\n | MinZoom of float\r\n | MaxZoom of float\r\n | NoWrap of bool\r\n | Pane of string\r\n | ClassName of string\r\n | KeepBuffer of float\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): GridLayerProps = unbox(key, value)\r\n\r\n[]\r\ntype TileLayerProps =\r\n | TileSize of U2\r\n | Opacity of float\r\n | UpdateWhenIdle of bool\r\n | UpdateWhenZooming of bool\r\n | UpdateInterval of float\r\n | Attribution of string\r\n | ZIndex of float\r\n | Bounds of Leaflet.LatLngBoundsExpression\r\n | NoWrap of bool\r\n | Pane of string\r\n | ClassName of string\r\n | KeepBuffer of float\r\n | MinZoom of float\r\n | MaxZoom of float\r\n | MaxNativeZoom of float\r\n | MinNativeZoom of float\r\n | Subdomains of U2>\r\n | ErrorTileUrl of string\r\n | ZoomOffset of float\r\n | Tms of bool\r\n | ZoomReverse of bool\r\n | DetectRetina of bool\r\n | CrossOrigin of bool\r\n | Url of string\r\n | OnLoading of (Leaflet.LeafletEvent -> unit)\r\n | OnLoad of (Leaflet.LeafletEvent -> unit)\r\n | OnTileLoadstart of (Leaflet.TileEvent -> unit)\r\n | OnTileLoad of (Leaflet.TileEvent -> unit)\r\n | OnTileUnload of (Leaflet.TileEvent -> unit)\r\n | OnTileError of (Leaflet.TileEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): TileLayerProps = unbox(key, value)\r\n\r\n[]\r\ntype WMSTileLayerProps =\r\n | TileSize of U2\r\n | Opacity of float\r\n | UpdateWhenIdle of bool\r\n | UpdateWhenZooming of bool\r\n | UpdateInterval of float\r\n | Attribution of string\r\n | ZIndex of float\r\n | Bounds of Leaflet.LatLngBoundsExpression\r\n | NoWrap of bool\r\n | Pane of string\r\n | ClassName of string\r\n | KeepBuffer of float\r\n | MinZoom of float\r\n | MaxZoom of float\r\n | MaxNativeZoom of float\r\n | MinNativeZoom of float\r\n | Subdomains of U2>\r\n | ErrorTileUrl of string\r\n | ZoomOffset of float\r\n | Tms of bool\r\n | ZoomReverse of bool\r\n | DetectRetina of bool\r\n | CrossOrigin of bool\r\n | Url of string\r\n | Layers of string\r\n | Styles of string\r\n | Format of string\r\n | Transparent of bool\r\n | Version of string\r\n | Crs of Leaflet.CRS\r\n | Uppercase of bool\r\n | OnLoading of (Leaflet.LeafletEvent -> unit)\r\n | OnLoad of (Leaflet.LeafletEvent -> unit)\r\n | OnTileLoadstart of (Leaflet.TileEvent -> unit)\r\n | OnTileLoad of (Leaflet.TileEvent -> unit)\r\n | OnTileUnload of (Leaflet.TileEvent -> unit)\r\n | OnTileError of (Leaflet.TileEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): WMSTileLayerProps = unbox(key, value)\r\n\r\n[]\r\ntype ImageOverlayProps =\r\n | Pane of string\r\n | Opacity of float\r\n | Alt of string\r\n | Interactive of bool\r\n | Attribution of string\r\n | CrossOrigin of bool\r\n | Url of string\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): ImageOverlayProps = unbox(key, value)\r\n\r\n[]\r\n[]\r\ntype LineCapShape =\r\n | Butt\r\n | Round\r\n | Square\r\n | Inherit\r\n\r\n[]\r\n[]\r\ntype LineJoinShape =\r\n | Miter\r\n | Round\r\n | Bevel\r\n | Inherit\r\n\r\n[]\r\n[]\r\ntype FillRule =\r\n | Nonzero\r\n | Evenodd\r\n | Inherit\r\n\r\n[]\r\ntype PathProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Interactive of bool\r\n | Stroke of bool\r\n | Color of string\r\n | Weight of float\r\n | Opacity of float\r\n | LineCap of LineCapShape\r\n | LineJoin of LineJoinShape\r\n | DashArray of string\r\n | DashOffset of string\r\n | Fill of bool\r\n | FillColor of string\r\n | FillOpacity of float\r\n | FillRule of FillRule\r\n | Renderer of Leaflet.Renderer\r\n | ClassName of string\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseDown of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnAdd of (Leaflet.LeafletEvent -> unit)\r\n | OnRemove of (Leaflet.LeafletEvent -> unit)\r\n | OnPopupOpen of (Leaflet.PopupEvent -> unit)\r\n | OnPopupClose of (Leaflet.PopupEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): PathProps = unbox(key, value)\r\n\r\n[]\r\ntype PolylineProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Interactive of bool\r\n | Stroke of bool\r\n | Color of string\r\n | Weight of float\r\n | Opacity of float\r\n | LineCap of LineCapShape\r\n | LineJoin of LineJoinShape\r\n | DashArray of string\r\n | DashOffset of string\r\n | Fill of bool\r\n | FillColor of string\r\n | FillOpacity of float\r\n | FillRule of FillRule\r\n | Renderer of Leaflet.Renderer\r\n | ClassName of string\r\n | SmoothFactor of float\r\n | NoClip of bool\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseDown of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnAdd of (Leaflet.LeafletEvent -> unit)\r\n | OnRemove of (Leaflet.LeafletEvent -> unit)\r\n | OnPopupOpen of (Leaflet.PopupEvent -> unit)\r\n | OnPopupClose of (Leaflet.PopupEvent -> unit)\r\n | Positions of U3\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): PolylineProps = unbox(key, value)\r\n\r\n[]\r\ntype PolygonProps =\r\n | SmoothFactor of float\r\n | NoClip of bool\r\n | Pane of string\r\n | Attribution of string\r\n | Interactive of bool\r\n | Stroke of bool\r\n | Color of string\r\n | Weight of float\r\n | Opacity of float\r\n | LineCap of LineCapShape\r\n | LineJoin of LineJoinShape\r\n | DashArray of string\r\n | DashOffset of string\r\n | Fill of bool\r\n | FillColor of string\r\n | FillOpacity of float\r\n | FillRule of FillRule\r\n | Renderer of Leaflet.Renderer\r\n | ClassName of string\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseDown of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnAdd of (Leaflet.LeafletEvent -> unit)\r\n | OnRemove of (Leaflet.LeafletEvent -> unit)\r\n | OnPopupOpen of (Leaflet.PopupEvent -> unit)\r\n | OnPopupClose of (Leaflet.PopupEvent -> unit)\r\n | Positions of U3\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): PolygonProps = unbox(key, value)\r\n\r\n[]\r\ntype CircleMarkerProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Interactive of bool\r\n | Stroke of bool\r\n | Color of string\r\n | Weight of float\r\n | Opacity of float\r\n | LineCap of LineCapShape\r\n | LineJoin of LineJoinShape\r\n | DashArray of string\r\n | DashOffset of string\r\n | Fill of bool\r\n | FillColor of string\r\n | FillOpacity of float\r\n | FillRule of FillRule\r\n | Renderer of Leaflet.Renderer\r\n | ClassName of string\r\n | Radius of float\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseDown of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnAdd of (Leaflet.LeafletEvent -> unit)\r\n | OnRemove of (Leaflet.LeafletEvent -> unit)\r\n | OnPopupOpen of (Leaflet.PopupEvent -> unit)\r\n | OnPopupClose of (Leaflet.PopupEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): CircleMarkerProps = unbox(key, value)\r\n\r\n[]\r\ntype CircleProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Interactive of bool\r\n | Stroke of bool\r\n | Color of string\r\n | Weight of float\r\n | Opacity of float\r\n | LineCap of LineCapShape\r\n | LineJoin of LineJoinShape\r\n | DashArray of string\r\n | DashOffset of string\r\n | Fill of bool\r\n | FillColor of string\r\n | FillOpacity of float\r\n | FillRule of FillRule\r\n | Renderer of Leaflet.Renderer\r\n | ClassName of string\r\n | Radius of float\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseDown of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnAdd of (Leaflet.LeafletEvent -> unit)\r\n | OnRemove of (Leaflet.LeafletEvent -> unit)\r\n | OnPopupOpen of (Leaflet.PopupEvent -> unit)\r\n | OnPopupClose of (Leaflet.PopupEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): CircleProps = unbox(key, value)\r\n\r\n[]\r\ntype GeoJSONProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Data of Geojson.GeoJsonObject\r\n /// A Function defining how GeoJSON points spawn Leaflet layers.\r\n /// It is internally called when data is added, passing the GeoJSON point\r\n /// feature and its LatLng.\r\n ///\r\n /// The default is to spawn a default Marker:\r\n ///\r\n /// ```\r\n /// function(geoJsonPoint, latlng) {\r\n /// return L.marker(latlng);\r\n /// }\r\n /// ```\r\n | PointToLayer of ((Geojson.Feature * Leaflet.LatLng) -> Leaflet.Layer)\r\n\r\n /// A Function defining the Path options for styling GeoJSON lines and polygons,\r\n /// called internally when data is added.\r\n ///\r\n /// The default value is to not override any defaults:\r\n ///\r\n /// ```\r\n /// function (geoJsonFeature) {\r\n /// return {}\r\n /// }\r\n /// ```\r\n | Style of Leaflet.StyleFunction\r\n /// A Function that will be called once for each created Feature, after it\r\n /// has been created and styled. Useful for attaching events and popups to features.\r\n ///\r\n /// The default is to do nothing with the newly created layers:\r\n ///\r\n /// ```\r\n /// function (feature, layer) {}\r\n /// ```\r\n | OnEachFeature of ((Geojson.Feature * Leaflet.Layer) -> unit)\r\n /// A Function that will be used to decide whether to show a feature or not.\r\n ///\r\n /// The default is to show all features:\r\n ///\r\n /// ```\r\n /// function (geoJsonFeature) {\r\n /// return true;\r\n /// }\r\n /// ```\r\n | Filter of (Geojson.Feature -> bool)\r\n /// A Function that will be used for converting GeoJSON coordinates to LatLngs.\r\n /// The default is the coordsToLatLng static method.\r\n | CoordsToLatLng of (U2 -> Leaflet.LatLng)\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnLayerAdd of (Leaflet.LayerEvent -> unit)\r\n | OnLayerRemove of (Leaflet.LayerEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): GeoJSONProps = unbox(key, value)\r\n\r\n[]\r\ntype MapProps =\r\n | PreferCanvas of bool\r\n | AttributionControl of bool\r\n | ZoomControl of bool\r\n | ClosePopupOnClick of bool\r\n | ZoomSnap of float\r\n | ZoomDelta of float\r\n | TrackResize of bool\r\n | BoxZoom of bool\r\n | DoubleClickZoom of Leaflet.Zoom\r\n | Dragging of bool\r\n | Crs of Leaflet.CRS\r\n | Layers of ResizeArray\r\n | Renderer of Leaflet.Renderer\r\n | FadeAnimation of bool\r\n | MarkerZoomAnimation of bool\r\n | Transform3DLimit of float\r\n | ZoomAnimation of bool\r\n | ZoomAnimationThreshold of float\r\n | Inertia of bool\r\n | InertiaDeceleration of float\r\n | InertiaMaxSpeed of float\r\n | EaseLinearity of float\r\n | WorldCopyJump of bool\r\n | MaxBoundsViscosity of float\r\n | Keyboard of bool\r\n | KeyboardPanDelta of float\r\n | ScrollWheelZoom of Leaflet.Zoom\r\n | WheelDebounceTime of float\r\n | WheelPxPerZoomLevel of float\r\n | Tap of bool\r\n | TapTolerance of float\r\n | TouchZoom of Leaflet.Zoom\r\n | BounceAtZoomLimits of bool\r\n | Animate of bool\r\n | Bounds of Leaflet.LatLngBoundsExpression\r\n | BoundsOptions of Leaflet.FitBoundsOptions\r\n | Center of Leaflet.LatLngExpression\r\n | ClassName of string\r\n | Id of string\r\n | MaxBounds of Leaflet.LatLngBoundsExpression\r\n | MinZoom of float\r\n | UseFlyTo of bool\r\n | Zoom of float\r\n | Watch of bool\r\n | SetView of bool\r\n | MaxZoom of float\r\n | Timeout of float\r\n | MaximumAge of float\r\n | EnableHighAccuracy of bool\r\n | Duration of float\r\n | NoMoveStart of bool\r\n | PaddingTopLeft of Leaflet.PointExpression\r\n | PaddingBottomRight of Leaflet.PointExpression\r\n | Padding of Leaflet.PointExpression\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseDown of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseUp of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseMove of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnFocus of (Leaflet.LeafletEvent -> unit)\r\n | OnBlur of (Leaflet.LeafletEvent -> unit)\r\n | OnPreClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnLoad of (Leaflet.LeafletEvent -> unit)\r\n | OnUnload of (Leaflet.LeafletEvent -> unit)\r\n | OnViewReset of (Leaflet.LeafletEvent -> unit)\r\n | OnMove of (Leaflet.LeafletEvent -> unit)\r\n | OnMoveStart of (Leaflet.LeafletEvent -> unit)\r\n | OnMoveEnd of (Leaflet.LeafletEvent -> unit)\r\n | OnDragStart of (Leaflet.LeafletEvent -> unit)\r\n | OnDrag of (Leaflet.LeafletEvent -> unit)\r\n | OnDragEnd of (Leaflet.DragEndEvent -> unit)\r\n | OnZoomStart of (Leaflet.LeafletEvent -> unit)\r\n | OnZoomEnd of (Leaflet.LeafletEvent -> unit)\r\n | OnZoomLevelsChange of (Leaflet.LeafletEvent -> unit)\r\n | OnResize of (Leaflet.ResizeEvent -> unit)\r\n | OnAutopaSstart of (Leaflet.LeafletEvent -> unit)\r\n | OnLayerAdd of (Leaflet.LayerEvent -> unit)\r\n | OnLayerRemove of (Leaflet.LayerEvent -> unit)\r\n | OnBaseLayerChange of (Leaflet.LayersControlEvent -> unit)\r\n | OnOverLayerAdd of (Leaflet.LayersControlEvent -> unit)\r\n | OnOverLayerRemove of (Leaflet.LayersControlEvent -> unit)\r\n | OnLocationFound of (Leaflet.LocationEvent -> unit)\r\n | OnLocationError of (Leaflet.ErrorEvent -> unit)\r\n | OnPopupOpen of (Leaflet.PopupEvent -> unit)\r\n | OnPopupClose of (Leaflet.PopupEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom (key: string, value: obj): MapProps = unbox(key, value)\r\n static member Style (css: Props.CSSProp list) : MapProps = unbox (\"style\", keyValueList CaseRules.LowerFirst css)\r\n\r\n[]\r\n[]\r\ntype ControlPosition =\r\n | Topleft\r\n | Topright\r\n | Bottomleft\r\n | Bottomright\r\n\r\n[]\r\ntype MapControlProps =\r\n | Position of ControlPosition\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): MapControlProps = unbox(key, value)\r\n\r\n[]\r\ntype ZoomProps =\r\n | Position of ControlPosition\r\n | ZoomInText of string\r\n | ZoomInTitle of string\r\n | ZoomOutText of string\r\n | ZoomOutTitle of string\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): ZoomProps = unbox(key, value)\r\n\r\n[]\r\ntype PopupProps =\r\n | Offset of Leaflet.PointExpression\r\n | ZoomAnimation of bool\r\n | ClassName of string\r\n | Pane of string\r\n | MaxWidth of float\r\n | MinWidth of float\r\n | MaxHeight of float\r\n | AutoPan of bool\r\n | AutoPanPaddingTopLeft of Leaflet.PointExpression\r\n | AutoPanPaddingBottomRight of Leaflet.PointExpression\r\n | AutoPanPadding of Leaflet.PointExpression\r\n | KeepInView of bool\r\n | CloseButton of bool\r\n | AutoClose of bool\r\n | CloseOnClick of bool\r\n | OnClose of (Leaflet.Popup -> unit)\r\n | OnOpen of (Leaflet.Popup -> unit)\r\n | Position of Leaflet.LatLngBoundsExpression\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): PopupProps = unbox(key, value)\r\n\r\n[]\r\n[]\r\ntype Direction =\r\n | Right\r\n | Left\r\n | Top\r\n | Bottom\r\n | Center\r\n | Auto\r\n\r\n[]\r\ntype TooltipProps =\r\n | ZoomAnimation of bool\r\n | ClassName of string\r\n | Pane of string\r\n | Offset of Leaflet.PointExpression\r\n | Direction of Direction\r\n | Permanent of bool\r\n | Sticky of bool\r\n | Interactive of bool\r\n | Opacity of float\r\n | OnClose of (Leaflet.Tooltip -> unit)\r\n | OnOpen of (Leaflet.Tooltip -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): TooltipProps = unbox(key, value)\r\n\r\n[]\r\ntype MarkerProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Interactive of bool\r\n | Icon of U2, Leaflet.DivIcon>\r\n | Clickable of bool\r\n | Draggable of bool\r\n | Keyboard of bool\r\n | Title of string\r\n | Alt of string\r\n | ZIndexOffset of float\r\n | Opacity of float\r\n | RiseOnHover of bool\r\n | RiseOffset of float\r\n | Position of Leaflet.LatLngExpression\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseDown of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDragStart of (Leaflet.LeafletEvent -> unit)\r\n | OnDrag of (Leaflet.LeafletEvent -> unit)\r\n | OnDragEnd of (Leaflet.DragEndEvent -> unit)\r\n | OnMove of (Leaflet.LeafletEvent -> unit)\r\n | OnAdd of (Leaflet.LeafletEvent -> unit)\r\n | OnRemove of (Leaflet.LeafletEvent -> unit)\r\n | OnPopupOpen of (Leaflet.PopupEvent -> unit)\r\n | OnPopupClose of (Leaflet.PopupEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): MarkerProps = unbox(key, value)\r\n\r\n[]\r\ntype RectangleProps =\r\n | Bounds of Leaflet.LatLngBoundsExpression\r\n | Pane of string\r\n | Attribution of string\r\n | Interactive of bool\r\n | Stroke of bool\r\n | Color of string\r\n | Weight of float\r\n | Opacity of float\r\n | LineCap of LineCapShape\r\n | LineJoin of LineJoinShape\r\n | DashArray of string\r\n | DashOffset of string\r\n | Fill of bool\r\n | FillColor of string\r\n | FillOpacity of float\r\n | FillRule of FillRule\r\n | Renderer of Leaflet.Renderer\r\n | ClassName of string\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseDown of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnAdd of (Leaflet.LeafletEvent -> unit)\r\n | OnRemove of (Leaflet.LeafletEvent -> unit)\r\n | OnPopupOpen of (Leaflet.PopupEvent -> unit)\r\n | OnPopupClose of (Leaflet.PopupEvent -> unit)\r\n | PopupContainer of Leaflet.FeatureGroup\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): RectangleProps = unbox(key, value)\r\n\r\n[]\r\ntype AttributionControlProps =\r\n | Prefix of U2\r\n | Position of ControlPosition\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): AttributionControlProps = unbox(key, value)\r\n\r\n[]\r\ntype LayersControlProps =\r\n | BaseLayers of Leaflet.Control.LayersObject\r\n | Overlays of Leaflet.Control.LayersObject\r\n | OnBaseLayerChange of (Leaflet.LayersControlEvent -> unit)\r\n | OnOverLayerAdd of (Leaflet.LayersControlEvent -> unit)\r\n | OnOverLayerRmove of (Leaflet.LayersControlEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): LayersControlProps = unbox(key, value)\r\n\r\n[]\r\ntype ScaleControlProps =\r\n | MaxWidth of float\r\n | Metric of bool\r\n | Imperial of bool\r\n | UpdateWhenIdle of bool\r\n | Position of ControlPosition\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): ScaleControlProps = unbox(key, value)\r\n\r\n[]\r\ntype ZoomControlProps =\r\n | ZoomInText of string\r\n | ZoomInTitle of string\r\n | ZoomOutText of string\r\n | ZoomOutTitle of string\r\n | Position of ControlPosition\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): ZoomControlProps = unbox(key, value)\r\n\r\n[]\r\ntype PaneProps =\r\n | Name of string\r\n | Map of Leaflet.Map\r\n | ClassName of string\r\n | Pane of string\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Style (css: Props.CSSProp list) : MapProps = unbox (\"style\", keyValueList CaseRules.LowerFirst css)\r\n static member Custom(key: string, value: obj): PaneProps = unbox(key, value)\r\n\r\n[]\r\ntype MapLayerProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): MapLayerProps = unbox(key, value)\r\n\r\n[]\r\ntype LayerGroupProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): LayerGroupProps = unbox(key, value)\r\n\r\n[]\r\ntype FeatureGroupProps =\r\n | Pane of string\r\n | Attribution of string\r\n | Interactive of bool\r\n | Stroke of bool\r\n | Color of string\r\n | Weight of float\r\n | Opacity of float\r\n | LineCap of LineCapShape\r\n | LineJoin of LineJoinShape\r\n | DashArray of string\r\n | DashOffset of string\r\n | Fill of bool\r\n | FillColor of string\r\n | FillOpacity of float\r\n | FillRule of FillRule\r\n | Renderer of Leaflet.Renderer\r\n | ClassName of string\r\n | OnClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnDblClick of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOver of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnMouseOut of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnContextMenu of (Leaflet.LeafletMouseEvent -> unit)\r\n | OnLayerAdd of (Leaflet.LayerEvent -> unit)\r\n | OnLayerRemove of (Leaflet.LayerEvent -> unit)\r\n | Ref of (obj -> unit)\r\n | Key of string\r\n static member Custom(key: string, value: obj): FeatureGroupProps = unbox(key, value)\r\n\r\nlet inline mapComponent (props: MapProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"MapComponent\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline map (props: MapProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Map\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline pane (props: PaneProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Pane\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline mapLayer (props: MapLayerProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"MapLayer\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline gridLayer (props: GridLayerProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"GridLayer\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline tileLayer (props: TileLayerProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"TileLayer\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline wMSTileLayer (props: WMSTileLayerProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"WMSTileLayer\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline imageOverlay (props: ImageOverlayProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"ImageOverlay\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline layerGroup (props: LayerGroupProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"LayerGroup\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline marker (props: MarkerProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Marker\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline path (props: PathProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Path\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline circle (props: CircleProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Circle\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline circleMarker (props: CircleMarkerProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"CircleMarker\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline featureGroup (props: FeatureGroupProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"FeatureGroup\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline geoJSON (props: GeoJSONProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"GeoJSON\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline polyline (props: PolylineProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Polyline\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline polygon (props: PolygonProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Polygon\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline rectangle (props: RectangleProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Rectangle\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline popup (props: PopupProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Popup\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline tooltip (props: TooltipProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"Tooltip\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline mapControl (props: MapControlProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"MapControl\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline attributionControl (props: AttributionControlProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"AttributionControl\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline layersControl (props: LayersControlProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"LayersControl\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline scaleControl (props: ScaleControlProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"ScaleControl\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n\r\nlet inline zoomControl (props: ZoomControlProps list) (children : ReactElement list) : ReactElement =\r\n ofImport \"ZoomControl\" \"react-leaflet\" (keyValueList CaseRules.LowerFirst props) children\r\n","namespace Client.InfrastructureTypes\n\nopen Fable.Remoting.Client\n\n\n[]\nmodule Exceptions =\n let getStatusCode (ex: exn) =\n match ex with\n | :? ProxyRequestException as pre -> pre.Response.StatusCode\n | _ -> 147","module Client.PublicMap\n\nopen System\nopen Client\nopen Client.InfrastructureTypes\nopen Client.Map.SensorPopup\nopen Client.Map.MapMarker\nopen Elmish\nopen Fable.React.Props\nopen Fable.React\nopen Leaflet\nopen ReactLeaflet\nopen Client.Infrastructure.Api\nopen Client.DomainTypes.Msg\nopen Shared.Dto.MapSensorData\nopen Thoth.Elmish\n\ntype Model = {\n Sensors: MapSensor list\n LastUpdate: DateTimeOffset option\n}\n\n\nlet view (model: Model) dispatch =\n let markers =\n model.Sensors\n |> List.map (fun sensor ->\n let position = makePosition sensor.Latitude sensor.Longitude\n\n let popupContent = makeMarkerPopup sensor dispatch\n makeMarker sensor.Data position popupContent\n )\n\n div [] [\n map\n [\n MapProps.Center(LatLngExpression.Case3(47.158600, 15.626357))\n MapProps.Zoom 14.2\n MapProps.Dragging false\n MapProps.Style [ Height \"100vh\" ]\n MapProps.ZoomControl false\n MapProps.BoxZoom false\n MapProps.ScrollWheelZoom(Zoom.Case1 false)\n MapProps.TouchZoom(Zoom.Case1 false)\n MapProps.DoubleClickZoom(Zoom.Case1 false)\n ]\n (tileLayer [\n TileLayerProps.Url \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n ] []\n :: markers)\n ]\n\nlet init =\n let model = {\n Sensors = []\n LastUpdate = None\n }\n\n let cmd =\n Cmd.OfAsync.either api.getPublicSensors () PublicMapMsg.GotSensors PublicMapMsg.SensorLoadingFailed\n\n model, cmd\n\nlet update (msg: PublicMapMsg) (model: Model) =\n match msg with\n | PublicMapMsg.GotSensors sensors ->\n let dates =\n sensors\n |> List.map (fun sensor -> getSensorDataDate sensor.Data)\n |> List.choose id\n\n let latestDate =\n match dates with\n | x :: _ -> Some(List.max dates)\n | _ -> None\n\n\n {\n model with\n Sensors = sensors\n LastUpdate = latestDate\n },\n Cmd.none\n | PublicMapMsg.SensorLoadingFailed ex ->\n let statusCode = Exceptions.getStatusCode ex\n\n let message =\n match statusCode with\n | 500 -> \"Interner Server Fehler ist aufgetreten. Bitte wende dich an den Administrator\"\n | _ -> sprintf \"Fehlermeldung: '%s'. Bitte wende dich an den Administrator\" ex.Message\n\n let toastCmd =\n Toast.create message\n |> Toast.errorTitle statusCode\n |> Toast.timeout (TimeSpan.FromSeconds 10.0)\n |> Toast.error\n\n\n model, toastCmd","namespace Thoth.Json\nopen System.Text.RegularExpressions\n\ntype JsonValue = obj\n\ntype ErrorReason =\n | BadPrimitive of string * JsonValue\n | BadPrimitiveExtra of string * JsonValue * string\n | BadType of string * JsonValue\n | BadField of string * JsonValue\n | BadPath of string * JsonValue * string\n | TooSmallArray of string * JsonValue\n | FailMessage of string\n | BadOneOf of string list\n\ntype CaseStrategy =\n | PascalCase\n | CamelCase\n | SnakeCase\n\ntype DecoderError = string * ErrorReason\n\ntype Decoder<'T> = string -> JsonValue -> Result<'T, DecoderError>\n\ntype Encoder<'T> = 'T -> JsonValue\n\ntype BoxedDecoder = Decoder\n\ntype BoxedEncoder = Encoder\n\ntype ExtraCoders =\n { Hash: string\n Coders: Map }\n\nmodule internal Util =\n open System.Collections.Generic\n\n type Cache<'Value>() =\n let cache = Dictionary()\n member __.GetOrAdd(key, factory) =\n match cache.TryGetValue(key) with\n | true, x -> x\n | false, _ ->\n let x = factory()\n cache.Add(key, x)\n x\n\n // Tree shaking will remove this if not used\n // so no need to make them lazy in Fable\n let CachedEncoders = Cache()\n let CachedDecoders = Cache()\n\n module Casing =\n let lowerFirst (str : string) = str.[..0].ToLowerInvariant() + str.[1..]\n let convert caseStrategy fieldName =\n match caseStrategy with\n | CamelCase -> lowerFirst fieldName\n | SnakeCase -> Regex.Replace(lowerFirst fieldName, \"[A-Z]\",\"_$0\").ToLowerInvariant()\n | PascalCase -> fieldName","namespace Thoth.Json\nopen System.Text.RegularExpressions\n\n[]\nmodule Encode =\n\n open System.Collections.Generic\n open System.Globalization\n open Fable.Core\n open Fable.Core.JsInterop\n\n []\n let private arrayFrom(x: JsonValue seq): JsonValue = jsNative\n\n ///**Description**\n /// Encode a string\n ///\n ///**Parameters**\n /// * `value` - parameter of type `string`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let inline string (value : string) : JsonValue =\n box value\n\n let inline char (value : char) : JsonValue =\n box value\n\n ///**Description**\n /// Encode a GUID\n ///\n ///**Parameters**\n /// * `value` - parameter of type `System.Guid`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let guid (value : System.Guid) : JsonValue =\n box (value.ToString())\n\n ///**Description**\n /// Encode a Float. `Infinity` and `NaN` are encoded as `null`.\n ///\n ///**Parameters**\n /// * `value` - parameter of type `float`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let inline float (value : float) : JsonValue =\n box value\n\n let inline float32 (value : float32) : JsonValue =\n box value\n\n ///**Description**\n /// Encode a Decimal.\n ///\n ///**Parameters**\n /// * `value` - parameter of type `decimal`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let decimal (value : decimal) : JsonValue =\n value.ToString() |> string\n\n ///**Description**\n /// Encode null\n ///\n ///**Parameters**\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let nil : JsonValue =\n box null\n\n ///**Description**\n /// Encode a bool\n ///**Parameters**\n /// * `value` - parameter of type `bool`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let inline bool (value : bool) : JsonValue =\n box value\n\n ///**Description**\n /// Encode an object\n ///\n ///**Parameters**\n /// * `values` - parameter of type `(string * Value) list`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let object (values : (string * JsonValue) seq) : JsonValue =\n let o = obj()\n for (key, value) in values do\n o?(key) <- value\n box o\n\n ///**Description**\n /// Encode an array\n ///\n ///**Parameters**\n /// * `values` - parameter of type `Value array`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let inline array (values : JsonValue array) : JsonValue =\n box values\n\n ///**Description**\n /// Encode a list\n ///**Parameters**\n /// * `values` - parameter of type `Value list`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let list (values : JsonValue list) : JsonValue =\n // Don't use List.toArray as it may create a typed array\n arrayFrom values\n\n let seq (values : JsonValue seq) : JsonValue =\n arrayFrom values\n\n ///**Description**\n /// Encode a dictionary\n ///**Parameters**\n /// * `values` - parameter of type `Map`\n ///\n ///**Output Type**\n /// * `Value`\n ///\n ///**Exceptions**\n ///\n let dict (values : Map) : JsonValue =\n values\n |> Map.toList\n |> object\n\n let bigint (value : bigint) : JsonValue =\n box (value.ToString())\n\n let datetimeOffset (value : System.DateTimeOffset) : JsonValue =\n value.ToString(\"O\", CultureInfo.InvariantCulture) |> string\n\n /// **Description**\n /// Encode a timespan\n /// **Parameters**\n /// * `value` - parameter of type `System.TimeSpan`\n ///\n /// **Output Type**\n /// * `Value`\n ///\n /// **Exceptions**\n ///\n let timespan (value : System.TimeSpan) : JsonValue =\n value.ToString() |> string\n\n let inline sbyte (value : sbyte) : JsonValue =\n box value\n\n let inline byte (value : byte) : JsonValue =\n box value\n\n let inline int16 (value : int16) : JsonValue =\n box value\n\n let inline uint16 (value : uint16) : JsonValue =\n box value\n\n let inline int (value : int) : JsonValue =\n box value\n\n let inline uint32 (value : uint32) : JsonValue =\n box value\n\n let int64 (value : int64) : JsonValue =\n box (value.ToString(CultureInfo.InvariantCulture))\n\n let uint64 (value : uint64) : JsonValue =\n box (value.ToString(CultureInfo.InvariantCulture))\n\n let unit () : JsonValue =\n box null\n\n let tuple2\n (enc1 : Encoder<'T1>)\n (enc2 : Encoder<'T2>)\n (v1, v2) : JsonValue =\n box [| enc1 v1\n enc2 v2 |]\n\n let tuple3\n (enc1 : Encoder<'T1>)\n (enc2 : Encoder<'T2>)\n (enc3 : Encoder<'T3>)\n (v1, v2, v3) : JsonValue =\n box [| enc1 v1\n enc2 v2\n enc3 v3 |]\n\n let tuple4\n (enc1 : Encoder<'T1>)\n (enc2 : Encoder<'T2>)\n (enc3 : Encoder<'T3>)\n (enc4 : Encoder<'T4>)\n (v1, v2, v3, v4) : JsonValue =\n box [| enc1 v1\n enc2 v2\n enc3 v3\n enc4 v4 |]\n\n let tuple5\n (enc1 : Encoder<'T1>)\n (enc2 : Encoder<'T2>)\n (enc3 : Encoder<'T3>)\n (enc4 : Encoder<'T4>)\n (enc5 : Encoder<'T5>)\n (v1, v2, v3, v4, v5) : JsonValue =\n box [| enc1 v1\n enc2 v2\n enc3 v3\n enc4 v4\n enc5 v5 |]\n\n let tuple6\n (enc1 : Encoder<'T1>)\n (enc2 : Encoder<'T2>)\n (enc3 : Encoder<'T3>)\n (enc4 : Encoder<'T4>)\n (enc5 : Encoder<'T5>)\n (enc6 : Encoder<'T6>)\n (v1, v2, v3, v4, v5, v6) : JsonValue =\n box [| enc1 v1\n enc2 v2\n enc3 v3\n enc4 v4\n enc5 v5\n enc6 v6 |]\n\n let tuple7\n (enc1 : Encoder<'T1>)\n (enc2 : Encoder<'T2>)\n (enc3 : Encoder<'T3>)\n (enc4 : Encoder<'T4>)\n (enc5 : Encoder<'T5>)\n (enc6 : Encoder<'T6>)\n (enc7 : Encoder<'T7>)\n (v1, v2, v3, v4, v5, v6, v7) : JsonValue =\n box [| enc1 v1\n enc2 v2\n enc3 v3\n enc4 v4\n enc5 v5\n enc6 v6\n enc7 v7 |]\n\n let tuple8\n (enc1 : Encoder<'T1>)\n (enc2 : Encoder<'T2>)\n (enc3 : Encoder<'T3>)\n (enc4 : Encoder<'T4>)\n (enc5 : Encoder<'T5>)\n (enc6 : Encoder<'T6>)\n (enc7 : Encoder<'T7>)\n (enc8 : Encoder<'T8>)\n (v1, v2, v3, v4, v5, v6, v7, v8) : JsonValue =\n box [| enc1 v1\n enc2 v2\n enc3 v3\n enc4 v4\n enc5 v5\n enc6 v6\n enc7 v7\n enc8 v8 |]\n\n let map (keyEncoder : Encoder<'key>) (valueEncoder : Encoder<'value>) (values : Map<'key, 'value>) : JsonValue =\n values\n |> Map.toList\n |> List.map (tuple2 keyEncoder valueEncoder)\n |> list\n\n ////////////\n // Enum ///\n /////////\n\n module Enum =\n\n let byte<'TEnum when 'TEnum : enum> (value : 'TEnum) : JsonValue =\n LanguagePrimitives.EnumToValue value\n |> byte\n\n let sbyte<'TEnum when 'TEnum : enum> (value : 'TEnum) : JsonValue =\n LanguagePrimitives.EnumToValue value\n |> sbyte\n\n let int16<'TEnum when 'TEnum : enum> (value : 'TEnum) : JsonValue =\n LanguagePrimitives.EnumToValue value\n |> int16\n\n let uint16<'TEnum when 'TEnum : enum> (value : 'TEnum) : JsonValue =\n LanguagePrimitives.EnumToValue value\n |> uint16\n\n let int<'TEnum when 'TEnum : enum> (value : 'TEnum) : JsonValue =\n LanguagePrimitives.EnumToValue value\n |> int\n\n let uint32<'TEnum when 'TEnum : enum> (value : 'TEnum) : JsonValue =\n LanguagePrimitives.EnumToValue value\n |> uint32\n\n /// **Description**\n ///\n /// The DateTime is always encoded using UTC representation\n ///\n /// **Parameters**\n /// * `value` - parameter of type `System.DateTime`\n ///\n /// **Output Type**\n /// * `Value`\n ///\n /// **Exceptions**\n ///\n let datetime (value : System.DateTime) : JsonValue =\n value.ToString(\"O\", CultureInfo.InvariantCulture) |> string\n\n ///**Description**\n /// Convert a `Value` into a prettified string.\n ///**Parameters**\n /// * `space` - parameter of type `int` - Amount of indentation\n /// * `value` - parameter of type `obj` - Value to convert\n ///\n ///**Output Type**\n /// * `string`\n ///\n ///**Exceptions**\n ///\n let toString (space: int) (value: JsonValue) : string =\n JS.JSON.stringify(value, space=space)\n\n ///**Description**\n /// Encode an option\n ///**Parameters**\n /// * `encoder` - parameter of type `'a -> Value`\n ///\n ///**Output Type**\n /// * `'a option -> Value`\n ///\n ///**Exceptions**\n ///\n let option (encoder : 'a -> JsonValue) =\n Option.map encoder >> Option.defaultWith (fun _ -> nil)\n\n //////////////////\n // Reflection ///\n ////////////////\n\n open FSharp.Reflection\n open Fable.Core.DynamicExtensions\n\n // As generics are erased by Fable, let's just do an unsafe cast for performance\n let inline boxEncoder (d: Encoder<'T>): BoxedEncoder =\n !!d\n\n let inline unboxEncoder (d: BoxedEncoder): Encoder<'T> =\n !!d\n\n let rec private autoEncodeRecordsAndUnions extra (caseStrategy : CaseStrategy) (skipNullField : bool) (t: System.Type) : BoxedEncoder =\n // Add the encoder to extra in case one of the fields is recursive\n let encoderRef = ref Unchecked.defaultof<_>\n let extra =\n // As of 3.7.17 Fable assigns empty name to anonymous record, we shouldn't add them to the map to avoid conflicts.\n // Anonymous records cannot be recursive anyways, see #144\n match t.FullName with\n | \"\" -> extra\n | fullName -> extra |> Map.add fullName encoderRef\n let encoder =\n if FSharpType.IsRecord(t, allowAccessToPrivateRepresentation=true) then\n let setters =\n FSharpType.GetRecordFields(t, allowAccessToPrivateRepresentation=true)\n |> Array.map (fun fi ->\n let targetKey = Util.Casing.convert caseStrategy fi.Name\n let encode = autoEncoder extra caseStrategy skipNullField fi.PropertyType\n fun (source: obj) (target: JsonValue) ->\n let value = FSharpValue.GetRecordField(source, fi)\n if not skipNullField || (skipNullField && not (isNull value)) then // Discard null fields\n target.[targetKey] <- encode value\n target)\n fun (source: obj) ->\n (JsonValue(), setters) ||> Seq.fold (fun target set -> set source target)\n elif FSharpType.IsUnion(t, allowAccessToPrivateRepresentation=true) then\n fun (value: obj) ->\n let info, fields = FSharpValue.GetUnionFields(value, t, allowAccessToPrivateRepresentation=true)\n match fields.Length with\n | 0 -> string info.Name\n | len ->\n let fieldTypes = info.GetFields()\n let target = Array.zeroCreate (len + 1)\n target.[0] <- string info.Name\n for i = 1 to len do\n let encode = autoEncoder extra caseStrategy skipNullField fieldTypes.[i-1].PropertyType\n target.[i] <- encode fields.[i-1]\n array target\n else\n // Don't use failwithf here, for some reason F#/Fable compiles it as a function\n // when the return type is a function too, so it doesn't fail immediately\n sprintf \"\"\"Cannot generate auto encoder for %s. Please pass an extra encoder.\n\nDocumentation available at: https://thoth-org.github.io/Thoth.Json/documentation/auto/extra-coders.html#ready-to-use-extra-coders\"\"\" t.FullName\n |> failwith\n encoderRef.Value <- encoder\n encoder\n\n and private autoEncoder (extra: Map>) caseStrategy (skipNullField : bool) (t: System.Type) : BoxedEncoder =\n let fullname = t.FullName\n match Map.tryFind fullname extra with\n | Some encoderRef -> fun v -> encoderRef.contents v\n | None ->\n if t.IsArray then\n let encoder = t.GetElementType() |> autoEncoder extra caseStrategy skipNullField\n fun (value: obj) ->\n value :?> obj seq |> Seq.map encoder |> seq\n elif t.IsEnum then\n let enumType = System.Enum.GetUnderlyingType(t).FullName\n if enumType = typeof.FullName then\n boxEncoder sbyte\n elif enumType = typeof.FullName then\n boxEncoder byte\n elif enumType = typeof.FullName then\n boxEncoder int16\n elif enumType = typeof.FullName then\n boxEncoder uint16\n elif enumType = typeof.FullName then\n boxEncoder int\n elif enumType = typeof.FullName then\n boxEncoder uint32\n else\n failwithf\n \"\"\"Cannot generate auto encoder for %s.\nThoth.Json.Net only support the following enum types:\n- sbyte\n- byte\n- int16\n- uint16\n- int\n- uint32\n\nIf you can't use one of these types, please pass an extra encoder.\n\nDocumentation available at: https://thoth-org.github.io/Thoth.Json/documentation/auto/extra-coders.html#ready-to-use-extra-coders\n \"\"\" t.FullName\n elif t.IsGenericType then\n if FSharpType.IsTuple(t) then\n let encoders =\n FSharpType.GetTupleElements(t)\n |> Array.map (autoEncoder extra caseStrategy skipNullField)\n fun (value: obj) ->\n FSharpValue.GetTupleFields(value)\n |> Seq.mapi (fun i x -> encoders.[i] x) |> seq\n else\n let fullname = t.GetGenericTypeDefinition().FullName\n if fullname = typedefof.FullName then\n // Evaluate lazily so we don't need to generate the encoder for null values\n let encoder = lazy\n t.GenericTypeArguments.[0]\n |> autoEncoder extra caseStrategy skipNullField\n |> option\n |> boxEncoder\n boxEncoder(fun (value: obj) ->\n if isNull value then nil\n else encoder.Value value)\n elif fullname = typedefof.FullName\n || fullname = typedefof>.FullName\n || fullname = typedefof.FullName then\n let encoder = t.GenericTypeArguments.[0] |> autoEncoder extra caseStrategy skipNullField\n fun (value: obj) ->\n value :?> obj seq |> Seq.map encoder |> seq\n elif fullname = typedefof< Map >.FullName then\n let keyType = t.GenericTypeArguments.[0]\n let valueEncoder = t.GenericTypeArguments.[1] |> autoEncoder extra caseStrategy skipNullField\n if keyType.FullName = typeof.FullName\n || keyType.FullName = typeof.FullName then\n fun value ->\n // Fable compiles Guids as strings so this works, but maybe we should make the conversion explicit\n // (see dotnet version) in case Fable implementation of Guids change\n (JsonValue(), value :?> Map)\n ||> Seq.fold (fun target (KeyValue(k,v)) ->\n target.[k] <- valueEncoder v\n target)\n else\n let keyEncoder = keyType |> autoEncoder extra caseStrategy skipNullField\n fun value ->\n value :?> Map |> Seq.map (fun (KeyValue(k,v)) ->\n array [|keyEncoder k; valueEncoder v|]) |> seq\n else\n autoEncodeRecordsAndUnions extra caseStrategy skipNullField t\n else\n if fullname = typeof.FullName then\n boxEncoder bool\n elif fullname = typeof.FullName then\n boxEncoder unit\n elif fullname = typeof.FullName then\n boxEncoder string\n elif fullname = typeof.FullName then\n boxEncoder char\n elif fullname = typeof.FullName then\n boxEncoder sbyte\n elif fullname = typeof.FullName then\n boxEncoder byte\n elif fullname = typeof.FullName then\n boxEncoder int16\n elif fullname = typeof.FullName then\n boxEncoder uint16\n elif fullname = typeof.FullName then\n boxEncoder int\n elif fullname = typeof.FullName then\n boxEncoder uint32\n elif fullname = typeof.FullName then\n boxEncoder float\n elif fullname = typeof.FullName then\n boxEncoder float32\n // These number types require extra libraries in Fable. To prevent penalizing\n // all users, extra encoders (withInt64, etc) must be passed when they're needed.\n\n // elif fullname = typeof.FullName then\n // boxEncoder int64\n // elif fullname = typeof.FullName then\n // boxEncoder uint64\n // elif fullname = typeof.FullName then\n // boxEncoder bigint\n // elif fullname = typeof.FullName then\n // boxEncoder decimal\n elif fullname = typeof.FullName then\n boxEncoder datetime\n elif fullname = typeof.FullName then\n boxEncoder datetimeOffset\n elif fullname = typeof.FullName then\n boxEncoder timespan\n elif fullname = typeof.FullName then\n boxEncoder guid\n elif fullname = typeof.FullName then\n boxEncoder id\n else\n autoEncodeRecordsAndUnions extra caseStrategy skipNullField t\n\n let private makeExtra (extra: ExtraCoders option) =\n match extra with\n | None -> Map.empty\n | Some e -> Map.map (fun _ (enc,_) -> ref enc) e.Coders\n\n type Auto =\n static member generateBoxedEncoderCached(t: System.Type, ?caseStrategy : CaseStrategy, ?extra: ExtraCoders, ?skipNullField: bool): BoxedEncoder =\n let caseStrategy = defaultArg caseStrategy PascalCase\n let skipNullField = defaultArg skipNullField true\n\n let key =\n t.FullName\n |> (+) (Operators.string caseStrategy)\n |> (+) (extra |> Option.map (fun e -> e.Hash) |> Option.defaultValue \"\")\n\n Util.CachedEncoders.GetOrAdd(key , fun _ ->\n autoEncoder (makeExtra extra) caseStrategy skipNullField t)\n\n static member inline generateEncoderCached<'T>(?caseStrategy : CaseStrategy, ?extra: ExtraCoders, ?skipNullField: bool): Encoder<'T> =\n Auto.generateBoxedEncoderCached(typeof<'T>, ?caseStrategy=caseStrategy, ?extra=extra) |> unboxEncoder\n\n static member generateBoxedEncoder(t: System.Type, ?caseStrategy : CaseStrategy, ?extra: ExtraCoders, ?skipNullField: bool): BoxedEncoder =\n let caseStrategy = defaultArg caseStrategy PascalCase\n let skipNullField = defaultArg skipNullField true\n autoEncoder (makeExtra extra) caseStrategy skipNullField t\n\n static member inline generateEncoder<'T>(?caseStrategy : CaseStrategy, ?extra: ExtraCoders, ?skipNullField: bool): Encoder<'T> =\n Auto.generateBoxedEncoder(typeof<'T>, ?caseStrategy=caseStrategy, ?extra=extra, ?skipNullField=skipNullField) |> unboxEncoder\n\n static member inline toString(space : int, value : 'T, ?caseStrategy : CaseStrategy, ?extra: ExtraCoders, ?skipNullField: bool) : string =\n let encoder = Auto.generateEncoder(?caseStrategy=caseStrategy, ?extra=extra, ?skipNullField=skipNullField)\n encoder value |> toString space\n\n static member inline toString(value : 'T, ?caseStrategy : CaseStrategy, ?extra: ExtraCoders, ?skipNullField: bool) : string =\n Auto.toString(0, value, ?caseStrategy=caseStrategy, ?extra=extra, ?skipNullField=skipNullField)\n\n ///**Description**\n /// Convert a `Value` into a prettified string.\n ///**Parameters**\n /// * `space` - parameter of type `int` - Amount of indentation\n /// * `value` - parameter of type `obj` - Value to convert\n ///\n ///**Output Type**\n /// * `string`\n ///\n ///**Exceptions**\n ///\n []\n let encode (space: int) (value: JsonValue) : string = toString space value\n","\nnamespace Thoth.Json\nopen System.Text.RegularExpressions\n\n[]\nmodule Decode =\n\n open System.Globalization\n open Fable.Core\n open Fable.Core.JsInterop\n\n module Helpers =\n []\n let jsTypeof (_ : JsonValue) : string = jsNative\n\n []\n let isSyntaxError (_ : JsonValue) : bool = jsNative\n\n let inline getField (fieldName: string) (o: JsonValue) = o?(fieldName)\n let inline isString (o: JsonValue) : bool = o :? string\n\n let inline isBoolean (o: JsonValue) : bool = o :? bool\n\n let inline isNumber (o: JsonValue) : bool = jsTypeof o = \"number\"\n\n let inline isArray (o: JsonValue) : bool = JS.Constructors.Array.isArray(o)\n\n []\n let isObject (_ : JsonValue) : bool = jsNative\n\n let inline isNaN (o: JsonValue) : bool = JS.Constructors.Number.isNaN(!!o)\n\n let inline isNullValue (o: JsonValue): bool = isNull o\n\n /// is the value an integer? This returns false for 1.1, NaN, Infinite, ...\n []\n let isIntegralValue (_: JsonValue) : bool = jsNative\n\n []\n let isBetweenInclusive(_v: JsonValue, _min: obj, _max: obj) = jsNative\n\n []\n let isIntFinite (_: JsonValue) : bool = jsNative\n\n let isUndefined (o: JsonValue): bool = jsTypeof o = \"undefined\"\n\n []\n let anyToString (_: JsonValue) : string = jsNative\n\n let inline isFunction (o: JsonValue) : bool = jsTypeof o = \"function\"\n\n let inline objectKeys (o: JsonValue) : string seq = upcast JS.Constructors.Object.keys(o)\n let inline asBool (o: JsonValue): bool = unbox o\n let inline asInt (o: JsonValue): int = unbox o\n let inline asFloat (o: JsonValue): float = unbox o\n let inline asFloat32 (o: JsonValue): float32 = unbox o\n let inline asString (o: JsonValue): string = unbox o\n let inline asArray (o: JsonValue): JsonValue[] = unbox o\n\n let private genericMsg msg value newLine =\n try\n \"Expecting \"\n + msg\n + \" but instead got:\"\n + (if newLine then \"\\n\" else \" \")\n + (Helpers.anyToString value)\n with\n | _ ->\n \"Expecting \"\n + msg\n + \" but decoder failed. Couldn't report given value due to circular structure.\"\n + (if newLine then \"\\n\" else \" \")\n\n let private errorToString (path : string, error) =\n let reason =\n match error with\n | BadPrimitive (msg, value) ->\n genericMsg msg value false\n | BadType (msg, value) ->\n genericMsg msg value true\n | BadPrimitiveExtra (msg, value, reason) ->\n genericMsg msg value false + \"\\nReason: \" + reason\n | BadField (msg, value) ->\n genericMsg msg value true\n | BadPath (msg, value, fieldName) ->\n genericMsg msg value true + (\"\\nNode `\" + fieldName + \"` is unkown.\")\n | TooSmallArray (msg, value) ->\n \"Expecting \" + msg + \".\\n\" + (Helpers.anyToString value)\n | BadOneOf messages ->\n \"The following errors were found:\\n\\n\" + String.concat \"\\n\\n\" messages\n | FailMessage msg ->\n \"The following `failure` occurred with the decoder: \" + msg\n\n match error with\n | BadOneOf _ ->\n // Don't need to show the path here because each error case will show it's own path\n reason\n | _ ->\n \"Error at: `\" + path + \"`\\n\" + reason\n\n ///////////////\n // Runners ///\n /////////////\n\n /// \n /// Runs the decoder against the given JSON value.\n ///\n /// If the decoder fails, it reports the error prefixed with the given path.\n ///\n /// \n /// \n /// \n /// module Decode =\n /// let fromRootValue (decoder : Decoder<'T>) =\n /// Decode.fromValue \"$\" decoder\n /// \n /// \n /// Path used to report the error\n /// Decoder to apply\n /// JSON value to decoder\n /// \n /// Returns Ok if the decoder succeeds, otherwise Error with the error message.\n /// \n let fromValue (path : string) (decoder : Decoder<'T>) =\n fun value ->\n match decoder path value with\n | Ok success ->\n Ok success\n | Error error ->\n Error (errorToString error)\n\n /// \n /// Parse the provided string in as JSON and then run the decoder against it.\n /// \n /// Decoder to apply\n /// JSON string to decode\n /// \n /// Returns Ok if the decoder succeeds, otherwise Error with the error message.\n /// \n let fromString (decoder : Decoder<'T>) =\n fun value ->\n try\n let json = JS.JSON.parse value\n fromValue \"$\" decoder json\n with\n | ex when Helpers.isSyntaxError ex ->\n Error(\"Given an invalid JSON: \" + ex.Message)\n\n /// \n /// Parse the provided string in as JSON and then run the decoder against it.\n /// \n /// Decoder to apply\n /// JSON string to decode\n /// \n /// Return the decoded value if the decoder succeeds, otherwise throws an exception.\n /// \n let unsafeFromString (decoder : Decoder<'T>) =\n fun value ->\n match fromString decoder value with\n | Ok x -> x\n | Error msg -> failwith msg\n\n []\n let decodeValue (path : string) (decoder : Decoder<'T>) = fromValue path decoder\n\n []\n let decodeString (decoder : Decoder<'T>) = fromString decoder\n\n //////////////////\n // Primitives ///\n ////////////////\n\n let string : Decoder =\n fun path value ->\n if Helpers.isString value then\n Ok(Helpers.asString value)\n else\n (path, BadPrimitive(\"a string\", value)) |> Error\n\n let char : Decoder =\n fun path value ->\n if Helpers.isString value then\n let str = Helpers.asString value\n if str.Length = 1 then\n Ok(str.[0])\n else\n (path, BadPrimitive(\"a single character string\", value)) |> Error\n else\n (path, BadPrimitive(\"a char\", value)) |> Error\n\n let guid : Decoder =\n fun path value ->\n if Helpers.isString value then\n match System.Guid.TryParse (Helpers.asString value) with\n | true, x -> Ok x\n | _ -> (path, BadPrimitive(\"a guid\", value)) |> Error\n else (path, BadPrimitive(\"a guid\", value)) |> Error\n\n let unit : Decoder =\n fun path value ->\n if Helpers.isNullValue value then\n Ok ()\n else\n (path, BadPrimitive(\"null\", value)) |> Error\n\n let inline private integral\n (name : string)\n (tryParse : (string -> bool * 'T))\n (min : unit->'T)\n (max : unit->'T)\n (conv : float -> 'T) : Decoder< 'T > =\n\n fun path value ->\n if Helpers.isNumber value then\n let value : float = unbox value\n if Helpers.isIntegralValue value then\n if (float(min())) <= value && value <= (float(max())) then\n Ok(conv value)\n else\n (path, BadPrimitiveExtra(name, value, \"Value was either too large or too small for \" + name)) |> Error\n else\n (path, BadPrimitiveExtra(name, value, \"Value is not an integral value\")) |> Error\n elif Helpers.isString value then\n match tryParse (Helpers.asString value) with\n | true, x -> Ok x\n | _ -> (path, BadPrimitive(name, value)) |> Error\n else\n (path, BadPrimitive(name, value)) |> Error\n\n let sbyte : Decoder =\n integral\n \"a sbyte\"\n System.SByte.TryParse\n (fun () -> System.SByte.MinValue)\n (fun () -> System.SByte.MaxValue)\n sbyte\n\n /// Alias to Decode.uint8\n let byte : Decoder =\n integral\n \"a byte\"\n System.Byte.TryParse\n (fun () -> System.Byte.MinValue)\n (fun () -> System.Byte.MaxValue)\n byte\n\n let int16 : Decoder =\n integral\n \"an int16\"\n System.Int16.TryParse\n (fun () -> System.Int16.MinValue)\n (fun () -> System.Int16.MaxValue)\n int16\n\n let uint16 : Decoder =\n integral\n \"an uint16\"\n System.UInt16.TryParse\n (fun () -> System.UInt16.MinValue)\n (fun () -> System.UInt16.MaxValue)\n uint16\n\n let int : Decoder =\n integral\n \"an int\"\n System.Int32.TryParse\n (fun () -> System.Int32.MinValue)\n (fun () -> System.Int32.MaxValue)\n int\n\n let uint32 : Decoder =\n integral\n \"an uint32\"\n System.UInt32.TryParse\n (fun () -> System.UInt32.MinValue)\n (fun () -> System.UInt32.MaxValue)\n uint32\n\n let int64 : Decoder =\n integral\n \"an int64\"\n System.Int64.TryParse\n (fun () -> System.Int64.MinValue)\n (fun () -> System.Int64.MaxValue)\n int64\n\n let uint64 : Decoder =\n integral\n \"an uint64\"\n System.UInt64.TryParse\n (fun () -> System.UInt64.MinValue)\n (fun () -> System.UInt64.MaxValue)\n uint64\n\n let bigint : Decoder =\n fun path value ->\n if Helpers.isNumber value then\n Helpers.asInt value |> bigint |> Ok\n elif Helpers.isString value then\n // TODO: BigInt.TryParse has been added in Fable 2.1.4\n // Don't use it for now to support lower Fable versions\n try\n bigint.Parse (Helpers.asString value) |> Ok\n with _ ->\n (path, BadPrimitive(\"a bigint\", value)) |> Error\n else\n (path, BadPrimitive(\"a bigint\", value)) |> Error\n\n let bool : Decoder =\n fun path value ->\n if Helpers.isBoolean value then\n Ok(Helpers.asBool value)\n else\n (path, BadPrimitive(\"a boolean\", value)) |> Error\n\n let float : Decoder =\n fun path value ->\n if Helpers.isNumber value then\n Ok(Helpers.asFloat value)\n else\n (path, BadPrimitive(\"a float\", value)) |> Error\n\n let float32 : Decoder =\n fun path value ->\n if Helpers.isNumber value then\n Ok(Helpers.asFloat32 value)\n else\n (path, BadPrimitive(\"a float32\", value)) |> Error\n\n let decimal : Decoder =\n fun path value ->\n if Helpers.isNumber value then\n Helpers.asFloat value |> decimal |> Ok\n elif Helpers.isString value then\n match System.Decimal.TryParse (Helpers.asString value) with\n | true, x -> Ok x\n | _ -> (path, BadPrimitive(\"a decimal\", value)) |> Error\n else\n (path, BadPrimitive(\"a decimal\", value)) |> Error\n\n []\n let datetime : Decoder =\n fun path value ->\n if Helpers.isString value then\n match System.DateTime.TryParse (Helpers.asString value) with\n | true, x -> x.ToUniversalTime() |> Ok\n | _ -> (path, BadPrimitive(\"a datetime\", value)) |> Error\n else\n (path, BadPrimitive(\"a datetime\", value)) |> Error\n\n /// Decode a System.DateTime value using Sytem.DateTime.TryParse, then convert it to UTC.\n let datetimeUtc : Decoder =\n fun path value ->\n if Helpers.isString value then\n match System.DateTime.TryParse (Helpers.asString value) with\n | true, x -> x.ToUniversalTime() |> Ok\n | _ -> (path, BadPrimitive(\"a datetime\", value)) |> Error\n else\n (path, BadPrimitive(\"a datetime\", value)) |> Error\n\n /// Decode a System.DateTime with DateTime.TryParse; uses default System.DateTimeStyles.\n let datetimeLocal : Decoder =\n fun path value ->\n if Helpers.isString value then\n match System.DateTime.TryParse (Helpers.asString value) with\n | true, x -> x |> Ok\n | _ -> (path, BadPrimitive(\"a datetime\", value)) |> Error\n else\n (path, BadPrimitive(\"a datetime\", value)) |> Error\n\n let datetimeOffset : Decoder =\n fun path value ->\n if Helpers.isString value then\n match System.DateTimeOffset.TryParse(Helpers.asString value) with\n | true, x -> Ok x\n | _ -> (path, BadPrimitive(\"a datetimeoffset\", value)) |> Error\n else\n (path, BadPrimitive(\"a datetime\", value)) |> Error\n\n let timespan : Decoder =\n fun path value ->\n if Helpers.isString value then\n match System.TimeSpan.TryParse(Helpers.asString value) with\n | true, x -> Ok x\n | _ -> (path, BadPrimitive(\"a timespan\", value)) |> Error\n else\n (path, BadPrimitive(\"a timespan\", value)) |> Error\n\n /////////////////////////\n // Object primitives ///\n ///////////////////////\n\n let private decodeMaybeNull path (decoder : Decoder<'T>) value =\n // The decoder may be an option decoder so give it an opportunity to check null values\n\n // We catch the null value case first to avoid executing the decoder logic\n // Indeed, if the decoder logic try to access the value to do something with it,\n // it can throw an exception about the value being null\n if Helpers.isNullValue value then\n Ok None\n else\n match decoder path value with\n | Ok v -> Ok(Some v)\n | Error er -> Error er\n\n let optional (fieldName : string) (decoder : Decoder<'value>) : Decoder<'value option> =\n fun path value ->\n if Helpers.isObject value then\n let fieldValue = Helpers.getField fieldName value\n if Helpers.isUndefined fieldValue then Ok None\n else decodeMaybeNull (path + \".\" + fieldName) decoder fieldValue\n else\n Error(path, BadType(\"an object\", value))\n\n let private badPathError fieldNames currentPath value =\n let currentPath = defaultArg currentPath (\"$\"::fieldNames |> String.concat \".\")\n let msg = \"an object with path `\" + (String.concat \".\" fieldNames) + \"`\"\n Error(currentPath, BadPath (msg, value, List.tryLast fieldNames |> Option.defaultValue \"\"))\n\n let optionalAt (fieldNames : string list) (decoder : Decoder<'value>) : Decoder<'value option> =\n fun firstPath firstValue ->\n ((firstPath, firstValue, None), fieldNames)\n ||> List.fold (fun (curPath, curValue, res) field ->\n match res with\n | Some _ -> curPath, curValue, res\n | None ->\n if Helpers.isNullValue curValue then\n curPath, curValue, Some (Ok None)\n elif Helpers.isObject curValue then\n let curValue = Helpers.getField field curValue\n curPath + \".\" + field, curValue, None\n else\n let res = Error(curPath, BadType(\"an object\", curValue))\n curPath, curValue, Some res)\n |> function\n | _, _, Some res -> res\n | lastPath, lastValue, None ->\n if Helpers.isUndefined lastValue then Ok None\n else decodeMaybeNull lastPath decoder lastValue\n\n let field (fieldName: string) (decoder : Decoder<'value>) : Decoder<'value> =\n fun path value ->\n if Helpers.isObject value then\n let fieldValue = Helpers.getField fieldName value\n if Helpers.isUndefined fieldValue then\n Error(path, BadField (\"an object with a field named `\" + fieldName + \"`\", value))\n else\n decoder (path + \".\" + fieldName) fieldValue\n else\n Error(path, BadType(\"an object\", value))\n\n let at (fieldNames: string list) (decoder : Decoder<'value>) : Decoder<'value> =\n fun firstPath firstValue ->\n ((firstPath, firstValue, None), fieldNames)\n ||> List.fold (fun (curPath, curValue, res) field ->\n match res with\n | Some _ -> curPath, curValue, res\n | None ->\n if Helpers.isNullValue curValue then\n let res = badPathError fieldNames (Some curPath) firstValue\n curPath, curValue, Some res\n elif Helpers.isObject curValue then\n let curValue = Helpers.getField field curValue\n if Helpers.isUndefined curValue then\n let res = badPathError fieldNames None firstValue\n curPath, curValue, Some res\n else\n curPath + \".\" + field, curValue, None\n else\n let res = Error(curPath, BadType(\"an object\", curValue))\n curPath, curValue, Some res)\n |> function\n | _, _, Some res -> res\n | lastPath, lastValue, None ->\n decoder lastPath lastValue\n\n let index (requestedIndex: int) (decoder : Decoder<'value>) : Decoder<'value> =\n fun path value ->\n let currentPath = path + \".[\" + (Operators.string requestedIndex) + \"]\"\n if Helpers.isArray value then\n let vArray = Helpers.asArray value\n if requestedIndex < vArray.Length then\n decoder currentPath (vArray.[requestedIndex])\n else\n let msg =\n \"a longer array. Need index `\"\n + (requestedIndex.ToString())\n + \"` but there are only `\"\n + (vArray.Length.ToString())\n + \"` entries\"\n\n (currentPath, TooSmallArray(msg, value))\n |> Error\n else\n (currentPath, BadPrimitive(\"an array\", value))\n |> Error\n\n let option (decoder : Decoder<'value>) : Decoder<'value option> =\n fun path value ->\n if Helpers.isNullValue value then Ok None\n else decoder path value |> Result.map Some\n\n //////////////////////\n // Data structure ///\n ////////////////////\n\n let list (decoder : Decoder<'value>) : Decoder<'value list> =\n fun path value ->\n if Helpers.isArray value then\n let mutable i = -1\n let tokens = Helpers.asArray value\n (Ok [], tokens) ||> Array.fold (fun acc value ->\n i <- i + 1\n match acc with\n | Error _ -> acc\n | Ok acc ->\n match decoder (path + \".[\" + (i.ToString()) + \"]\") value with\n | Error er -> Error er\n | Ok value -> Ok (value::acc))\n |> Result.map List.rev\n else\n (path, BadPrimitive (\"a list\", value))\n |> Error\n\n let seq (decoder : Decoder<'value>) : Decoder<'value seq> =\n fun path value ->\n if Helpers.isArray value then\n let mutable i = -1\n let tokens = Helpers.asArray value\n (Ok (seq []), tokens) ||> Array.fold (fun acc value ->\n i <- i + 1\n match acc with\n | Error _ -> acc\n | Ok acc ->\n match decoder (path + \".[\" + (i.ToString()) + \"]\") value with\n | Error er -> Error er\n | Ok value -> Ok (Seq.append [value] acc))\n |> Result.map Seq.rev\n else\n (path, BadPrimitive (\"a seq\", value))\n |> Error\n\n let array (decoder : Decoder<'value>) : Decoder<'value array> =\n fun path value ->\n if Helpers.isArray value then\n let mutable i = -1\n let tokens = Helpers.asArray value\n let arr = Array.zeroCreate tokens.Length\n (Ok arr, tokens) ||> Array.fold (fun acc value ->\n i <- i + 1\n match acc with\n | Error _ -> acc\n | Ok acc ->\n match decoder (path + \".[\" + (i.ToString()) + \"]\") value with\n | Error er -> Error er\n | Ok value -> acc.[i] <- value; Ok acc)\n else\n (path, BadPrimitive (\"an array\", value))\n |> Error\n\n let keys: Decoder =\n fun path value ->\n if Helpers.isObject value then\n Helpers.objectKeys value |> List.ofSeq |> Ok\n else\n (path, BadPrimitive (\"an object\", value))\n |> Error\n\n let keyValuePairs (decoder : Decoder<'value>) : Decoder<(string * 'value) list> =\n fun path value ->\n match keys path value with\n | Ok objectKeys ->\n (Ok [], objectKeys) ||> List.fold (fun acc prop ->\n match acc with\n | Error _ -> acc\n | Ok acc ->\n match Helpers.getField prop value |> decoder path with\n | Error er -> Error er\n | Ok value -> (prop, value)::acc |> Ok)\n |> Result.map List.rev\n | Error e -> Error e\n\n //////////////////////////////\n // Inconsistent Structure ///\n ////////////////////////////\n\n let oneOf (decoders : Decoder<'value> list) : Decoder<'value> =\n fun path value ->\n let rec runner (decoders : Decoder<'value> list) (errors : string list) =\n match decoders with\n | head::tail ->\n match fromValue path head value with\n | Ok v ->\n Ok v\n | Error error -> runner tail (errors @ [error])\n | [] -> (path, BadOneOf errors) |> Error\n\n runner decoders []\n\n //////////////////////\n // Fancy decoding ///\n ////////////////////\n\n let nil (output : 'a) : Decoder<'a> =\n fun path value ->\n if Helpers.isNullValue value then\n Ok output\n else\n (path, BadPrimitive(\"null\", value)) |> Error\n\n let value _ v = Ok v\n\n let succeed (output : 'a) : Decoder<'a> =\n fun _ _ ->\n Ok output\n\n let fail (msg: string) : Decoder<'a> =\n fun path _ ->\n (path, FailMessage msg) |> Error\n\n let andThen (cb: 'a -> Decoder<'b>) (decoder : Decoder<'a>) : Decoder<'b> =\n fun path value ->\n match decoder path value with\n | Error error -> Error error\n | Ok result -> cb result path value\n\n let all (decoders: Decoder<'a> list): Decoder<'a list> =\n fun path value ->\n let rec runner (decoders: Decoder<'a> list) (values: 'a list) =\n match decoders with\n | decoder :: tail ->\n match decoder path value with\n | Ok value -> runner tail (values @ [ value ])\n | Error error -> Error error\n | [] -> Ok values\n\n runner decoders []\n\n /////////////////////\n // Map functions ///\n ///////////////////\n\n let map\n (ctor : 'a -> 'value)\n (d1 : Decoder<'a>) : Decoder<'value> =\n fun path value ->\n match d1 path value with\n | Ok v1 -> Ok (ctor v1)\n | Error er -> Error er\n\n let map2\n (ctor : 'a -> 'b -> 'value)\n (d1 : Decoder<'a>)\n (d2 : Decoder<'b>) : Decoder<'value> =\n fun path value ->\n match d1 path value, d2 path value with\n | Ok v1, Ok v2 -> Ok (ctor v1 v2)\n | Error er,_ -> Error er\n | _,Error er -> Error er\n\n let map3\n (ctor : 'a -> 'b -> 'c -> 'value)\n (d1 : Decoder<'a>)\n (d2 : Decoder<'b>)\n (d3 : Decoder<'c>) : Decoder<'value> =\n fun path value ->\n match d1 path value, d2 path value, d3 path value with\n | Ok v1, Ok v2, Ok v3 -> Ok (ctor v1 v2 v3)\n | Error er,_,_ -> Error er\n | _,Error er,_ -> Error er\n | _,_,Error er -> Error er\n\n let map4\n (ctor : 'a -> 'b -> 'c -> 'd -> 'value)\n (d1 : Decoder<'a>)\n (d2 : Decoder<'b>)\n (d3 : Decoder<'c>)\n (d4 : Decoder<'d>) : Decoder<'value> =\n fun path value ->\n match d1 path value, d2 path value, d3 path value, d4 path value with\n | Ok v1, Ok v2, Ok v3, Ok v4 -> Ok (ctor v1 v2 v3 v4)\n | Error er,_,_,_ -> Error er\n | _,Error er,_,_ -> Error er\n | _,_,Error er,_ -> Error er\n | _,_,_,Error er -> Error er\n\n let map5\n (ctor : 'a -> 'b -> 'c -> 'd -> 'e -> 'value)\n (d1 : Decoder<'a>)\n (d2 : Decoder<'b>)\n (d3 : Decoder<'c>)\n (d4 : Decoder<'d>)\n (d5 : Decoder<'e>) : Decoder<'value> =\n fun path value ->\n match d1 path value, d2 path value, d3 path value, d4 path value, d5 path value with\n | Ok v1, Ok v2, Ok v3, Ok v4, Ok v5 -> Ok (ctor v1 v2 v3 v4 v5)\n | Error er,_,_,_,_ -> Error er\n | _,Error er,_,_,_ -> Error er\n | _,_,Error er,_,_ -> Error er\n | _,_,_,Error er,_ -> Error er\n | _,_,_,_,Error er -> Error er\n\n let map6\n (ctor : 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'value)\n (d1 : Decoder<'a>)\n (d2 : Decoder<'b>)\n (d3 : Decoder<'c>)\n (d4 : Decoder<'d>)\n (d5 : Decoder<'e>)\n (d6 : Decoder<'f>) : Decoder<'value> =\n fun path value ->\n match d1 path value, d2 path value, d3 path value, d4 path value, d5 path value, d6 path value with\n | Ok v1, Ok v2, Ok v3, Ok v4, Ok v5, Ok v6 -> Ok (ctor v1 v2 v3 v4 v5 v6)\n | Error er,_,_,_,_,_ -> Error er\n | _,Error er,_,_,_,_ -> Error er\n | _,_,Error er,_,_,_ -> Error er\n | _,_,_,Error er,_,_ -> Error er\n | _,_,_,_,Error er,_ -> Error er\n | _,_,_,_,_,Error er -> Error er\n\n let map7\n (ctor : 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'value)\n (d1 : Decoder<'a>)\n (d2 : Decoder<'b>)\n (d3 : Decoder<'c>)\n (d4 : Decoder<'d>)\n (d5 : Decoder<'e>)\n (d6 : Decoder<'f>)\n (d7 : Decoder<'g>) : Decoder<'value> =\n fun path value ->\n match d1 path value, d2 path value, d3 path value, d4 path value, d5 path value, d6 path value, d7 path value with\n | Ok v1, Ok v2, Ok v3, Ok v4, Ok v5, Ok v6, Ok v7 -> Ok (ctor v1 v2 v3 v4 v5 v6 v7)\n | Error er,_,_,_,_,_,_ -> Error er\n | _,Error er,_,_,_,_,_ -> Error er\n | _,_,Error er,_,_,_,_ -> Error er\n | _,_,_,Error er,_,_,_ -> Error er\n | _,_,_,_,Error er,_,_ -> Error er\n | _,_,_,_,_,Error er,_ -> Error er\n | _,_,_,_,_,_,Error er -> Error er\n\n let map8\n (ctor : 'a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'h -> 'value)\n (d1 : Decoder<'a>)\n (d2 : Decoder<'b>)\n (d3 : Decoder<'c>)\n (d4 : Decoder<'d>)\n (d5 : Decoder<'e>)\n (d6 : Decoder<'f>)\n (d7 : Decoder<'g>)\n (d8 : Decoder<'h>) : Decoder<'value> =\n fun path value ->\n match d1 path value, d2 path value, d3 path value, d4 path value, d5 path value, d6 path value, d7 path value, d8 path value with\n | Ok v1, Ok v2, Ok v3, Ok v4, Ok v5, Ok v6, Ok v7, Ok v8 -> Ok (ctor v1 v2 v3 v4 v5 v6 v7 v8)\n | Error er,_,_,_,_,_,_,_ -> Error er\n | _,Error er,_,_,_,_,_,_ -> Error er\n | _,_,Error er,_,_,_,_,_ -> Error er\n | _,_,_,Error er,_,_,_,_ -> Error er\n | _,_,_,_,Error er,_,_,_ -> Error er\n | _,_,_,_,_,Error er,_,_ -> Error er\n | _,_,_,_,_,_,Error er,_ -> Error er\n | _,_,_,_,_,_,_,Error er -> Error er\n\n //////////////////////\n // Object builder ///\n ////////////////////\n\n /// \n /// Allow to incrementally apply a decoder, for building large objects.\n /// \n /// \n /// \n /// type Point =\n /// {\n /// X : float\n /// Y : float\n /// }\n ///\n /// module Point =\n /// let create x y = { X = x; Y = y }\n ///\n /// let decode =\n /// Decode.succeed create\n /// |> Decode.andMap (Decode.field \"x\" Decode.float)\n /// |> Decode.andMap (Decode.field \"y\" Decode.float)\n /// \n /// \n let andMap<'a, 'b> : 'a Decoder -> ('a -> 'b) Decoder -> 'b Decoder =\n map2 (|>)\n\n type IRequiredGetter =\n abstract Field : string -> Decoder<'a> -> 'a\n abstract At : List -> Decoder<'a> -> 'a\n abstract Raw : Decoder<'a> -> 'a\n\n type IOptionalGetter =\n abstract Field : string -> Decoder<'a> -> 'a option\n abstract At : List -> Decoder<'a> -> 'a option\n abstract Raw : Decoder<'a> -> 'a option\n\n type IGetters =\n abstract Required: IRequiredGetter\n abstract Optional: IOptionalGetter\n\n let private unwrapWith (errors: ResizeArray) path (decoder: Decoder<'T>) value: 'T =\n match decoder path value with\n | Ok v -> v\n | Error er -> errors.Add(er); Unchecked.defaultof<'T>\n\n type Getters<'T>(path: string, v: 'T) =\n let mutable errors = ResizeArray()\n let required =\n { new IRequiredGetter with\n member __.Field (fieldName : string) (decoder : Decoder<_>) =\n unwrapWith errors path (field fieldName decoder) v\n member __.At (fieldNames : string list) (decoder : Decoder<_>) =\n unwrapWith errors path (at fieldNames decoder) v\n member __.Raw (decoder: Decoder<_>) =\n unwrapWith errors path decoder v }\n let optional =\n { new IOptionalGetter with\n member __.Field (fieldName : string) (decoder : Decoder<_>) =\n unwrapWith errors path (optional fieldName decoder) v\n member __.At (fieldNames : string list) (decoder : Decoder<_>) =\n unwrapWith errors path (optionalAt fieldNames decoder) v\n member __.Raw (decoder: Decoder<_>) =\n match decoder path v with\n | Ok v -> Some v\n | Error((_, reason) as error) ->\n match reason with\n | BadPrimitive(_,v)\n | BadPrimitiveExtra(_,v,_)\n | BadType(_,v) ->\n if Helpers.isNullValue v then None\n else errors.Add(error); Unchecked.defaultof<_>\n | BadField _\n | BadPath _ -> None\n | TooSmallArray _\n | FailMessage _\n | BadOneOf _ -> errors.Add(error); Unchecked.defaultof<_> }\n member __.Errors: _ list = Seq.toList errors\n interface IGetters with\n member __.Required = required\n member __.Optional = optional\n\n let object (builder: IGetters -> 'value) : Decoder<'value> =\n fun path v ->\n let getters = Getters(path, v)\n let result = builder getters\n match getters.Errors with\n | [] -> Ok result\n | fst::_ as errors ->\n if errors.Length > 1 then\n let errors = List.map errorToString errors\n (path, BadOneOf errors) |> Error\n else\n Error fst\n\n ///////////////////////\n // Tuples decoders ///\n ////////////////////\n\n let tuple2 (decoder1: Decoder<'T1>) (decoder2: Decoder<'T2>) : Decoder<'T1 * 'T2> =\n index 0 decoder1\n |> andThen (fun v1 ->\n index 1 decoder2\n |> andThen (fun v2 ->\n succeed (v1, v2)\n )\n )\n\n let tuple3 (decoder1: Decoder<'T1>)\n (decoder2: Decoder<'T2>)\n (decoder3: Decoder<'T3>) : Decoder<'T1 * 'T2 * 'T3> =\n index 0 decoder1\n |> andThen (fun v1 ->\n index 1 decoder2\n |> andThen (fun v2 ->\n index 2 decoder3\n |> andThen (fun v3 ->\n succeed (v1, v2, v3)\n )\n )\n )\n\n let tuple4 (decoder1: Decoder<'T1>)\n (decoder2: Decoder<'T2>)\n (decoder3: Decoder<'T3>)\n (decoder4: Decoder<'T4>) : Decoder<'T1 * 'T2 * 'T3 * 'T4> =\n index 0 decoder1\n |> andThen (fun v1 ->\n index 1 decoder2\n |> andThen (fun v2 ->\n index 2 decoder3\n |> andThen (fun v3 ->\n index 3 decoder4\n |> andThen (fun v4 ->\n succeed (v1, v2, v3, v4)\n )\n )\n )\n )\n\n let tuple5 (decoder1: Decoder<'T1>)\n (decoder2: Decoder<'T2>)\n (decoder3: Decoder<'T3>)\n (decoder4: Decoder<'T4>)\n (decoder5: Decoder<'T5>) : Decoder<'T1 * 'T2 * 'T3 * 'T4 * 'T5> =\n index 0 decoder1\n |> andThen (fun v1 ->\n index 1 decoder2\n |> andThen (fun v2 ->\n index 2 decoder3\n |> andThen (fun v3 ->\n index 3 decoder4\n |> andThen (fun v4 ->\n index 4 decoder5\n |> andThen (fun v5 ->\n succeed (v1, v2, v3, v4, v5)\n )\n )\n )\n )\n )\n\n let tuple6 (decoder1: Decoder<'T1>)\n (decoder2: Decoder<'T2>)\n (decoder3: Decoder<'T3>)\n (decoder4: Decoder<'T4>)\n (decoder5: Decoder<'T5>)\n (decoder6: Decoder<'T6>) : Decoder<'T1 * 'T2 * 'T3 * 'T4 * 'T5 * 'T6> =\n index 0 decoder1\n |> andThen (fun v1 ->\n index 1 decoder2\n |> andThen (fun v2 ->\n index 2 decoder3\n |> andThen (fun v3 ->\n index 3 decoder4\n |> andThen (fun v4 ->\n index 4 decoder5\n |> andThen (fun v5 ->\n index 5 decoder6\n |> andThen (fun v6 ->\n succeed (v1, v2, v3, v4, v5, v6)\n )\n )\n )\n )\n )\n )\n\n let tuple7 (decoder1: Decoder<'T1>)\n (decoder2: Decoder<'T2>)\n (decoder3: Decoder<'T3>)\n (decoder4: Decoder<'T4>)\n (decoder5: Decoder<'T5>)\n (decoder6: Decoder<'T6>)\n (decoder7: Decoder<'T7>) : Decoder<'T1 * 'T2 * 'T3 * 'T4 * 'T5 * 'T6 * 'T7> =\n index 0 decoder1\n |> andThen (fun v1 ->\n index 1 decoder2\n |> andThen (fun v2 ->\n index 2 decoder3\n |> andThen (fun v3 ->\n index 3 decoder4\n |> andThen (fun v4 ->\n index 4 decoder5\n |> andThen (fun v5 ->\n index 5 decoder6\n |> andThen (fun v6 ->\n index 6 decoder7\n |> andThen (fun v7 ->\n succeed (v1, v2, v3, v4, v5, v6, v7)\n )\n )\n )\n )\n )\n )\n )\n\n let tuple8 (decoder1: Decoder<'T1>)\n (decoder2: Decoder<'T2>)\n (decoder3: Decoder<'T3>)\n (decoder4: Decoder<'T4>)\n (decoder5: Decoder<'T5>)\n (decoder6: Decoder<'T6>)\n (decoder7: Decoder<'T7>)\n (decoder8: Decoder<'T8>) : Decoder<'T1 * 'T2 * 'T3 * 'T4 * 'T5 * 'T6 * 'T7 * 'T8> =\n index 0 decoder1\n |> andThen (fun v1 ->\n index 1 decoder2\n |> andThen (fun v2 ->\n index 2 decoder3\n |> andThen (fun v3 ->\n index 3 decoder4\n |> andThen (fun v4 ->\n index 4 decoder5\n |> andThen (fun v5 ->\n index 5 decoder6\n |> andThen (fun v6 ->\n index 6 decoder7\n |> andThen (fun v7 ->\n index 7 decoder8\n |> andThen (fun v8 ->\n succeed (v1, v2, v3, v4, v5, v6, v7, v8)\n )\n )\n )\n )\n )\n )\n )\n )\n\n ///////////\n // Map ///\n /////////\n\n let dict (decoder : Decoder<'value>) : Decoder> =\n map Map.ofList (keyValuePairs decoder)\n\n let map' (keyDecoder : Decoder<'key>) (valueDecoder : Decoder<'value>) : Decoder> =\n map Map.ofSeq (array (tuple2 keyDecoder valueDecoder))\n\n ////////////\n // Enum ///\n /////////\n\n #if !FABLE_REPL_LIB\n module Enum =\n\n let inline byte<'TEnum when 'TEnum : enum> : Decoder<'TEnum> =\n byte\n |> andThen (fun value ->\n LanguagePrimitives.EnumOfValue value\n |> succeed\n )\n\n let inline sbyte<'TEnum when 'TEnum : enum> : Decoder<'TEnum> =\n sbyte\n |> andThen (fun value ->\n LanguagePrimitives.EnumOfValue value\n |> succeed\n )\n\n let inline int16<'TEnum when 'TEnum : enum> : Decoder<'TEnum> =\n int16\n |> andThen (fun value ->\n LanguagePrimitives.EnumOfValue value\n |> succeed\n )\n\n let inline uint16<'TEnum when 'TEnum : enum> : Decoder<'TEnum> =\n uint16\n |> andThen (fun value ->\n LanguagePrimitives.EnumOfValue value\n |> succeed\n )\n\n let inline int<'TEnum when 'TEnum : enum> : Decoder<'TEnum> =\n int\n |> andThen (fun value ->\n LanguagePrimitives.EnumOfValue value\n |> succeed\n )\n\n let inline uint32<'TEnum when 'TEnum : enum> : Decoder<'TEnum> =\n uint32\n |> andThen (fun value ->\n LanguagePrimitives.EnumOfValue value\n |> succeed\n )\n #endif\n\n //////////////////\n // Reflection ///\n ////////////////\n\n open FSharp.Reflection\n\n // As generics are erased by Fable, let's just do an unsafe cast for performance\n let inline boxDecoder (d: Decoder<'T>): BoxedDecoder =\n !!d // d >> Result.map box\n\n let inline unboxDecoder (d: BoxedDecoder): Decoder<'T> =\n !!d // d >> Result.map unbox\n\n // This is used to force Fable use a generic comparer for map keys\n let private toMap<'key, 'value when 'key: comparison> (xs: ('key*'value) seq) = Map.ofSeq xs\n let private toSet<'key when 'key: comparison> (xs: 'key seq) = Set.ofSeq xs\n\n let private autoObject (decoderInfos: (string * BoxedDecoder)[]) (path : string) (value: JsonValue) =\n if not (Helpers.isObject value) then\n (path, BadPrimitive (\"an object\", value)) |> Error\n else\n (decoderInfos, Ok []) ||> Array.foldBack (fun (name, decoder) acc ->\n match acc with\n | Error _ -> acc\n | Ok result ->\n Helpers.getField name value\n |> decoder (path + \".\" + name)\n |> Result.map (fun v -> v::result))\n\n let inline private enumDecoder<'UnderlineType when 'UnderlineType : equality>\n (decoder : Decoder<'UnderlineType>)\n (toString : 'UnderlineType -> string)\n (t: System.Type) =\n\n fun path value ->\n match decoder path value with\n | Ok enumValue ->\n System.Enum.GetValues(t)\n |> Seq.cast<'UnderlineType>\n |> Seq.contains enumValue\n |> function\n | true ->\n System.Enum.Parse(t, toString enumValue)\n |> Ok\n | false ->\n (path, BadPrimitiveExtra(t.FullName, value, \"Unkown value provided for the enum\"))\n |> Error\n | Error msg ->\n Error msg\n\n let private autoObject2 (keyDecoder: BoxedDecoder) (valueDecoder: BoxedDecoder) (path : string) (value: JsonValue) =\n if not (Helpers.isObject value) then\n (path, BadPrimitive (\"an object\", value)) |> Error\n else\n (Ok [], Helpers.objectKeys(value)) ||> Seq.fold (fun acc name ->\n match acc with\n | Error _ -> acc\n | Ok acc ->\n match keyDecoder path name with\n | Error er -> Error er\n | Ok k ->\n Helpers.getField name value\n |> valueDecoder (path + \".\" + name)\n |> function\n | Error er -> Error er\n | Ok v -> (k,v)::acc |> Ok)\n\n let private mixedArray offset (decoders: BoxedDecoder[]) (path: string) (values: JsonValue[]): Result =\n let expectedLength = decoders.Length + offset\n if expectedLength <> values.Length then\n (path, sprintf \"Expected array of length %i but got %i\" expectedLength values.Length\n |> FailMessage) |> Error\n else\n let mutable result = Ok []\n for i = offset to values.Length - 1 do\n match result with\n | Error _ -> ()\n | Ok acc ->\n let path = sprintf \"%s[%i]\" path i\n let decoder = decoders.[i - offset]\n let value = values.[i]\n result <- decoder path value |> Result.map (fun v -> v::acc)\n result\n |> Result.map List.rev\n\n let rec private makeUnion extra caseStrategy t name (path : string) (values: JsonValue[]) =\n let uci =\n FSharpType.GetUnionCases(t, allowAccessToPrivateRepresentation=true)\n |> Array.tryFind (fun x -> x.Name = name)\n match uci with\n | None -> (path, FailMessage(\"Cannot find case \" + name + \" in \" + t.FullName)) |> Error\n | Some uci ->\n let decoders = uci.GetFields() |> Array.map (fun fi -> autoDecoder extra caseStrategy false fi.PropertyType)\n let values =\n if decoders.Length = 0 && values.Length <= 1 // First item is the case name\n then Ok []\n else mixedArray 1 decoders path values\n values |> Result.map (fun values -> FSharpValue.MakeUnion(uci, List.toArray values, allowAccessToPrivateRepresentation=true))\n\n and private autoDecodeRecordsAndUnions extra (caseStrategy : CaseStrategy) (isOptional : bool) (t: System.Type) : BoxedDecoder =\n // Add the decoder to extra in case one of the fields is recursive\n let decoderRef = ref Unchecked.defaultof<_>\n let extra =\n // As of 3.7.17 Fable assigns empty name to anonymous record, we shouldn't add them to the map to avoid conflicts.\n // Anonymous records cannot be recursive anyways, see #144\n match t.FullName with\n | \"\" -> extra\n | fullName -> extra |> Map.add fullName decoderRef\n let decoder =\n if FSharpType.IsRecord(t, allowAccessToPrivateRepresentation=true) then\n let decoders =\n FSharpType.GetRecordFields(t, allowAccessToPrivateRepresentation=true)\n |> Array.map (fun fi ->\n let name = Util.Casing.convert caseStrategy fi.Name\n name, autoDecoder extra caseStrategy false fi.PropertyType)\n fun path value ->\n autoObject decoders path value\n |> Result.map (fun xs -> FSharpValue.MakeRecord(t, List.toArray xs, allowAccessToPrivateRepresentation=true))\n\n elif FSharpType.IsUnion(t, allowAccessToPrivateRepresentation=true) then\n fun path (value: JsonValue) ->\n if Helpers.isString(value) then\n let name = Helpers.asString value\n makeUnion extra caseStrategy t name path [||]\n elif Helpers.isArray(value) then\n let values = Helpers.asArray value\n string (path + \"[0]\") values.[0]\n |> Result.bind (fun name -> makeUnion extra caseStrategy t name path values)\n else (path, BadPrimitive(\"a string or array\", value)) |> Error\n\n else\n if isOptional then\n // The error will only happen at runtime if the value is not null\n // See https://github.com/MangelMaxime/Thoth/pull/84#issuecomment-444837773\n boxDecoder(fun path value -> Error(path, BadType(\"an extra coder for \" + t.FullName, value)))\n else\n // Don't use failwithf here, for some reason F#/Fable compiles it as a function\n // when the return type is a function too, so it doesn't fail immediately\n sprintf \"\"\"Cannot generate auto decoder for %s. Please pass an extra decoder.\n\nDocumentation available at: https://thoth-org.github.io/Thoth.Json/documentation/auto/extra-coders.html#ready-to-use-extra-coders\"\"\" t.FullName |> failwith\n decoderRef.Value <- decoder\n decoder\n\n and private autoDecoder (extra: Map>) caseStrategy (isOptional : bool) (t: System.Type) : BoxedDecoder =\n let fullname = t.FullName\n match Map.tryFind fullname extra with\n | Some decoderRef -> fun path value -> decoderRef.contents path value\n | None ->\n if t.IsArray then\n let decoder = t.GetElementType() |> autoDecoder extra caseStrategy false\n array decoder |> boxDecoder\n elif t.IsEnum then\n let enumType = System.Enum.GetUnderlyingType(t).FullName\n if enumType = typeof.FullName then\n enumDecoder sbyte Operators.string t |> boxDecoder\n elif enumType = typeof.FullName then\n enumDecoder byte Operators.string t |> boxDecoder\n elif enumType = typeof.FullName then\n enumDecoder int16 Operators.string t |> boxDecoder\n elif enumType = typeof.FullName then\n enumDecoder uint16 Operators.string t |> boxDecoder\n elif enumType = typeof.FullName then\n enumDecoder int Operators.string t |> boxDecoder\n elif enumType = typeof.FullName then\n enumDecoder uint32 Operators.string t |> boxDecoder\n else\n failwithf\n \"\"\"Cannot generate auto decoder for %s.\nThoth.Json.Net only support the following enum types:\n- sbyte\n- byte\n- int16\n- uint16\n- int\n- uint32\nIf you can't use one of these types, please pass an extra decoder.\n \"\"\" t.FullName\n elif t.IsGenericType then\n if FSharpType.IsTuple(t) then\n let decoders = FSharpType.GetTupleElements(t) |> Array.map (autoDecoder extra caseStrategy false)\n fun path value ->\n if Helpers.isArray value then\n mixedArray 0 decoders path (Helpers.asArray value)\n |> Result.map (fun xs -> FSharpValue.MakeTuple(List.toArray xs, t))\n else (path, BadPrimitive (\"an array\", value)) |> Error\n else\n let fullname = t.GetGenericTypeDefinition().FullName\n if fullname = typedefof.FullName then\n t.GenericTypeArguments.[0] |> (autoDecoder extra caseStrategy true) |> option |> boxDecoder\n elif fullname = typedefof.FullName then\n t.GenericTypeArguments.[0] |> (autoDecoder extra caseStrategy false) |> list |> boxDecoder\n elif fullname = typedefof.FullName then\n t.GenericTypeArguments.[0] |> (autoDecoder extra caseStrategy false) |> seq |> boxDecoder\n elif fullname = typedefof< Map >.FullName then\n let keyDecoder = t.GenericTypeArguments.[0] |> autoDecoder extra caseStrategy false\n let valueDecoder = t.GenericTypeArguments.[1] |> autoDecoder extra caseStrategy false\n oneOf [\n autoObject2 keyDecoder valueDecoder\n list (tuple2 keyDecoder valueDecoder)\n ] |> map (fun ar -> toMap (unbox ar) |> box)\n elif fullname = typedefof< Set >.FullName then\n let decoder = t.GenericTypeArguments.[0] |> autoDecoder extra caseStrategy false\n fun path value ->\n match array decoder path value with\n | Error er -> Error er\n | Ok ar -> toSet (unbox ar) |> box |> Ok\n else\n autoDecodeRecordsAndUnions extra caseStrategy isOptional t\n else\n if fullname = typeof.FullName then\n boxDecoder bool\n elif fullname = typedefof.FullName then\n boxDecoder unit\n elif fullname = typeof.FullName then\n boxDecoder string\n elif fullname = typeof.FullName then\n boxDecoder char\n elif fullname = typeof.FullName then\n boxDecoder sbyte\n elif fullname = typeof.FullName then\n boxDecoder byte\n elif fullname = typeof.FullName then\n boxDecoder int16\n elif fullname = typeof.FullName then\n boxDecoder uint16\n elif fullname = typeof.FullName then\n boxDecoder int\n elif fullname = typeof.FullName then\n boxDecoder uint32\n elif fullname = typeof.FullName then\n boxDecoder float\n elif fullname = typeof.FullName then\n boxDecoder float32\n // These number types require extra libraries in Fable. To prevent penalizing\n // all users, extra decoders (withInt64, etc) must be passed when they're needed.\n\n // elif fullname = typeof.FullName then\n // boxDecoder int64\n // elif fullname = typeof.FullName then\n // boxDecoder uint64\n // elif fullname = typeof.FullName then\n // boxDecoder bigint\n // elif fullname = typeof.FullName then\n // boxDecoder decimal\n elif fullname = typeof.FullName then\n boxDecoder datetimeUtc\n elif fullname = typeof.FullName then\n boxDecoder datetimeOffset\n elif fullname = typeof.FullName then\n boxDecoder timespan\n elif fullname = typeof.FullName then\n boxDecoder guid\n elif fullname = typeof.FullName then\n fun _ v -> Ok v\n else autoDecodeRecordsAndUnions extra caseStrategy isOptional t\n\n let private makeExtra (extra: ExtraCoders option) =\n match extra with\n | None -> Map.empty\n | Some e -> Map.map (fun _ (_,dec) -> ref dec) e.Coders\n\n type Auto =\n static member generateBoxedDecoderCached(t: System.Type, ?caseStrategy : CaseStrategy, ?extra: ExtraCoders): BoxedDecoder =\n let caseStrategy = defaultArg caseStrategy PascalCase\n\n let key =\n t.FullName\n |> (+) (Operators.string caseStrategy)\n |> (+) (extra |> Option.map (fun e -> e.Hash) |> Option.defaultValue \"\")\n\n Util.CachedDecoders.GetOrAdd(key, fun _ -> autoDecoder (makeExtra extra) caseStrategy false t)\n\n static member inline generateDecoderCached<'T>(?caseStrategy : CaseStrategy, ?extra: ExtraCoders): Decoder<'T> =\n Auto.generateBoxedDecoderCached(typeof<'T>, ?caseStrategy=caseStrategy, ?extra=extra) |> unboxDecoder\n\n static member generateBoxedDecoder(t: System.Type, ?caseStrategy : CaseStrategy, ?extra: ExtraCoders): BoxedDecoder =\n let caseStrategy = defaultArg caseStrategy PascalCase\n autoDecoder (makeExtra extra) caseStrategy false t\n\n static member inline generateDecoder<'T>(?caseStrategy : CaseStrategy, ?extra: ExtraCoders): Decoder<'T> =\n Auto.generateBoxedDecoder(typeof<'T>, ?caseStrategy=caseStrategy, ?extra=extra) |> unboxDecoder\n\n static member inline fromString<'T>(json: string, ?caseStrategy : CaseStrategy, ?extra: ExtraCoders): Result<'T, string> =\n let decoder = Auto.generateDecoder<'T>(?caseStrategy=caseStrategy, ?extra=extra)\n fromString decoder json\n\n static member inline unsafeFromString<'T>(json: string, ?caseStrategy : CaseStrategy, ?extra: ExtraCoders): 'T =\n let decoder = Auto.generateDecoder<'T>(?caseStrategy=caseStrategy, ?extra=extra)\n match fromString decoder json with\n | Ok x -> x\n | Error msg -> failwith msg\n","module Client.Page.User.SensorMap\n\nopen System\nopen Client\nopen Client.Domain\nopen Client.DomainTypes.SensorMap\nopen Client.Infrastructure\nopen Client.InfrastructureTypes\nopen Client.Map.SensorPopup\nopen Client.Map.MapMarker\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React.Props\nopen Fulma\nopen Fable.React\nopen Leaflet\nopen ReactLeaflet\nopen Client.Infrastructure.Api\nopen Client.DomainTypes.Msg\nopen Shared.Dto\nopen Shared.Dto.Dto\nopen Thoth.Elmish\nopen Shared.Dto.MapSensorData\n\nlet private latLngToLocation (latLng: LatLng) : Location = {\n Latitude = latLng.lat\n Longitude = latLng.lng\n}\n\ntype MapViewData = {\n Center: Location\n Zoom: float\n}\n\ntype Model = {\n Session: SessionKey\n Sensors: MapSensor list\n LastUpdate: DateTimeOffset option\n MapViewData: MapViewData\n RefreshRunning: bool\n}\n\nlet onDrag (dispatch: MapMsg -> Unit) (map: Leaflet.Map) =\n let newCenter = map.getCenter () |> latLngToLocation\n\n dispatch (MapMoved newCenter)\n\nlet private getMapFromEvent (event: LeafletEvent) =\n event.target |> Option.map (fun target -> target :?> Leaflet.Map) |> Option.get\n\n\nlet onZoom (dispatch: MapMsg -> Unit) (map: Leaflet.Map) =\n let data: MapZoomedData = {\n Center = map.getCenter () |> latLngToLocation\n Zoom = map.getZoom ()\n }\n\n dispatch (MapZoomed data)\n\nlet view (model: Model) (dispatch: Msg -> Unit) =\n let markers =\n model.Sensors\n |> List.map (fun sensor ->\n let position = makePosition sensor.Latitude sensor.Longitude\n\n let popupContent = makeMarkerPopup sensor dispatch\n makeMarker sensor.Data position popupContent\n )\n\n Hero.hero [] [\n map\n [\n MapProps.MinZoom 6.\n MapProps.MaxZoom 19.\n MapProps.Center(model.MapViewData.Center |> Location.toLatLngExpression)\n MapProps.Zoom model.MapViewData.Zoom\n MapProps.ZoomControl true\n MapProps.Style [ Height \"calc(100vh - 3.25rem)\"; ZIndex \"0\" ]\n MapProps.OnDragEnd(getMapFromEvent >> onDrag (Map >> dispatch))\n MapProps.OnZoomEnd(getMapFromEvent >> onZoom (Map >> dispatch))\n ]\n (tileLayer [\n TileLayerProps.Url \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n ] []\n :: markers)\n\n Button.button [\n Button.IsLoading model.RefreshRunning\n Button.Color Color.IsLink\n Button.Props [\n Style [\n Position PositionOptions.Absolute\n Bottom \"10px\"\n Right \"10px\"\n ZIndex \"1\"\n ]\n ]\n Button.OnClick(fun _ -> dispatch (Map MapMsg.RefreshData))\n ] [\n Icon.icon [ Icon.Size IsSmall ] [ Fa.i [ Fa.Solid.Sync ] [] ]\n span [] [ str \"Aktualisieren\" ]\n ]\n ]\n\nlet storeMapDataInLocalStorage (data: MapViewData) = LocalStorage.saveJson \"map-data\" data\n\nlet retrieveMapDataFromLocalStorage () =\n LocalStorage.loadJson \"map-data\"\n\n\nlet retrieveSensorsCmd sessionKey =\n Cmd.OfAsync.either api.getSensors sessionKey MapMsg.GotSensors MapMsg.SensorLoadingFailed\n\nlet private getInitialMapViewData (maybeExistingData: MapViewData option) =\n maybeExistingData\n |> Option.defaultValue {\n Zoom = 8.\n Center = {\n Latitude = 47.59397\n Longitude = 14.12456\n }\n }\n\nlet init (session: UserSession) =\n let maybeExistingViewData = retrieveMapDataFromLocalStorage ()\n\n let mapViewData = getInitialMapViewData maybeExistingViewData\n\n storeMapDataInLocalStorage mapViewData\n\n let model = {\n Sensors = []\n Session = session.SessionKey\n LastUpdate = None\n RefreshRunning = true\n MapViewData = mapViewData\n }\n\n let cmd = retrieveSensorsCmd session.SessionKey\n\n model, cmd\n\nlet updateSensors (sensors: MapSensor list) =\n let dates =\n sensors\n |> List.map (fun sensor -> sensor.Data)\n |> List.map getSensorDataDate\n |> List.choose id\n\n let latestDate =\n match dates with\n | x :: _ -> Some(List.max dates)\n | _ -> None\n\n let toastCmd = Toast.create \"Daten erfolgreich geladen\" |> Toast.success\n\n latestDate, toastCmd\n\nlet update (msg: MapMsg) (model: Model) =\n match msg with\n | MapMsg.GotSensors sensorsResult ->\n match sensorsResult with\n | Result.Ok sensors ->\n let latestDate, toastCmd = updateSensors sensors\n\n {\n model with\n Sensors = sensors\n LastUpdate = latestDate\n RefreshRunning = false\n },\n toastCmd\n | Result.Error error ->\n let errorMessage =\n match error with\n | AuthErr Unauthenticated -> \"Sie sind nicht eingeloggt, bitte laden Sie die Seite neu\"\n | AuthErr Unauthorized ->\n \"Sie sind nicht dazu berechtigt, die Sensorkarte anzuzeigen, bitte wenden Sie sich an einen Administrator\"\n | _ -> \"Ein Fehler beim Laden der Sensoren ist aufgetreten. Bitte laden Sie die Seite neu\"\n\n let cmd = Toast.create errorMessage |> Toast.error\n\n { model with RefreshRunning = false }, cmd\n | MapMsg.MapMoved center ->\n let newMapViewData = { model.MapViewData with Center = center }\n\n storeMapDataInLocalStorage newMapViewData\n\n { model with MapViewData = newMapViewData }, Cmd.none\n | MapMsg.MapZoomed data ->\n let newMapViewData = {\n model.MapViewData with\n Zoom = data.Zoom\n Center = data.Center\n }\n\n storeMapDataInLocalStorage newMapViewData\n\n { model with MapViewData = newMapViewData }, Cmd.none\n | MapMsg.MoveToLocation location ->\n let newMapViewData = {\n Zoom = 14.\n Center = location\n }\n\n storeMapDataInLocalStorage newMapViewData\n\n { model with MapViewData = newMapViewData }, Cmd.none\n | MapMsg.RefreshData ->\n let cmd = retrieveSensorsCmd model.Session\n\n { model with RefreshRunning = true }, cmd\n | MapMsg.SensorLoadingFailed ex ->\n let statusCode = Exceptions.getStatusCode ex\n\n let message =\n match statusCode with\n | 500 -> \"Interner Server Fehler ist aufgetreten. Bitte wende dich an den Administrator\"\n | _ -> sprintf \"Fehlermeldung: '%s'. Bitte wende dich an den Administrator\" ex.Message\n\n let toastCmd =\n Toast.create message\n |> Toast.errorTitle statusCode\n |> Toast.timeout (TimeSpan.FromSeconds 10.0)\n |> Toast.error\n\n\n { model with RefreshRunning = false }, toastCmd","module Client.Components.PhysicalSensorRefreshButton\n\nopen Fulma\nopen Fulma.Extensions.Wikiki\nopen Shared.DtoTypes\nopen Fable.React.Helpers\n\ntype FinishedState =\n | Successful\n | Error of string\n\ntype Model =\n | Waiting\n | RefreshRunning\n | Finished of FinishedState\n\nlet modelFromResult (result: PhysicalSensorRefresh.RefreshResult) =\n let finishedState =\n match result.ErrorMessage with\n | Some message -> FinishedState.Error message\n | None -> FinishedState.Successful\n\n Finished finishedState\n\n\nlet private createReadyButton (color: IColor) (maybeTooltip: string option) (label: string) onClick =\n Button.button [\n Button.Color color\n Button.OnClick onClick\n match maybeTooltip with\n | Some tooltip ->\n Button.CustomClass Tooltip.ClassName\n Button.Props [ Tooltip.dataTooltip tooltip ]\n | None -> ()\n ] [ str label ]\n\nlet view (label: string) onClick (model: Model) =\n match model with\n | Waiting -> createReadyButton IsLink None label onClick\n | RefreshRunning -> Button.button [ Button.Color IsLink; Button.IsLoading true ] [ str label ]\n | Finished result ->\n let color, tooltip =\n match result with\n | Successful -> (IsSuccess, None)\n | Error message -> (IsDanger, Some message)\n\n createReadyButton color tooltip label onClick","namespace Shared.Infrastructure\n\n[]\nmodule Option =\n let apply (maybeData: 'a option) (maybeF: ('a -> 'b) option) =\n Option.map2 (fun f data -> f data) maybeF maybeData\n\n let ofBoolean (value: 'a) (boolean: bool) = if boolean then Some value else None\n\n let toBoolean (value: 'a option) =\n match value with\n | Some _ -> true\n | None -> false\n\n let fromResult (result: Result<'a, 'b>) : 'a option =\n match result with\n | Ok a -> Some a\n | Error _ -> None\n\n let ofTryTuple (found: bool, item: 'a) : 'a option = if found then Some item else None\n\n let takeIf (found: bool) (item: 'a option) : 'a option = if found then item else None","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Select =\r\n\r\n type Option =\r\n | Size of ISize\r\n /// Add `is-fullwidth` class\r\n | [] IsFullWidth\r\n /// Add `is-inline` class\r\n | [] IsInline\r\n /// Add `is-loading` class if true\r\n | [] IsLoading of bool\r\n /// Add `is-focused` class if true\r\n | [] IsFocused of bool\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n /// Add `disabled` HTMLAttr if true\r\n | Disabled of bool\r\n | Color of IColor\r\n /// Add `is-rounded` class\r\n | [] IsRounded\r\n ///Add `is-multiple` class\r\n | [] IsMultiple\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
      \r\n let select (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Size size -> ofSize size |> result.AddClass\r\n | Color color -> ofColor color |> result.AddClass\r\n | IsFullWidth\r\n | IsInline\r\n | IsMultiple\r\n | IsRounded -> result.AddCaseName option\r\n | IsLoading state\r\n | IsFocused state\r\n | IsActive state\r\n | Disabled state -> if state then result.AddCaseName option else result\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"select\").ToReactElement(div, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\nopen Browser.Types\r\n\r\n[]\r\nmodule Modal =\r\n\r\n type Option =\r\n | Props of IHTMLProp list\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Close =\r\n type Option =\r\n | Size of ISize\r\n | OnClick of (MouseEvent -> unit)\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
      \r\n let modal (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsActive state -> if state then result.AddCaseName option else result\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"modal\").ToReactElement(div, children)\r\n\r\n /// Generate \r\n let close (options : Close.Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Close.Size IsSmall\r\n | Close.Size IsMedium ->\r\n Fable.Core.JS.console.warn(\"`is-small` and `is-medium` are not valid sizes for 'modal close'\")\r\n result\r\n | Close.Size size -> ofSize size |> result.AddClass\r\n | Close.OnClick cb -> DOMAttr.OnClick cb |> result.AddProp\r\n | Close.Props props -> result.AddProps props\r\n | Close.CustomClass customClass -> result.AddClass customClass\r\n | Close.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"modal-close\").ToReactElement(button, children)\r\n\r\n /// Generate
      \r\n let background (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"modal-background\").ToReactElement(div, children)\r\n\r\n /// Generate
      \r\n let content (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"modal-content\").ToReactElement(div, children)\r\n\r\n module Card =\r\n\r\n /// Generate
      \r\n let card (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"modal-card\").ToReactElement(div, children)\r\n\r\n /// Generate
      \r\n let head (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"modal-card-head\").ToReactElement(header, children)\r\n\r\n /// Generate
      \r\n let foot (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"modal-card-foot\").ToReactElement(footer, children)\r\n\r\n /// Generate
      \r\n let title (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"modal-card-title\").ToReactElement(div, children)\r\n\r\n /// Generate
      \r\n let body (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"modal-card-body\").ToReactElement(section, children)\r\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\nopen Browser.Types\r\n\r\n[]\r\nmodule Delete =\r\n\r\n type Option =\r\n | Size of ISize\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | OnClick of (MouseEvent -> unit)\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate \r\n let delete (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n // Sizes\r\n | Size size -> ofSize size |> result.AddClass\r\n // Extra\r\n | OnClick cb -> DOMAttr.OnClick cb |> result.AddProp\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"delete\").ToReactElement(a, children)\r\n","module Client.Forms.PhysicalSensor\n\nopen Client.DomainTypes.Msg\nopen Fulma\nopen Microsoft.FSharp.Core\nopen Shared.DtoTypes.PhysicalSensor\nopen Shared.Infrastructure\nopen Shared.Dto.Dto\nopen Fable.React\nopen Fable.React.Props\n\ntype Model = {\n EditExisting: bool\n Name: string option\n AppEui: string option\n DeviceEui: string option\n AppKey: string option\n SelectedType: SensorModel\n Description: string option\n RequestRunning: bool\n}\n\n\ntype Msg =\n | NameUpdated\n | SelectedTypeUpdated\n\nlet init (maybeExistingSensor: PhysicalSensor option) =\n match maybeExistingSensor with\n | Some(Configured existing) -> {\n EditExisting = true\n Name = Some existing.BaseData.Name\n AppEui = Some existing.BaseData.AppEui\n DeviceEui = Some existing.BaseData.DeviceEui\n AppKey = Some existing.BaseData.AppKey\n SelectedType = existing.Configuration\n Description = existing.BaseData.Description\n RequestRunning = false\n }\n | Some(UnConfigured existing) -> {\n EditExisting = true\n Name = Some existing.Name\n AppEui = Some existing.AppEui\n DeviceEui = Some existing.DeviceEui\n AppKey = Some existing.AppKey\n SelectedType = LHT65\n Description = existing.Description\n RequestRunning = false\n }\n | None -> {\n EditExisting = false\n Name = None\n AppEui = None\n DeviceEui = None\n AppKey = None\n SelectedType = LHT65\n Description = None\n RequestRunning = false\n }\n\nlet private tryCreateSensor (model: Model) =\n let maybeBaseData =\n Some createPhysicalSensorBaseData\n |> Option.apply (model.DeviceEui |> Option.map (fun eui -> sprintf \"eui-%s\" (eui.ToLower())))\n |> Option.apply model.Name\n |> Option.apply model.DeviceEui\n |> Option.apply model.AppEui\n |> Option.apply model.AppKey\n |> Option.apply (Some model.Description)\n\n Option.map\n (fun baseData -> {\n BaseData = baseData\n Configuration = model.SelectedType\n })\n maybeBaseData\n\n\nlet modelToOption sensorModel isSelected =\n let sensorModelString = sensorModelToString sensorModel\n\n option [ Value sensorModelString; Selected isSelected ] [ str sensorModelString ]\n\nlet sensorModelSelect (selected: SensorModel) dispatch =\n let modelList = [\n LHT65\n LSN50v2_S31\n S31_LS\n S31_LB\n LSE01\n SE01_LS\n SE01_LB\n LSN50v2_Rain_01mm\n LSN50v2_Rain_02mm\n SN50v3_LS_Rain_01mm\n SN50v3_LB_Rain_01mm\n SN50v3_LS_Rain_02mm\n SN50v3_LB_Rain_02mm\n LLMS01\n LSPH01\n LSN50v2_Wind\n SN50v3_LS_Wind\n SN50v3_LB_Wind\n WSC1L\n DDS20_LB\n DDS20_LS\n RS485_LB_ZFS_02\n RS485_LS_ZFS_02\n ]\n\n let options =\n modelList\n |> List.map (fun sensorModel -> modelToOption sensorModel (selected = sensorModel))\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(\n List.tryFind (fun sensorType -> sensorType = selected) modelList\n |> Option.defaultValue LHT65\n |> sensorModelToString\n )\n OnChange(fun event ->\n (sensorTypeFromString event.Value |> Option.get)\n |> PhysicalSensorFormMsg.SelectedSensorModelChanged\n |> dispatch\n )\n ]\n options\n ]\n\nlet private createFormField label id control =\n Field.div [] [\n Label.label [ Label.For id ] [ str label ]\n control\n ]\n\nlet private createSensorTypeField sensorType dispatch =\n let control =\n Control.div [ Control.IsExpanded ] [ sensorModelSelect sensorType dispatch ]\n\n createFormField \"Sensor-Modell\" \"sensor_model\" control\n\nlet private createNameField name dispatch =\n let id = \"name\"\n\n let control =\n Control.div [ Control.IsExpanded ] [\n Input.text [\n Input.Placeholder \"MS-TLxxx\"\n Input.Value(Option.defaultValue \"\" name)\n Input.OnChange(fun event ->\n event.Value |> String.toOption |> PhysicalSensorFormMsg.NameChanged |> dispatch\n )\n ]\n ]\n\n createFormField \"Eindeutiger Name des Sensors\" id control\n\nlet private createAppEuiField appEui dispatch =\n let id = \"app_eui\"\n\n let control =\n Control.div [ Control.IsExpanded ] [\n Input.text [\n Input.Value(Option.defaultValue \"\" appEui)\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> PhysicalSensorFormMsg.AppEuiChanged\n |> dispatch\n )\n ]\n ]\n\n createFormField \"App EUI\" id control\n\nlet private createDeviceEuiField editExisting deviceEui dispatch =\n let id = \"device_eui\"\n\n let control =\n Control.div [ Control.IsExpanded ] [\n Input.text [\n Input.Disabled editExisting\n Input.Value(Option.defaultValue \"\" deviceEui)\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> PhysicalSensorFormMsg.DeviceEuiChanged\n |> dispatch\n )\n ]\n ]\n\n createFormField \"Device EUI\" id control\n\nlet private createAppKeyField appKey dispatch =\n let id = \"app_key\"\n\n let control =\n Control.div [ Control.IsExpanded ] [\n Input.text [\n Input.Value(Option.defaultValue \"\" appKey)\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> PhysicalSensorFormMsg.AppKeyChanged\n |> dispatch\n )\n ]\n ]\n\n createFormField \"App Key\" id control\n\nlet private createDescriptionField description dispatch =\n let id = \"description\"\n\n let control =\n Control.div [ Control.IsExpanded ] [\n Input.text [\n Input.Value(Option.defaultValue \"\" description)\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> PhysicalSensorFormMsg.DescriptionChanged\n |> dispatch\n )\n ]\n ]\n\n createFormField \"Beschreibung\" id control\n\nlet form dispatch (model: Model) =\n form [] [\n Field.div [] [\n createNameField model.Name dispatch\n createAppEuiField model.AppEui dispatch\n createDeviceEuiField model.EditExisting model.DeviceEui dispatch\n createAppKeyField model.AppKey dispatch\n createSensorTypeField model.SelectedType dispatch\n createDescriptionField model.Description dispatch\n ]\n ]\n\nlet buttonOptions (model: Model) dispatch =\n let maybeSensor = tryCreateSensor model\n\n let dynamicButtonOptions =\n match maybeSensor with\n | Some sensor ->\n let onClick =\n if model.EditExisting then\n PhysicalSensorListMsg.UpdateSensor\n else\n PhysicalSensorListMsg.CreateSensor\n\n [\n Button.Disabled false\n Button.OnClick(fun _ -> dispatch (onClick sensor))\n ]\n | None -> [ Button.Disabled true ]\n\n List.append\n [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n ]\n dynamicButtonOptions\n\nlet view dispatch (model: Model) =\n let closeModal = (fun _ -> dispatch PhysicalSensorListMsg.CloseModal)\n\n let headline =\n if model.EditExisting then\n \"Bestehenden Sensor bearbeiten\"\n else\n \"Neuer physikalischer Sensor erstellen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [\n Content.content [] [\n form (PhysicalSensorListMsg.Form >> dispatch) model\n ]\n ]\n Modal.Card.foot [] [\n Button.button (buttonOptions model dispatch) [ str \"Speichern\" ]\n ]\n ]\n ]","module Shared.DtoTypes.PhysicalSensor\n\nopen System\n\ntype SensorModel =\n | LHT65\n | LSN50v2_S31\n | S31_LS\n | S31_LB\n | LSE01\n | SE01_LS\n | SE01_LB\n | LSN50v2_Rain_01mm\n | LSN50v2_Rain_02mm\n | LSN50v2_Wind\n | SN50v3_LS_Rain_01mm\n | SN50v3_LB_Rain_01mm\n | SN50v3_LS_Rain_02mm\n | SN50v3_LB_Rain_02mm\n | SN50v3_LS_Wind\n | SN50v3_LB_Wind\n | LLMS01\n | LSPH01\n | WSC1L\n | DDS20_LB\n | DDS20_LS\n | RS485_LB_ZFS_02\n | RS485_LS_ZFS_02\n\ntype PhysicalSensorBaseData = {\n TtnId: string\n Name: string\n DeviceEui: string\n AppEui: string\n AppKey: string\n Description: string option\n}\n\nlet createPhysicalSensorBaseData ttnId name deviceEui appEui appKey description = {\n TtnId = ttnId\n Name = name\n DeviceEui = deviceEui\n AppEui = appEui\n AppKey = appKey\n Description = description\n}\n\ntype ConfiguredPhysicalSensor = {\n BaseData: PhysicalSensorBaseData\n Configuration: SensorModel\n}\n\ntype PhysicalSensor =\n | Configured of ConfiguredPhysicalSensor\n | UnConfigured of PhysicalSensorBaseData\n\ntype PhysicalSensorLastData = {\n LastTimeStamp: DateTimeOffset\n LastTimespan: TimeSpan option\n LastSpreadingFactor: int\n}\n\ntype PhysicalSensorWithLastData = {\n Sensor: PhysicalSensor\n LastData: PhysicalSensorLastData option\n}","namespace Client.InfrastructureTypes\n\nopen Elmish\n\n[]\nmodule Cmds =\n let batch (additionalCmd: Cmd<'cmd>) (model: 'model, cmd: Cmd<'cmd>) = model, Cmd.batch [ cmd; additionalCmd ]","module Client.Infrastructure.Table\n\nopen Fable.React\nopen Fable.React.Props\n\nlet rowIndexString index = index + 1 |> string |> str\n\nlet scrollableTable (table: ReactElement) : ReactElement =\n div [ Class \"table-container\" ] [ table ]","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Table =\r\n\r\n type TableOption =\r\n /// Set `is-hovered` class\r\n | []IsBordered\r\n /// Set `is-striped` class\r\n | []IsStriped\r\n /// Add `is-fullwidth` class\r\n | []IsFullWidth\r\n /// Set `is-narrow` class\r\n | []IsNarrow\r\n /// Set `is-hoverable` class\r\n | []IsHoverable\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
      \r\n let table options children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsBordered\r\n | IsStriped\r\n | IsFullWidth\r\n | IsNarrow\r\n | IsHoverable -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"table\").ToReactElement(table, children)\r\n","module Client.Page.Admin.PhysicalSensorList\n\nopen System\nopen Client.Components\nopen Client.Domain\nopen Client.Infrastructure\nopen Client.InfrastructureTypes\nopen Client\nopen Client.Infrastructure.Api\nopen Client.DomainTypes.Msg\n\nopen Elmish\nopen Fable.React.Props\nopen Fulma\nopen Shared.Dto.Dto\nopen Fable.React\nopen Shared.DtoTypes\nopen Shared.DtoTypes.PhysicalSensor\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\ntype DataModel = {\n Sensors: PhysicalSensorWithLastData list\n TTNRefreshButton: PhysicalSensorRefreshButton.Model\n TTIRefreshButton: PhysicalSensorRefreshButton.Model\n Session: UserSession\n Modal: Forms.PhysicalSensor.Model option\n}\n\ntype Model = Loadable\n\nlet init session =\n (Loadable.Loading session,\n Cmd.OfAsync.perform api.getAllTtnSensors () (PhysicalSensorListMsg.ListReceived >> TtnSensorList))\n\nlet updateRequestRunning (model: DataModel) (requestRunning: bool) =\n let modalModel = Option.get model.Modal\n\n { model with Modal = Some { modalModel with RequestRunning = requestRunning } }\n\nlet private updateRefreshButtonState\n (f: PhysicalSensorRefreshButton.Model -> DataModel -> DataModel)\n (result: PhysicalSensorRefresh.Result)\n (model: DataModel)\n : Model * Cmd<'msg> =\n let newModel, buttonState =\n match result with\n | PhysicalSensorRefresh.RefreshFailed message ->\n model, PhysicalSensorRefreshButton.Finished(PhysicalSensorRefreshButton.FinishedState.Error message)\n | PhysicalSensorRefresh.Refreshed result ->\n { model with Sensors = result.Sensors }, PhysicalSensorRefreshButton.modelFromResult result\n\n newModel |> f buttonState |> Loadable.Data, Cmd.none\n\nlet update (msg: PhysicalSensorListMsg) (model: Model) =\n match msg, model with\n | PhysicalSensorListMsg.RefreshTTNSensors, Loadable.Data data ->\n let request = {\n SessionKey = data.Session.SessionKey\n Data = ()\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.refreshTtnEndDevices\n request\n (PhysicalSensorListMsg.TtnListRefreshed >> TtnSensorList)\n\n Loadable.Data { data with TTNRefreshButton = PhysicalSensorRefreshButton.RefreshRunning }, cmd\n | PhysicalSensorListMsg.RefreshTTISensors, Loadable.Data data ->\n let request = {\n SessionKey = data.Session.SessionKey\n Data = ()\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.refreshTtiEndDevices\n request\n (PhysicalSensorListMsg.TtiListRefreshed >> TtnSensorList)\n\n Loadable.Data { data with TTIRefreshButton = PhysicalSensorRefreshButton.RefreshRunning }, cmd\n | PhysicalSensorListMsg.TtiListRefreshed result, Loadable.Data dataModel ->\n let updater =\n fun buttonState dataModel -> { dataModel with TTIRefreshButton = buttonState }\n\n updateRefreshButtonState updater result dataModel\n\n | PhysicalSensorListMsg.TtnListRefreshed result, Loadable.Data dataModel ->\n let updater =\n fun buttonState dataModel -> { dataModel with TTNRefreshButton = buttonState }\n\n updateRefreshButtonState updater result dataModel\n\n | PhysicalSensorListMsg.ListReceived sensors, Loadable.Loading session ->\n Loadable.Data {\n Sensors = sensors\n Session = session\n Modal = None\n TTNRefreshButton = PhysicalSensorRefreshButton.Waiting\n TTIRefreshButton = PhysicalSensorRefreshButton.Waiting\n },\n Cmd.none\n | PhysicalSensorListMsg.CloseModal, Loadable.Data data -> Loadable.Data { data with Modal = None }, Cmd.none\n | PhysicalSensorListMsg.OpenNewSensorModal, Loadable.Data data ->\n Loadable.Data { data with Modal = Some(Forms.PhysicalSensor.init None) }, Cmd.none\n | PhysicalSensorListMsg.EditSensorModal sensor, Loadable.Data data ->\n Loadable.Data { data with Modal = Some(Forms.PhysicalSensor.init (Some sensor)) }, Cmd.none\n | PhysicalSensorListMsg.Form formMsg, Loadable.Data data ->\n match (formMsg, data.Modal) with\n | PhysicalSensorFormMsg.SelectedSensorModelChanged selectedType, Some modal ->\n let modalModel = { modal with SelectedType = selectedType }\n\n Loadable.Data { data with Modal = Some modalModel }, Cmd.none\n | PhysicalSensorFormMsg.NameChanged name, Some modal ->\n let modalModel = { modal with Name = name }\n\n Loadable.Data { data with Modal = Some modalModel }, Cmd.none\n | PhysicalSensorFormMsg.AppEuiChanged appEui, Some modal ->\n let modalModel = { modal with AppEui = appEui }\n\n Loadable.Data { data with Modal = Some modalModel }, Cmd.none\n | PhysicalSensorFormMsg.DeviceEuiChanged deviceEui, Some modal ->\n let modalModel = { modal with DeviceEui = deviceEui }\n\n Loadable.Data { data with Modal = Some modalModel }, Cmd.none\n | PhysicalSensorFormMsg.AppKeyChanged appKey, Some modal ->\n let modalModel = { modal with AppKey = appKey }\n\n Loadable.Data { data with Modal = Some modalModel }, Cmd.none\n | PhysicalSensorFormMsg.DescriptionChanged description, Some modal ->\n let modalModel = { modal with Description = description }\n\n Loadable.Data { data with Modal = Some modalModel }, Cmd.none\n | _ -> Loadable.Data data, Cmd.none\n\n\n | PhysicalSensorListMsg.CreateSensor sensor, Loadable.Data data ->\n let request = {\n SessionKey = data.Session.SessionKey\n Data = sensor\n }\n\n Loadable.Data(updateRequestRunning data true),\n\n Cmd.map TtnSensorList (Cmd.OfAsync.perform api.createPhysicalSensor request PhysicalSensorListMsg.SensorCreated)\n | PhysicalSensorListMsg.SensorCreated response, Loadable.Data data ->\n match response with\n | Ok(Some createdSensor) ->\n let toastCmd =\n Toast.create \"Der Sensor wurde erfolgreich gespeichert\" |> Toast.success\n\n let createdSensorWithDate = {\n Sensor = Configured createdSensor\n LastData = None\n }\n\n let newList =\n createdSensorWithDate :: data.Sensors\n |> List.sortBy (fun sensor -> (getBaseData sensor.Sensor).Name)\n\n Loadable.Data {\n data with\n Sensors = newList\n Modal = None\n },\n toastCmd\n | _ ->\n let toastCmd =\n Toast.create \"Ein Fehler ist aufgetreten beim Speichern des Sensors\"\n |> Toast.error\n\n Loadable.Data(updateRequestRunning data false), toastCmd\n | PhysicalSensorListMsg.UpdateSensor sensor, Loadable.Data data ->\n let request = {\n SessionKey = data.Session.SessionKey\n Data = sensor\n }\n\n Loadable.Data(updateRequestRunning data true),\n\n Cmd.map TtnSensorList (Cmd.OfAsync.perform api.updatePhysicalSensor request PhysicalSensorListMsg.SensorUpdated)\n | PhysicalSensorListMsg.SensorUpdated response, Loadable.Data data ->\n match response with\n | Ok(Some updatedSensor) ->\n let toastCmd =\n Toast.create \"Der Sensor wurde erfolgreich aktualisiert\" |> Toast.success\n\n let newList =\n List.filteredMap\n (fun (sensor: PhysicalSensorWithLastData) ->\n (getBaseData sensor.Sensor).DeviceEui = updatedSensor.BaseData.DeviceEui\n )\n (fun (sensor: PhysicalSensorWithLastData) -> { sensor with Sensor = Configured updatedSensor })\n data.Sensors\n\n Loadable.Data {\n data with\n Sensors = newList\n Modal = None\n },\n toastCmd\n | _ ->\n let toastCmd =\n Toast.create \"Ein Fehler ist aufgetreten beim Speichern des Sensors\"\n |> Toast.error\n\n Loadable.Data(updateRequestRunning data false), toastCmd\n | PhysicalSensorListMsg.DeleteSensor sensor, Loadable.Data data ->\n let request = {\n SessionKey = data.Session.SessionKey\n Data = sensor\n }\n\n Loadable.Data { data with Modal = None },\n Cmd.map TtnSensorList (Cmd.OfAsync.perform api.removePhysicalSensor request PhysicalSensorListMsg.SensorDeleted)\n | PhysicalSensorListMsg.SensorDeleted response, Loadable.Data data ->\n match response with\n | Ok _ ->\n let toastCmd = Toast.create \"Der Sensor wurde erfolgreich gelöscht\" |> Toast.success\n\n init data.Session |> Cmds.batch toastCmd\n | _ ->\n let toastCmd =\n Toast.create \"Ein Fehler ist aufgetreten beim Lößchen des Sensors\"\n |> Toast.error\n\n Loadable.Data(updateRequestRunning data false), toastCmd\n | _, _ -> model, Cmd.none\n\nlet private expectedIntervalMinutes (model: SensorModel) =\n match model with\n | WSC1L -> 2\n | LHT65\n | LSN50v2_S31\n | S31_LS\n | S31_LB\n | LSN50v2_Wind\n | SN50v3_LS_Wind\n | SN50v3_LB_Wind\n | LSN50v2_Rain_01mm\n | LSN50v2_Rain_02mm\n | SN50v3_LS_Rain_01mm\n | SN50v3_LS_Rain_02mm\n | SN50v3_LB_Rain_01mm\n | SN50v3_LB_Rain_02mm\n | DDS20_LB\n | DDS20_LS -> 10\n | LSE01\n | SE01_LS\n | SE01_LB\n | LLMS01\n | LSPH01\n | RS485_LB_ZFS_02\n | RS485_LS_ZFS_02 -> 20\n\nlet private dangerColor = \"#ff0000\"\n\nlet private blackColor = \"#000000\"\n\nlet private createTableCell (color: string) (content: string) =\n td [ Style [ Color color ] ] [ str content ]\n\nlet private createLastIntervalCell (sensorModel: SensorModel) (timespan: TimeSpan) =\n let expectedMinutes = expectedIntervalMinutes sensorModel\n\n let roundedMinutes = TimeSpan.toRoundedMinutes timespan\n\n let color =\n if roundedMinutes <> expectedMinutes then\n dangerColor\n else\n blackColor\n\n let content = TimeSpan.countToString roundedMinutes \"Minute\" \"Minuten\"\n\n createTableCell color content\n\nlet private expectedSpreadingFactor = 7\n\nlet lastDataCells (maybeSensorModel: SensorModel option) (lastData: PhysicalSensorLastData) : ReactElement list =\n let timeStampCell =\n lastData.LastTimeStamp\n |> TimeSpan.createElapsedTime\n |> TimeSpan.toHumanReadable\n |> sprintf \"vor %s\"\n |> fun content -> td [] [ str content ]\n\n let interval =\n match lastData.LastTimespan, maybeSensorModel with\n | Some interval, Some sensorModel -> createLastIntervalCell sensorModel interval\n | Some interval, None ->\n let roundedMinutes = TimeSpan.toRoundedMinutes interval\n\n let content = TimeSpan.countToString roundedMinutes \"Minute\" \"Minuten\"\n\n createTableCell blackColor content\n | None, _ -> td [] []\n\n let lastSpreadingFactorColor =\n if lastData.LastSpreadingFactor <> expectedSpreadingFactor then\n dangerColor\n else\n blackColor\n\n let content = sprintf \"SF %d\" lastData.LastSpreadingFactor\n\n let lastSpreadingFactor = createTableCell lastSpreadingFactorColor content\n\n [ timeStampCell; interval; lastSpreadingFactor ]\n\nlet sensorToRow dispatch (index: int) (sensor: PhysicalSensorWithLastData) =\n let lastDataCells =\n match sensor.LastData with\n | Some lastData -> lastDataCells (getSensorType sensor.Sensor) lastData\n | None -> [ td [] []; td [] []; td [] [] ]\n\n tr [] [\n td [] [ Table.rowIndexString index ]\n td [] [ str (getSensorName sensor.Sensor) ]\n td [] [ str (getSensorAppEui sensor.Sensor) ]\n td [] [ str (getSensorDeviceEui sensor.Sensor) ]\n td [] [ str (getSensorAppKey sensor.Sensor) ]\n td [] [\n (getBaseData sensor.Sensor).Description |> Option.defaultValue \"\" |> str\n ]\n td [] [\n sensorTypeAsString sensor.Sensor |> Option.defaultValue \"-\" |> str\n ]\n yield! lastDataCells\n td [] [\n Button.button [\n Clickable.onClickPreventDefault (fun _ ->\n dispatch (PhysicalSensorListMsg.EditSensorModal sensor.Sensor |> TtnSensorList)\n )\n |> Button.OnClick\n ] [ str \"Bearbeiten\" ]\n ]\n td [] [\n Button.button [\n Clickable.onClickPreventDefault (fun _ ->\n dispatch (PhysicalSensorListMsg.DeleteSensor(getSensorName sensor.Sensor) |> TtnSensorList)\n )\n |> Button.OnClick\n ] [ str \"Löschen\" ]\n ]\n ]\n\nlet sensorListToTable dispatch (sensors: PhysicalSensorWithLastData list) =\n Table.table [\n Table.IsBordered\n Table.IsFullWidth\n Table.IsStriped\n ] [\n thead [] [\n tr [] [\n td [] [ str \"#\" ]\n td [] [ str \"Name\" ]\n td [] [ str \"App EUI\" ]\n td [] [ str \"Device EUI\" ]\n td [] [ str \"App key\" ]\n td [] [ str \"Description\" ]\n td [] [ str \"Sensortyp\" ]\n td [] [ str \"Letzte Daten\" ]\n td [] [ str \"Letztes Interval\" ]\n td [] [ str \"Letzte Datenrate\" ]\n td [] []\n td [] []\n ]\n ]\n tbody [] (List.mapi (sensorToRow dispatch) sensors)\n ]\n\nlet createNewDevice dispatch =\n Button.button [\n Button.Color IsLink\n Button.OnClick(fun _ -> dispatch (TtnSensorList PhysicalSensorListMsg.OpenNewSensorModal))\n ] [ str \"Neuer Sensor anlegen\" ]\n\nlet refreshTtnButton model dispatch =\n PhysicalSensorRefreshButton.view\n \"Sensor aus TTN herunterladen\"\n (fun _ -> dispatch (TtnSensorList PhysicalSensorListMsg.RefreshTTNSensors))\n model\n\nlet refreshTtiButton model dispatch =\n PhysicalSensorRefreshButton.view\n \"Sensor aus TTI herunterladen\"\n (fun _ -> dispatch (TtnSensorList PhysicalSensorListMsg.RefreshTTISensors))\n model\n\nlet tableButtons ttnButtonModel ttiButtonModel dispatch =\n Level.level [] [\n Level.left [] []\n Level.right [] [\n Level.item [] [\n Field.div [] [ Control.div [] [ createNewDevice dispatch ] ]\n ]\n Level.item [] [\n Field.div [] [\n Control.div [] [ refreshTtnButton ttnButtonModel dispatch ]\n ]\n ]\n Level.item [] [\n Field.div [] [\n Control.div [] [ refreshTtiButton ttiButtonModel dispatch ]\n ]\n ]\n ]\n ]\n\n\nlet private dataView dispatch (data: DataModel) =\n let tableButtons = tableButtons data.TTNRefreshButton data.TTIRefreshButton dispatch\n let table = sensorListToTable dispatch data.Sensors\n\n let modal =\n data.Modal\n |> Option.map (Forms.PhysicalSensor.view (TtnSensorList >> dispatch))\n |> Option.defaultValue (div [] [])\n\n Container.container [ Container.IsFluid ] [\n Heading.h1 [] [ str \"Physikalische Sensoren Liste\" ]\n tableButtons\n Table.scrollableTable table\n modal\n ]\n\n\nlet view (model: Model) dispatch = Loadable.view (dataView dispatch) model","module Client.Forms.ChoosePhysicalSensor\n\nopen Client.Components\nopen Browser.Types\nopen Client.Infrastructure.Api\nopen Client.Domain\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React.Helpers\nopen Fable.React.Props\nopen Fable.React.Standard\nopen Fulma\nopen Shared.Dto.Dto\nopen Shared.DtoTypes.PhysicalSensor\n\ntype SensorsAvailableModel = {\n UnusedSensors: ConfiguredPhysicalSensor list\n SelectedSensor: ConfiguredPhysicalSensor\n}\n\ntype DataModel =\n | SensorsAvailable of SensorsAvailableModel\n | NoSensorsAvailable\n\ntype Model = Loadable\n\nlet private createDataModel sensors =\n if not (List.isEmpty sensors) then\n SensorsAvailable {\n UnusedSensors = sensors\n SelectedSensor = List.head sensors\n }\n else\n NoSensorsAvailable\n\nlet init (session: UserSession) =\n let request = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n Loadable.Loading(),\n Cmd.OfAsync.perform\n api.getUnusedPhysicalSensors\n request\n (ChoosePhysicalSensorFormMsg.SensorsReceived\n >> MapSensorListMsg.ChoosePhysicalSensorForm)\n\n\nlet update (msg: ChoosePhysicalSensorFormMsg) (model: Model) =\n match msg, model with\n | ChoosePhysicalSensorFormMsg.SensorsReceived response, _ ->\n match response with\n | Ok sensors -> Loadable.Data(createDataModel sensors), Cmd.none\n | AuthenticatedResponse.Error error ->\n let errorMessage =\n match error with\n | AuthErr Unauthenticated -> \"Sie sind nicht angemeldet? Laden Sie die Seite neu\"\n | AuthErr Unauthorized -> \"Sie düfen nicht die Kartensensoren auflisten\"\n | CustomErr error -> error\n\n Loadable.Error errorMessage, Cmd.none\n | SensorSelected sensor, Loadable.Data(SensorsAvailable dataModel) ->\n Loadable.Data(SensorsAvailable { dataModel with SelectedSensor = sensor }), Cmd.none\n | _, _ -> model, Cmd.none\n\nlet physicalSensorToOption (sensor: ConfiguredPhysicalSensor) =\n option [ Value sensor.BaseData.DeviceEui ] [ str sensor.BaseData.Name ]\n\nlet physicalSensorSelect (selected: ConfiguredPhysicalSensor) (list: ConfiguredPhysicalSensor list) dispatch =\n let options = List.map physicalSensorToOption list\n\n let findSensor =\n fun selectedDeviceEui ->\n List.tryFind (fun (sensor: ConfiguredPhysicalSensor) -> sensor.BaseData.DeviceEui = selectedDeviceEui) list\n |> Option.get\n\n let selectedValue = selected.BaseData.DeviceEui\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue selectedValue\n OnChange(fun (event: Event) ->\n (event.target :?> HTMLSelectElement).value\n |> findSensor\n |> ChoosePhysicalSensorFormMsg.SensorSelected\n |> MapSensorListMsg.ChoosePhysicalSensorForm\n |> MapSensorList\n |> dispatch\n )\n ]\n options\n ]\n\nlet private form dispatch (model: SensorsAvailableModel) =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Verfügbare Sensoren\" ]\n Control.div [] [\n physicalSensorSelect model.SelectedSensor model.UnusedSensors dispatch\n ]\n ]\n ]\n\nlet private saveButton dispatch (model: DataModel) =\n match model with\n | SensorsAvailable data ->\n Button.button [\n SubmitButton.onClick (fun event ->\n dispatch (\n ChoosePhysicalSensorFormMsg.Forward data.SelectedSensor\n |> MapSensorListMsg.ChoosePhysicalSensorForm\n )\n )\n ] [ str \"Weiter\" ]\n | NoSensorsAvailable -> div [] []\n\nlet dataView closeModal dispatch (model: DataModel) =\n let content =\n match model with\n | SensorsAvailable model -> form dispatch model\n | NoSensorsAvailable ->\n h1 [] [\n str \"Keine physikalischen Sensoren stehen zur Verfügung\"\n ]\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str \"Physikalischen Sensor auswählen\" ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ content ] ]\n Modal.Card.foot [] [ saveButton (MapSensorList >> dispatch) model ]\n ]\n ]\n\n\nlet view dispatch closeModal (model: Model) =\n Loadable.view (dataView closeModal dispatch) model","namespace Client.Domain\n\nopen Browser.Navigator\nopen Browser.Types\n\n\n[]\nmodule DeviceLocation =\n let private requestCurrentLocation successCallback errorCallback options (geolocation: Geolocation) =\n geolocation.getCurrentPosition (\n successCallback = successCallback,\n errorCallback = errorCallback,\n options = options\n )\n\n let request successCallback errorCallback geolocation =\n let options: PositionOptions =\n { new PositionOptions with\n member this.enableHighAccuracy\n with get () = Some true\n and set v = ()\n\n member this.timeout\n with get () = None\n and set t = ()\n\n member this.maximumAge\n with get () = None\n and set m = ()\n }\n\n requestCurrentLocation successCallback errorCallback options geolocation\n\n let deviceLocationSupported () = Option.isSome navigator.geolocation","namespace Shared.Infrastructure\n\nopen System\n\n[]\nmodule Double =\n let tryParse (str: string) : double option =\n match Double.TryParse(str) with\n | true, n -> Some n\n | _ -> None","namespace Client.InfrastructureTypes\n\nopen Fable.React\nopen Fulma\nopen Shared.Infrastructure\n\n[]\nmodule InputFactory =\n type T = Input.Option list\n\n let init: T = List.empty\n\n let addValue value options = (Input.Value value) :: options\n\n let addProps props options = (Input.Props props) :: options\n\n let addOnChange f options =\n (Input.OnChange(fun event -> f event.Value)) :: options\n\n let addColor color options = (Input.Color color) :: options\n\n let create f (options: T) : ReactElement = f options\n\n[]\nmodule Inputs =\n let toDoubleOption (str: string) =\n str |> String.toOption |> Option.bind Double.tryParse\n\n let toFloatOption (str: string) =\n str |> String.toOption |> Option.bind Double.tryParse\n\n\n let optionalDoubleToString (maybeDouble: float option) =\n Option.map string maybeDouble |> Option.defaultValue \"\"\n\n let createNumberInputOptions maybeValue onChange =\n InputFactory.init\n |> InputFactory.addValue (optionalDoubleToString maybeValue)\n |> Boolean.applyIfTrue (InputFactory.addColor IsDanger) (Option.isNone maybeValue)\n |> InputFactory.addOnChange (toDoubleOption >> onChange)\n\n let createPercentageInput maybeValue onChange =\n createNumberInputOptions maybeValue onChange\n |> InputFactory.addProps [ Props.Min 0; Props.Max 100 ]\n |> InputFactory.create Input.number\n\n let createPositiveDoubleInput maybeValue onChange =\n createNumberInputOptions maybeValue onChange\n |> InputFactory.addProps [ Props.Min 0; Props.Step 0.01 ]\n |> InputFactory.create Input.number","namespace Client.InfrastructureTypes\n\n[]\nmodule Boolean =\n\n let applyIfTrue f boolean data = if boolean then f data else data","namespace Client.Components.Select\n\nopen Fulma\nopen Fable.React\nopen Fable.React.Props\nopen Shared.Dto.User\nopen Shared.Infrastructure\n\n[]\nmodule UserSelect =\n let private userToOption (user: UserDto) =\n option [ Value user.Id ] [ str (getFullNameLastFirst user) ]\n\n let view (onUserSelected: UserDto option -> unit) (selectedUser: UserDto option) (list: UserDto list) =\n let options = option [ Value \"\" ] [ str \"-\" ] :: List.map userToOption list\n\n let findUser =\n fun (maybeId: string) ->\n Int.tryParse maybeId\n |> Option.map (fun userId -> List.tryFind (fun (user: UserDto) -> user.Id = userId) list)\n |> Option.flatten\n\n\n let selectedValue =\n Option.map (fun (user: UserDto) -> user.Id.ToString()) selectedUser\n |> Option.defaultValue \"\"\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue selectedValue\n OnChange(fun event -> event.Value |> findUser |> onUserSelected)\n ]\n options\n ]","namespace Shared.Infrastructure\n\nopen System\n\n[]\nmodule Int =\n let tryParse (str: string) : int option =\n match Int32.TryParse str with\n | true, num -> Some num\n | _ -> None","module Client.Forms.MapSensor\n\nopen System\nopen Browser.Types\nopen Browser.Navigator\nopen Client\nopen Client.Components.Select\nopen Client.Domain\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fulma\nopen Shared\nopen Shared.Domain\nopen Shared.Dto\nopen Shared.Dto.Dto\nopen Fable.React\nopen Fable.React.Props\nopen Shared.Dto.User\nopen Shared.DtoTypes.PhysicalSensor\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\ntype SensorData = {\n Id: int option\n Name: string option\n Latitude: double option\n Longitude: double option\n Altitude: float option\n IsPublic: bool\n State: MapSensorStateDto\n SensorType: SensorType\n TtnSensorSelected: ConfiguredPhysicalSensor option\n UserSelected: UserDto option\n Note: string option\n LastAssignmentDate: DateTime option\n StateSince: DateTimeOffset\n}\n\ntype Model = {\n TtnSensors: ConfiguredPhysicalSensor list\n Sensor: SensorData\n Users: UserDto list\n RequestRunning: bool\n RetrieveCurrentLocationRunning: bool\n}\n\nlet initNew (sensors: ConfiguredPhysicalSensor list) (users: UserDto list) (sensor: ConfiguredPhysicalSensor) =\n let sensorModel = {\n Id = None\n Name = Some sensor.BaseData.Name\n Latitude = Some 0.\n Longitude = Some 0.\n Altitude = None\n IsPublic = false\n State = MapSensorStateDto.Disabled\n SensorType = (SensorType.fromModel sensor.Configuration)\n TtnSensorSelected = Some sensor\n UserSelected = None\n Note = None\n LastAssignmentDate = None\n StateSince = DateTimeOffset.UtcNow\n }\n\n {\n Sensor = sensorModel\n TtnSensors = sensors\n RequestRunning = false\n RetrieveCurrentLocationRunning = false\n Users = users\n }\n\nlet initExisting (sensors: ConfiguredPhysicalSensor list) (users: UserDto list) (sensor: IdValue) =\n let sensorModel =\n let baseSensorData = MapSensor.getBaseData sensor.Value\n\n let ttnSensor =\n Option.map\n (fun eui -> List.tryFind (fun ttnSensor -> ttnSensor.BaseData.DeviceEui = eui) sensors)\n baseSensorData.TtnSensorId\n |> Option.flatten\n\n let user =\n Option.map\n (fun userId -> List.tryFind (fun (user: UserDto) -> user.Id = userId) users)\n baseSensorData.UserId\n |> Option.flatten\n\n {\n Id = Some sensor.Id\n Name = Some baseSensorData.Name\n Latitude = Some baseSensorData.Location.Latitude\n Longitude = Some baseSensorData.Location.Longitude\n Altitude = baseSensorData.Altitude\n IsPublic = baseSensorData.IsPublic\n State = baseSensorData.State\n SensorType = MapSensor.toSensorType sensor.Value\n TtnSensorSelected = ttnSensor\n UserSelected = user\n Note = baseSensorData.Note\n LastAssignmentDate = baseSensorData.LastAssignmentDate\n StateSince = baseSensorData.StateSince\n }\n\n {\n Sensor = sensorModel\n TtnSensors = sensors\n RequestRunning = false\n RetrieveCurrentLocationRunning = false\n Users = users\n }\n\nlet private sensorTypeToString (type_: SensorType) =\n match type_ with\n | SensorType.Air -> \"Luft\"\n | SensorType.Soil -> \"Boden\"\n | SensorType.RainFall -> \"Regenmenge\"\n | SensorType.LeafletMoisture -> \"Blattnässe\"\n | SensorType.PH -> \"PH\"\n | SensorType.WindAverage -> \"Wind Durchschnitt\"\n | SensorType.WeatherStation -> \"Wetterstation\"\n | SensorType.LiquidLevel -> \"Füllstand\"\n | SensorType.SolarRadiation -> \"Globalstrahlung\"\n\nlet private sensorTypeFromString (type_: string) =\n match type_ with\n | \"Luft\" -> SensorType.Air\n | \"Boden\" -> SensorType.Soil\n | \"Regenmenge\" -> SensorType.RainFall\n | \"Blattnässe\" -> SensorType.LeafletMoisture\n | \"PH\" -> SensorType.PH\n | \"Wind Durchschnitt\" -> SensorType.WindAverage\n | \"Wetterstation\" -> SensorType.WeatherStation\n | \"Füllstand\" -> SensorType.LiquidLevel\n | \"Globalstrahlung\" -> SensorType.SolarRadiation\n | _ -> failwithf \"Unknown Sensor Type '%s'\" type_\n\nlet sensorTypeToOption (type_: SensorType) =\n let sensorType = sensorTypeToString type_\n\n option [ Value sensorType ] [ str sensorType ]\n\nlet sensorTypeSelect (isExisting: bool) (selected: SensorType) dispatch =\n let types = [\n SensorType.Air\n SensorType.Soil\n SensorType.RainFall\n SensorType.LeafletMoisture\n SensorType.PH\n SensorType.WindAverage\n SensorType.WeatherStation\n SensorType.LiquidLevel\n SensorType.SolarRadiation\n ]\n\n let options = List.map sensorTypeToOption types\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(sensorTypeToString selected)\n Disabled isExisting\n OnChange(fun event ->\n dispatch (\n sensorTypeFromString event.Value\n |> MapSensorListMsg.SelectedSensorTypeUpdated\n |> MapSensorList\n )\n )\n ]\n options\n ]\n\n\nlet physicalSensorToOption (sensor: ConfiguredPhysicalSensor) =\n option [ Value sensor.BaseData.DeviceEui ] [ str sensor.BaseData.Name ]\n\nlet physicalSensorSelect (selected: ConfiguredPhysicalSensor option) (list: ConfiguredPhysicalSensor list) dispatch =\n let options =\n option [ Value \"\" ] [ str \"-\" ] :: List.map physicalSensorToOption list\n\n let findSensor =\n fun selectedDeviceEui ->\n List.tryFind (fun (sensor: ConfiguredPhysicalSensor) -> sensor.BaseData.DeviceEui = selectedDeviceEui) list\n\n let selectedValue =\n Option.map (fun sensor -> sensor.BaseData.DeviceEui) selected\n |> Option.defaultValue \"\"\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue selectedValue\n OnChange(fun event ->\n dispatch (\n findSensor event.Value\n |> MapSensorListMsg.SelectedSensorUpdated\n |> MapSensorList\n )\n )\n ]\n options\n ]\n\nlet private locationSuccessCallback dispatch (location: Position) =\n MapSensorListMsg.CurrentLocationReceived location |> MapSensorList |> dispatch\n\nlet private locationErrorCallback dispatch (error: PositionError) =\n MapSensorListMsg.CurrentLocationFailed error |> MapSensorList |> dispatch\n\nlet private deviceLocationOnClick dispatch geolocation =\n DeviceLocation.request (locationSuccessCallback dispatch) (locationErrorCallback dispatch) geolocation\n\nlet private sensorStateToString (state: MapSensorStateDto) =\n match state with\n | MapSensorStateDto.Active -> \"Aktiv\"\n | MapSensorStateDto.Disabled -> \"Deaktiviert\"\n | MapSensorStateDto.Defective -> \"Defekt\"\n\nlet private sensorStateFromString (state: string) =\n match state with\n | \"Aktiv\" -> MapSensorStateDto.Active\n | \"Deaktiviert\" -> MapSensorStateDto.Disabled\n | \"Defekt\" -> MapSensorStateDto.Defective\n | _ -> failwithf \"Unknown Sensor State '%s'\" state\n\nlet sensorStateToOption (state: MapSensorStateDto) =\n let sensorType = sensorStateToString state\n\n option [ Value sensorType ] [ str sensorType ]\n\nlet private stateSelect dispatch (selected: MapSensorStateDto) =\n let types = [\n MapSensorStateDto.Active\n MapSensorStateDto.Disabled\n MapSensorStateDto.Defective\n ]\n\n let options = List.map sensorStateToOption types\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(sensorStateToString selected)\n OnChange(fun event ->\n dispatch (\n sensorStateFromString event.Value\n |> MapSensorListMsg.SelectedStateUpdated\n |> MapSensorList\n )\n )\n ]\n options\n ]\n\nlet form dispatch (model: Model) =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Name\" ]\n Control.div [] [\n Input.text [\n Input.Placeholder \"MS-TL0815\"\n model.Sensor.Name |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> MapSensorListMsg.SensorNameUpdated\n |> MapSensorList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Breitengrad\" ]\n Control.div [] [\n Input.number [\n Input.Placeholder \"47.155999194351715\"\n model.Sensor.Latitude |> Inputs.optionalDoubleToString |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> Inputs.toDoubleOption\n |> MapSensorListMsg.LatitudeUpdated\n |> MapSensorList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Längengrad\" ]\n Control.div [] [\n Input.number [\n Input.Placeholder \"15.649259567260742\"\n model.Sensor.Longitude |> Inputs.optionalDoubleToString |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> Inputs.toDoubleOption\n |> MapSensorListMsg.LongitudeUpdated\n |> MapSensorList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Höhe über Meeresspiegel [m]\" ]\n Control.div [] [\n Input.number [\n Input.Placeholder \"400\"\n model.Sensor.Altitude |> Inputs.optionalDoubleToString |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> Inputs.toDoubleOption\n |> MapSensorListMsg.AltitudeUpdated\n |> MapSensorList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Control.div [] [\n Button.button [\n Button.IsLoading model.RetrieveCurrentLocationRunning\n Button.Color Color.IsLink\n match navigator.geolocation with\n | Some geolocation ->\n Button.OnClick(fun event ->\n event.preventDefault ()\n dispatch (MapSensorList MapSensorListMsg.CurrentLocationRequested)\n deviceLocationOnClick dispatch geolocation\n )\n | None -> Button.Disabled true\n ] [ str \"Aktuellen Standort übernehmen\" ]\n ]\n ]\n Field.div [] [\n Checkbox.checkbox [] [\n Checkbox.input [\n Props [\n Checked model.Sensor.IsPublic\n OnChange(fun _ ->\n not model.Sensor.IsPublic\n |> MapSensorListMsg.IsPublicUpdated\n |> MapSensorList\n |> dispatch\n )\n ]\n ]\n str \" Sensor öffentlich sichtbar\"\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Status\" ]\n Control.div [ Control.IsExpanded ] [ stateSelect dispatch model.Sensor.State ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Sensor Typ\" ]\n Control.div [ Control.IsExpanded ] [\n sensorTypeSelect (Option.isSome model.Sensor.Id) model.Sensor.SensorType dispatch\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Physikalischer Sensor\" ]\n Control.div [ Control.IsExpanded ] [\n physicalSensorSelect model.Sensor.TtnSensorSelected model.TtnSensors dispatch\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Benutzer\" ]\n Control.div [ Control.IsExpanded ] [\n UserSelect.view\n (MapSensorListMsg.SelectedUserUpdated >> MapSensorList >> dispatch)\n model.Sensor.UserSelected\n model.Users\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Interne Notiz\" ]\n Control.div [] [\n Input.text [\n model.Sensor.Note |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> MapSensorListMsg.NoteUpdated\n |> MapSensorList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Datum letzte Benutzer-Zuweisung\" ]\n Control.div [] [\n Input.text [\n Input.Disabled true\n model.Sensor.LastAssignmentDate\n |> Option.map DateTime.toDateString\n |> Option.defaultValue \"-\"\n |> Input.Value\n ]\n ]\n ]\n ]\n\nlet private createUpdateMapSensor\n (id: int)\n (name: string)\n (location: Location)\n (altitude: float option)\n (isPublic: bool)\n (state: MapSensorStateDto)\n (sensorType: SensorType)\n (selectedTtnSensor: ConfiguredPhysicalSensor option)\n (selectedUser: UserDto option)\n (note: string option)\n (lastAssignmentDate: DateTime option)\n (stateSince: DateTimeOffset)\n =\n\n let baseData = {\n Name = name\n IsPublic = isPublic\n State = state\n Location = location\n Altitude = altitude\n TtnSensorId = Option.map (fun selected -> selected.BaseData.DeviceEui) selectedTtnSensor\n UserId = Option.map (fun (selected: UserDto) -> selected.Id) selectedUser\n Note = note\n LastAssignmentDate = lastAssignmentDate\n StateSince = stateSince\n }\n\n let sensorData =\n match sensorType with\n | SensorType.Air -> MapSensorDto.Air baseData\n | SensorType.Soil ->\n MapSensorDto.Soil {\n Base = baseData\n WetLimit = None\n DryLimit = None\n }\n | SensorType.RainFall -> MapSensorDto.RainFall baseData\n | SensorType.LeafletMoisture -> MapSensorDto.LeafletMoisture baseData\n | SensorType.PH -> MapSensorDto.PH baseData\n | SensorType.WindAverage -> MapSensorDto.WindAverage baseData\n | SensorType.WeatherStation -> MapSensorDto.WeatherStation baseData\n | SensorType.LiquidLevel -> MapSensorDto.LiquidLevel baseData\n | SensorType.SolarRadiation -> MapSensorDto.SolarRadiation baseData\n\n IdValue.create id sensorData\n\n\nlet createUpdateSensorMsg\n id\n maybeName\n maybeLatitude\n maybeLongitude\n altitude\n isPublic\n isDisabled\n sensorType\n selectedTtnSensor\n selectedUser\n note\n (lastAssignmentDate: DateTime option)\n (stateSince: DateTimeOffset)\n =\n let maybeLocation =\n Option.map2\n (fun latitude longitude -> {\n Latitude = latitude\n Longitude = longitude\n })\n maybeLatitude\n maybeLongitude\n\n Option.map2\n (fun name location ->\n createUpdateMapSensor\n id\n name\n location\n altitude\n isPublic\n isDisabled\n sensorType\n selectedTtnSensor\n selectedUser\n note\n lastAssignmentDate\n stateSince\n )\n maybeName\n maybeLocation\n |> Option.map MapSensorListMsg.UpdateSensor\n\nlet private createCreateMapSensor\n (name: string)\n (location: Location)\n (altitude: float option)\n (isPublic: bool)\n (state: MapSensorStateDto)\n (sensorType: SensorType)\n (selectedTtnSensor: ConfiguredPhysicalSensor option)\n (selectedUser: UserDto option)\n (note: string option)\n (lastAssignmentDate: DateTime option)\n =\n\n let baseData = {\n Name = name\n IsPublic = isPublic\n State = state\n Location = location\n Altitude = altitude\n TtnSensorId = Option.map (fun selected -> selected.BaseData.DeviceEui) selectedTtnSensor\n UserId = Option.map (fun (selected: UserDto) -> selected.Id) selectedUser\n Note = note\n LastAssignmentDate = lastAssignmentDate\n StateSince = DateTimeOffset.UtcNow\n }\n\n match sensorType with\n | SensorType.Air -> MapSensorDto.Air baseData\n | SensorType.Soil ->\n MapSensorDto.Soil {\n Base = baseData\n WetLimit = None\n DryLimit = None\n }\n | SensorType.RainFall -> MapSensorDto.RainFall baseData\n | SensorType.LeafletMoisture -> MapSensorDto.LeafletMoisture baseData\n | SensorType.PH -> MapSensorDto.PH baseData\n | SensorType.WindAverage -> MapSensorDto.WindAverage baseData\n | SensorType.WeatherStation -> MapSensorDto.WeatherStation baseData\n | SensorType.LiquidLevel -> MapSensorDto.LiquidLevel baseData\n | SensorType.SolarRadiation -> MapSensorDto.SolarRadiation baseData\n\n\nlet createCreateSensorMsg\n maybeName\n maybeLatitude\n maybeLongitude\n altitude\n isPublic\n isDisabled\n sensorType\n selectedTtnSensor\n selectedUser\n note\n lastAssignmentDate\n =\n Option.map3\n (fun name latitude longitude ->\n let location = {\n Latitude = latitude\n Longitude = longitude\n }\n\n createCreateMapSensor\n name\n location\n altitude\n isPublic\n isDisabled\n sensorType\n selectedTtnSensor\n selectedUser\n note\n lastAssignmentDate\n )\n maybeName\n maybeLatitude\n maybeLongitude\n |> Option.map MapSensorListMsg.CreateSensor\n\n\nlet saveButton dispatch (model: Model) =\n let maybeOnClick =\n match model.Sensor.Id with\n | Some id ->\n createUpdateSensorMsg\n id\n model.Sensor.Name\n model.Sensor.Latitude\n model.Sensor.Longitude\n model.Sensor.Altitude\n model.Sensor.IsPublic\n model.Sensor.State\n model.Sensor.SensorType\n model.Sensor.TtnSensorSelected\n model.Sensor.UserSelected\n model.Sensor.Note\n model.Sensor.LastAssignmentDate\n model.Sensor.StateSince\n | None ->\n createCreateSensorMsg\n model.Sensor.Name\n model.Sensor.Latitude\n model.Sensor.Longitude\n model.Sensor.Altitude\n model.Sensor.IsPublic\n model.Sensor.State\n model.Sensor.SensorType\n model.Sensor.TtnSensorSelected\n model.Sensor.UserSelected\n model.Sensor.Note\n model.Sensor.LastAssignmentDate\n |> Option.map (fun msg -> Button.OnClick(fun _ -> dispatch (MapSensorList msg)))\n\n let buttonOptions = [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n Button.Disabled(Option.isNone maybeOnClick)\n ]\n\n Button.button (List.addToListIfSome buttonOptions maybeOnClick) [ str \"Speichern\" ]\n\n\nlet view dispatch closeModal (model: Model) =\n let headline =\n if Option.isSome model.Sensor.Id then\n sprintf \"MySens Sensor '%s' bearbeiten\" (Option.defaultValue \"\" model.Sensor.Name)\n else\n sprintf \"Neuen Sensor erstellen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ form dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]\n\nlet update (msg: MapSensorListMsg) (model: Model) =\n match msg with\n | MapSensorListMsg.SelectedSensorUpdated selectedSensor ->\n let newSensor = { model.Sensor with TtnSensorSelected = selectedSensor }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.SelectedUserUpdated selectedUser ->\n let newSensor = {\n model.Sensor with\n UserSelected = selectedUser\n LastAssignmentDate = Some DateTime.Now\n }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.SensorNameUpdated name ->\n let newSensor = { model.Sensor with Name = name }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.IsPublicUpdated isPublic ->\n let newSensor = { model.Sensor with IsPublic = isPublic }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.NoteUpdated note ->\n let newSensor = { model.Sensor with Note = note }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.SelectedStateUpdated state ->\n let newSensor = {\n model.Sensor with\n State = state\n StateSince = DateTimeOffset.UtcNow\n }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.LatitudeUpdated latitude ->\n let newSensor = { model.Sensor with Latitude = latitude }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.LongitudeUpdated longitude ->\n let newSensor = { model.Sensor with Longitude = longitude }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.AltitudeUpdated altitude ->\n let newSensor = { model.Sensor with Altitude = altitude }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.SelectedSensorTypeUpdated sensorType ->\n let newSensor = { model.Sensor with SensorType = sensorType }\n\n { model with Sensor = newSensor }, Cmd.none\n | MapSensorListMsg.CurrentLocationRequested -> { model with RetrieveCurrentLocationRunning = true }, Cmd.none\n | MapSensorListMsg.CurrentLocationFailed error ->\n let toast =\n Toast.create \"Beim Auslesen der GPS Koordinaten ist ein Fehler aufgetreten\"\n |> Toast.error\n\n { model with RetrieveCurrentLocationRunning = false }, toast\n | MapSensorListMsg.CurrentLocationReceived position ->\n let newSensor = {\n model.Sensor with\n Latitude = Some position.coords.latitude\n Longitude = Some position.coords.longitude\n Altitude = position.coords.altitude |> Option.map (Math.round 0)\n }\n\n let toastCmd =\n Toast.create \"GPS Koordinaten erfolgreich übernommen\" |> Toast.success\n\n {\n model with\n Sensor = newSensor\n RetrieveCurrentLocationRunning = false\n },\n toastCmd\n | _ -> model, Cmd.none","module Shared.Domain.SensorType\n\nopen Shared.Dto.Dto\nopen Shared.DtoTypes.PhysicalSensor\n\nlet fromModel (model: SensorModel) =\n match model with\n | LHT65\n | LSN50v2_S31\n | S31_LS\n | S31_LB -> SensorType.Air\n | LSN50v2_Wind\n | SN50v3_LS_Wind\n | SN50v3_LB_Wind -> SensorType.WindAverage\n | LSN50v2_Rain_01mm\n | LSN50v2_Rain_02mm\n | SN50v3_LS_Rain_01mm\n | SN50v3_LS_Rain_02mm\n | SN50v3_LB_Rain_01mm\n | SN50v3_LB_Rain_02mm -> SensorType.RainFall\n | LSE01\n | SE01_LS\n | SE01_LB -> SensorType.Soil\n | LLMS01 -> SensorType.LeafletMoisture\n | LSPH01 -> SensorType.PH\n | WSC1L -> SensorType.WeatherStation\n | DDS20_LB\n | DDS20_LS -> SensorType.LiquidLevel\n | RS485_LB_ZFS_02\n | RS485_LS_ZFS_02 -> SensorType.SolarRadiation","namespace Shared\n\ntype IdValue<'a> = {\n Id: int\n Value: 'a\n}\n\n[]\nmodule IdValue =\n let create id value = {\n Id = id\n Value = value\n }\n\n let map f value = {\n Id = value.Id\n Value = f value.Value\n }\n\n let values (list: IdValue<'a> list) : 'a list = List.map (fun item -> item.Value) list","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Dropdown =\r\n\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n /// Add `is-hoverable` class\r\n | [] IsHoverable\r\n /// Add `is-right` class\r\n | [] IsRight\r\n /// Add `is-up` class\r\n | [] IsUp\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate
      \r\n let dropdown (options: Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsActive state -> if state then result.AddCaseName option else result\r\n | IsRight\r\n | IsHoverable\r\n | IsUp as opt -> result.AddCaseName option\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"dropdown\").ToReactElement(div, children)\r\n\r\n /// Generate
      \r\n let menu (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"dropdown-menu\").ToReactElement(div, children)\r\n\r\n /// Generate
      \r\n let content (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"dropdown-content\").ToReactElement(div, children)\r\n\r\n /// Generate
      \r\n let divider (options: GenericOption list) =\r\n GenericOptions.Parse(options, parseOptions, \"dropdown-divider\").ToReactElement(hr)\r\n\r\n /// Generate
      \r\n let trigger (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"dropdown-trigger\").ToReactElement(div, children)\r\n\r\n module Item =\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let internal item element (options: Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsActive state -> if state then result.AddCaseName option else result\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"dropdown-item\").ToReactElement(element, children)\r\n\r\n /// Generate
      \r\n let div x y = item div x y\r\n\r\n /// Generate \r\n let a x y = item a x y\r\n\r\n /// Generate \r\n let button x y = item button x y\r\n","module Client.Page.Admin.MapSensorList\n\nopen Client\nopen Client.Components.Select\nopen Client.Domain\nopen Client.DomainTypes\nopen Client.Infrastructure\nopen Client.Infrastructure.Api\nopen Client.DomainTypes.Msg\n\nopen Client.Forms\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React.Props\nopen Fulma\nopen Fulma.Extensions.Wikiki\nopen Shared\nopen Shared.Dto\nopen Shared.Dto.Dto\nopen Shared.DtoTypes.PhysicalSensor\nopen Shared.Infrastructure\nopen Fable.React\nopen Shared.Dto.User\nopen Shared.WithLastDate\nopen Thoth.Elmish\nopen System\nopen Zanaptak.TypedCssClasses\n\nFable.Core.JsInterop.importAll \"bulma-tooltip\"\n\ntype FA =\n CssClasses<\"https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css\", Naming.PascalCase>\n\ntype Modal =\n | ChoosePhysicalSensor of ChoosePhysicalSensor.Model\n | MapSensor of MapSensor.Model\n\n\ntype DataModel = {\n MapSensors: WithOptionalLastDate> list\n FilteredMapSensors: WithOptionalLastDate> list\n TtnSensors: ConfiguredPhysicalSensor list\n Users: UserDto list\n SelectedUserFilter: UserDto option\n Modal: Modal option\n Session: UserSession\n}\n\ntype LoadingModel = {\n Session: UserSession\n MySensSensors: WithOptionalLastDate> list option\n TtnSensors: ConfiguredPhysicalSensor list option\n Users: UserDto list option\n}\n\nlet modelLoadingToData (model: LoadingModel) : DataModel option =\n Option.map3\n (fun ttn mapSensors users -> {\n MapSensors = mapSensors\n FilteredMapSensors = mapSensors\n Session = model.Session\n TtnSensors = ttn\n Users = users\n SelectedUserFilter = None\n Modal = None\n })\n model.TtnSensors\n model.MySensSensors\n model.Users\n\ntype Model = Loadable\n\nlet init (session: UserSession) =\n let requestData = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n let cmds =\n Cmd.batch [\n Cmd.OfAsync.perform\n api.getConfiguredTtnSensors\n ()\n (MapSensorListMsg.PhysicalSensorListReceived >> MapSensorList)\n Cmd.OfAsync.perform\n api.getAllMySensSensorsWithOptionalLastDate\n ()\n (MapSensorListMsg.MapSensorListReceived >> MapSensorList)\n Cmd.OfAsync.perform api.getAllUsers requestData (MapSensorListMsg.UsersReceived >> MapSensorList)\n ]\n\n Loadable.Loading {\n MySensSensors = None\n Session = session\n TtnSensors = None\n Users = None\n },\n cmds\n\nlet updateRequestRunningModalState (model: DataModel) (requestRunning: bool) =\n let newModalModel =\n match model.Modal with\n | Some(MapSensor modalModel) ->\n let newModel = { modalModel with RequestRunning = requestRunning }\n\n Some(MapSensor newModel)\n | _ -> model.Modal\n\n { model with Modal = newModalModel }\n\nlet getSortKey (sensor: WithOptionalLastDate>) =\n (MapSensor.getBaseData sensor.Value.Value).Name\n\nlet private belongsToUser (user: UserDto) (sensor: MapSensorDto) =\n match (MapSensor.getBaseData sensor).UserId with\n | Some id -> id = user.Id\n | None -> false\n\nlet update (msg: MapSensorListMsg) (model: Model) : Model * Cmd =\n match msg, model with\n | MapSensorListMsg.PhysicalSensorListReceived sensors, Loadable.Loading loadingModel ->\n let updatedLoadingModel = { loadingModel with TtnSensors = Some sensors }\n\n let newModel =\n modelLoadingToData updatedLoadingModel\n |> Option.map Loadable.Data\n |> Option.defaultValue (Loadable.Loading updatedLoadingModel)\n\n newModel, Cmd.none\n | MapSensorListMsg.MapSensorListReceived sensors, Loadable.Loading loadingModel ->\n let updatedLoadingModel = { loadingModel with MySensSensors = Some(List.sortBy getSortKey sensors) }\n\n let newModel =\n modelLoadingToData updatedLoadingModel\n |> Option.map Loadable.Data\n |> Option.defaultValue (Loadable.Loading updatedLoadingModel)\n\n newModel, Cmd.none\n | MapSensorListMsg.UsersReceived maybeUsers, Loadable.Loading loadingModel ->\n match maybeUsers with\n | Result.Ok users ->\n let updatedLoadingModel = { loadingModel with Users = Some users }\n\n let newModel =\n modelLoadingToData updatedLoadingModel\n |> Option.map Loadable.Data\n |> Option.defaultValue (Loadable.Loading updatedLoadingModel)\n\n newModel, Cmd.none\n | Result.Error msg ->\n let errorMessage =\n match msg with\n | AuthErr Unauthenticated -> \"Sie sind nicht angemeldet? Laden Sie die Seite neu\"\n | AuthErr Unauthorized -> \"Sie düfen nicht die Kartensensoren auflisten\"\n | CustomErr error -> error\n\n let toastCmd =\n Toast.create errorMessage |> Toast.title \"Fehler beim User laden\" |> Toast.error\n\n model, toastCmd\n\n | MapSensorListMsg.CloseModal, Loadable.Data data -> Loadable.Data { data with Modal = None }, Cmd.none\n | MapSensorListMsg.OpenModal maybeSensor, Loadable.Data data ->\n let modal, cmd =\n match maybeSensor with\n | Some sensor ->\n let modalModel = MapSensor.initExisting data.TtnSensors data.Users sensor\n\n MapSensor modalModel, Cmd.none\n | None ->\n let modalModel, cmd = ChoosePhysicalSensor.init data.Session\n\n ChoosePhysicalSensor modalModel, cmd\n\n Loadable.Data { data with Modal = Some modal },\n\n Cmd.map MapSensorList cmd\n | MapSensorListMsg.SensorUpdated response, Loadable.Data data ->\n match response with\n | Ok(Some updatedSensor) ->\n let toastCmd = Toast.create \"Der Sensor wurde erfolgreich geändert\" |> Toast.success\n\n let newSensorList =\n List.filteredMap\n (fun (sensor: WithOptionalLastDate>) -> sensor.Value.Id = updatedSensor.Id)\n (fun sensor -> { sensor with Value = updatedSensor })\n data.MapSensors\n\n Loadable.Data {\n data with\n MapSensors = newSensorList\n Modal = None\n },\n toastCmd\n | _ ->\n let toastCmd = Toast.create \"Die Änderung ist fehlgeschlagen\" |> Toast.error\n\n Loadable.Data(updateRequestRunningModalState data false), toastCmd\n | MapSensorListMsg.SensorCreated response, Loadable.Data data ->\n match response with\n | Ok(Some newSensor) ->\n let toastCmd = Toast.create \"Der Sensor wurde erfolgreich erstellt\" |> Toast.success\n\n let newSensor = {\n LastDate = None\n Value = newSensor\n }\n\n let newSensorList =\n List.sortBy\n (fun (sensor: WithOptionalLastDate>) ->\n (MapSensor.getBaseData sensor.Value.Value).Name\n )\n (newSensor :: data.MapSensors)\n\n Loadable.Data {\n data with\n MapSensors = newSensorList\n Modal = None\n },\n toastCmd\n | _ ->\n let toastCmd = Toast.create \"Das Erstellen ist fehlgeschlagen\" |> Toast.error\n\n Loadable.Data(updateRequestRunningModalState data false), toastCmd\n | MapSensorListMsg.UpdateSensor sensor, Loadable.Data data ->\n let requestData = {\n Data = sensor\n SessionKey = data.Session.SessionKey\n }\n\n Loadable.Data(updateRequestRunningModalState data true),\n Cmd.OfAsync.perform api.updateMapSensor requestData (MapSensorListMsg.SensorUpdated >> MapSensorList)\n | MapSensorListMsg.CreateSensor newSensor, Loadable.Data data ->\n let requestData = {\n Data = newSensor\n SessionKey = data.Session.SessionKey\n }\n\n Loadable.Data(updateRequestRunningModalState data true),\n Cmd.OfAsync.perform api.createMapSensor requestData (MapSensorListMsg.SensorCreated >> MapSensorList)\n | MapSensorListMsg.DeleteSensor id, _ ->\n model,\n Cmd.OfAsync.perform\n api.deleteMySensSensor\n id\n ((fun success -> id, success) >> MapSensorListMsg.SensorDeleted >> MapSensorList)\n | MapSensorListMsg.SensorDeleted(deletedId, success), Loadable.Data data ->\n if success then\n let toastCmd = Toast.create \"Sensor erfolgreich gelöscht\" |> Toast.success\n\n let newSensorList =\n List.filter\n (fun (sensor: WithOptionalLastDate>) -> sensor.Value.Id <> deletedId)\n data.MapSensors\n\n Loadable.Data {\n data with\n MapSensors = newSensorList\n Modal = None\n },\n toastCmd\n else\n let toastCmd = Toast.create \"Fehler beim Löschen des Sensors\" |> Toast.error\n\n model, toastCmd\n | MapSensorListMsg.ChoosePhysicalSensorForm choosePhysicalSensorFormMsg, Loadable.Data data ->\n match choosePhysicalSensorFormMsg, data.Modal with\n | Forward sensor, _ ->\n let model = MapSensor.initNew data.TtnSensors data.Users sensor\n\n Loadable.Data { data with Modal = Some(MapSensor model) }, Cmd.none\n | _, Some(ChoosePhysicalSensor modalData) ->\n ChoosePhysicalSensor.update choosePhysicalSensorFormMsg modalData\n |> fun (modal, cmd) ->\n Loadable.Data { data with Modal = Some(ChoosePhysicalSensor modal) }, Cmd.map MapSensorList cmd\n | _, _ -> model, Cmd.none\n | MapSensorListMsg.UserFilterChanged userFilter, Loadable.Data dataModel ->\n let filteredSensors =\n match userFilter with\n | Some user ->\n dataModel.MapSensors\n |> List.filter (fun sensor -> belongsToUser user sensor.Value.Value)\n | None -> dataModel.MapSensors\n\n Loadable.Data {\n dataModel with\n SelectedUserFilter = userFilter\n FilteredMapSensors = filteredSensors\n },\n Cmd.none\n | _, Loadable.Data data ->\n let result =\n match data.Modal with\n | Some(MapSensor modal) -> MapSensor.update msg modal |> (fun (modal, cmd) -> Some(MapSensor modal), cmd)\n | _ -> None, Cmd.none\n\n Loadable.Data { data with Modal = fst result }, snd result\n | _, _ -> model, Cmd.none\n\nlet private getTotalMinutesLimit (sensorType: SensorModel) =\n match sensorType with\n | WSC1L -> 15.0\n | LHT65\n | LSN50v2_S31\n | S31_LS\n | S31_LB\n | LSN50v2_Rain_01mm\n | LSN50v2_Rain_02mm\n | SN50v3_LS_Rain_01mm\n | SN50v3_LS_Rain_02mm\n | SN50v3_LB_Rain_01mm\n | SN50v3_LB_Rain_02mm\n | LSN50v2_Wind\n | SN50v3_LS_Wind\n | SN50v3_LB_Wind\n | DDS20_LB\n | DDS20_LS -> 30.0\n | LSE01\n | SE01_LS\n | SE01_LB\n | LLMS01\n | LSPH01\n | RS485_LB_ZFS_02\n | RS485_LS_ZFS_02 -> 50.0\n\nlet getIconForSensor\n (maybeTtnSensor: ConfiguredPhysicalSensor option)\n (sensor: WithOptionalLastDate>)\n =\n let toolTip, icon =\n match maybeTtnSensor with\n | Some ttnSensor ->\n let totalTimeLimit = getTotalMinutesLimit ttnSensor.Configuration\n\n let isOldAge =\n match sensor.LastDate with\n | None -> true\n | Some lastDate ->\n let elapsedMinutes = (DateTimeOffset.UtcNow - lastDate).TotalMinutes\n\n elapsedMinutes > totalTimeLimit\n\n match (MapSensor.getBaseData sensor.Value.Value).State, isOldAge with\n | Disabled, _ -> Some \"Sensor ist deaktiviert\", Fa.Solid.Ban\n | Active, true -> Some \"Daten sind veraltet\", Fa.Solid.Hourglass\n | Active, false -> None, Fa.Solid.Check\n | Defective, _ -> Some \"Sensor ist defekt\", Fa.Solid.ExclamationCircle\n | None -> Some \"Kein physikalischer Sensor zugeordnet\", Fa.Solid.QuestionCircle\n\n\n td [\n match toolTip with\n | Some text ->\n classList [ (Tooltip.ClassName, true) ]\n Tooltip.dataTooltip text\n | None -> ()\n ] [ Fa.span [ icon ] [] ]\n\nlet private createDropdownItem (dispatch: Msg -> unit) (icon: Fa.IconOption) (label: string) (onClickMsg: Msg) =\n Dropdown.Item.a [\n Dropdown.Item.Props [\n Clickable.onClickPreventDefault (fun _ -> dispatch onClickMsg) |> OnClick\n ]\n ] [\n Icon.icon [ Icon.Size IsMedium ] [ Fa.i [ icon ] [] ]\n\n span [] [ str label ]\n ]\n\nlet private createSensorDropdownMenu\n (dispatch: Msg -> unit)\n (sensor: WithOptionalLastDate>)\n (position: Location)\n =\n let createItem = createDropdownItem dispatch\n\n let dropDownItems = [\n createItem Fa.Solid.Edit \"Bearbeiten\" (MapSensorListMsg.OpenModal(Some sensor.Value) |> MapSensorList)\n createItem\n Fa.Solid.Cog\n \"Einstellungen\"\n (Clickable.goToRouteMsg (Route.UserDefinedMapSensorProperties sensor.Value.Id))\n createItem Fa.Solid.Search \"Detail-Seite\" (Clickable.goToRouteMsg (Route.MySensSensor sensor.Value.Id))\n createItem Fa.Solid.Globe \"Zur Karte\" (Clickable.goToRouteMsg (Route.SensorMap(Some position)))\n createItem Fa.Solid.TrashAlt \"Löschen\" (MapSensorListMsg.DeleteSensor sensor.Value.Id |> MapSensorList)\n ]\n\n Dropdown.dropdown [ Dropdown.IsHoverable; Dropdown.IsRight ] [\n Dropdown.trigger [] [\n Button.button [] [\n Icon.icon [ Icon.Size IsSmall ] [ Fa.i [ Fa.Solid.Cog ] [] ]\n ]\n ]\n Dropdown.menu [] [ Dropdown.content [] (dropDownItems) ]\n ]\n\nlet sensorToRow\n dispatch\n (ttnSensors: ConfiguredPhysicalSensor list)\n (users: UserDto list)\n (index: int)\n (sensor: WithOptionalLastDate>)\n =\n let findSensor =\n fun selectedDeviceEui ->\n List.tryFind\n (fun (sensor: ConfiguredPhysicalSensor) -> sensor.BaseData.DeviceEui = selectedDeviceEui)\n ttnSensors\n\n let baseData = (MapSensor.getBaseData sensor.Value.Value)\n\n let ttnSensor = Option.map findSensor baseData.TtnSensorId |> Option.flatten\n\n let findUser =\n fun userId -> List.tryFind (fun (user: UserDto) -> user.Id = userId) users\n\n let icon = getIconForSensor ttnSensor sensor\n\n let lastDateString =\n sensor.LastDate\n |> Option.map TimeSpan.createTimeSinceString\n |> Option.defaultValue \"\"\n\n let lastAssignmentDateString =\n baseData.LastAssignmentDate\n |> Option.map DateTime.toDateString\n |> Option.map (sprintf \" (%s)\")\n |> Option.defaultValue \"\"\n\n let lastDateTooltip =\n sensor.LastDate\n |> Option.map (fun date -> date.LocalDateTime)\n |> Option.map (fun date -> sprintf \"%s (%s)\" (DateTime.toDayMonthString date) (DateTime.toTimeString date))\n |> Option.map Tooltip.dataTooltip\n\n let stateSinceString =\n baseData.StateSince |> DateTimeOffset.toLocalDateTime |> DateTime.toShortString\n\n let lastDateCellProps =\n [\n classList [\n (Tooltip.ClassName, (Option.isSome lastDateTooltip))\n (\"last_date\", true)\n ]\n :> IHTMLProp\n |> Some\n Option.map (fun date -> date :> IHTMLProp) lastDateTooltip\n ]\n |> List.choose id\n\n let sensorHasLocation =\n if baseData.Location.Latitude <> 0 && baseData.Location.Longitude <> 0 then\n \"Ja\"\n else\n \"Nein\"\n\n let physicalSensorName =\n ttnSensor\n |> Option.map (fun ttnSensor -> ttnSensor.BaseData.Name)\n |> Option.defaultValue \"\"\n\n tr [] [\n td [] [ Table.rowIndexString index ]\n icon\n td [] [ str baseData.Name ]\n td [] [ baseData.Note |> Option.defaultValue \"\" |> str ]\n td [] [ str sensorHasLocation ]\n td [] [ str (Bool.toUserString baseData.IsPublic) ]\n td lastDateCellProps [ str lastDateString ]\n td [] [ str physicalSensorName ]\n td [] [\n Option.map findUser baseData.UserId\n |> Option.flatten\n |> Option.map getFullName\n |> Option.defaultValue \"\"\n |> str\n str lastAssignmentDateString\n ]\n td [] [ str stateSinceString ]\n td [] [\n createSensorDropdownMenu dispatch sensor baseData.Location\n ]\n ]\n\nlet sensorListToTable\n dispatch\n (ttnSensors: ConfiguredPhysicalSensor list)\n (users: UserDto list)\n (sensors: WithOptionalLastDate> list)\n =\n Table.table [\n Table.CustomClass \"table-auto\"\n Table.IsBordered\n Table.IsFullWidth\n Table.IsStriped\n Table.Modifiers [\n Modifier.Spacing(Spacing.MarginBottom, Spacing.Is6)\n ]\n ] [\n thead [] [\n tr [] [\n th [] [ str \"#\" ]\n th [] []\n th [] [ str \"Name\" ]\n th [] [ str \"Notizen\" ]\n th [] [ str \"Hat GPS-Position?\" ]\n th [] [ str \"Sensor ist öffentlich\" ]\n th [ classList [ (\"last_date\", true) ] ] [ str \"Letzte Aktual.\" ]\n th [] [ str \"Physikalischer Sensor\" ]\n th [] [ str \"Benutzer\" ]\n th [] [ str \"Status seit\" ]\n th [] []\n ]\n ]\n tbody [] (List.mapi (sensorToRow dispatch ttnSensors users) sensors)\n ]\n\nlet createNewSensorButton dispatch =\n Button.button [\n Button.Color IsLink\n Button.OnClick(fun _ -> dispatch (MapSensorList <| MapSensorListMsg.OpenModal None))\n ] [ str \"Neuen Sensor erstellen\" ]\n\nlet tableHeader dispatch (selectedUser: UserDto option) (users: UserDto list) =\n Level.level [] [\n Level.left [] [\n Level.item [] [\n form [] [\n Field.div [] [\n Label.label [] [ str \"Nach Benutzer filtern\" ]\n Control.div [] [\n UserSelect.view\n (MapSensorListMsg.UserFilterChanged >> MapSensorList >> dispatch)\n selectedUser\n users\n ]\n ]\n ]\n ]\n ]\n Level.right [] [\n Level.item [] [\n Field.div [] [\n Control.div [] [ createNewSensorButton dispatch ]\n ]\n ]\n ]\n ]\n\nlet private dataView dispatch (data: DataModel) =\n let closeModal = (fun _ -> dispatch (MapSensorListMsg.CloseModal |> MapSensorList))\n\n let table =\n sensorListToTable dispatch data.TtnSensors data.Users data.FilteredMapSensors\n\n let modal =\n match data.Modal with\n | Some(ChoosePhysicalSensor modal) -> ChoosePhysicalSensor.view dispatch closeModal modal\n | Some(MapSensor modal) -> MapSensor.view dispatch closeModal modal\n | None -> div [] []\n\n Container.container [ Container.IsFluid ] [\n Heading.h1 [] [ str \"Karten Sensoren Liste\" ]\n tableHeader dispatch data.SelectedUserFilter data.Users\n (Table.scrollableTable table)\n modal\n ]\n\nlet view (model: Model) dispatch = Loadable.view (dataView dispatch) model","namespace Shared.Infrastructure\n\nopen System\n\n[]\nmodule DateTimeOffset =\n let roundDownToNearest (timeSpan: TimeSpan) (dateTime: DateTimeOffset) =\n let delta = dateTime.Ticks % timeSpan.Ticks\n\n DateTimeOffset(dateTime.Ticks - delta, dateTime.Offset)\n\n let roundDownToPrevious (timeSpan: TimeSpan) (dateTime: DateTimeOffset) =\n let delta =\n match dateTime.Ticks % timeSpan.Ticks with\n | 0L -> timeSpan.Ticks\n | x -> x\n\n DateTimeOffset(dateTime.Ticks - delta, dateTime.Offset)\n\n let roundUpToNearest (timeSpan: TimeSpan) (dateTime: DateTimeOffset) =\n let delta = dateTime.Ticks % timeSpan.Ticks\n\n DateTimeOffset(dateTime.Ticks + (timeSpan.Ticks - delta), dateTime.Offset)\n\n let getDateTimesBetween (timeSpan: TimeSpan) (startDate: DateTimeOffset) (endDate: DateTimeOffset) =\n let first = roundDownToNearest timeSpan endDate\n\n if startDate > first then\n []\n else\n Seq.initInfinite (fun idx -> first - (timeSpan.Multiply idx))\n |> Seq.takeWhile (fun dateTime -> startDate < dateTime)\n |> Seq.rev\n |> Seq.toList\n\n let tryParse (timestamp: string) : DateTimeOffset option =\n match DateTimeOffset.TryParse(timestamp) with\n | true, timestamp -> Some timestamp\n | false, _ -> None\n\n let getStartOfDay (currentDateTime: DateTimeOffset) =\n let start = currentDateTime.Date\n\n DateTimeOffset(start, currentDateTime.Offset)\n\n\n let startOfDay (date: DateTimeOffset) = DateTimeOffset(date.Date, date.Offset)\n\n let endOfDay (date: DateTimeOffset) =\n DateTimeOffset(date.Date.AddHours(23.).AddMinutes(59.), date.Offset)\n\n let addMinutes (hours: int) (date: DateTimeOffset) = date.AddMinutes(float hours)\n let addHours (hours: int) (date: DateTimeOffset) = date.AddHours(float hours)\n let addDays (days: int) (date: DateTimeOffset) = date.AddDays(float days)\n\n let removeDays (days: int) (date: DateTimeOffset) = addDays (-days) date\n\n let addMonths (months: int) (date: DateTimeOffset) = date.AddMonths(months)\n\n let removeMonths (months: int) (date: DateTimeOffset) = addMonths (-months) date\n\n let addYears (years: int) (date: DateTimeOffset) = date.AddYears(years)\n\n let removeYears (years: int) (date: DateTimeOffset) = addYears (-years) date\n\n let toLocalDateTime (timestamp: DateTimeOffset) : DateTime = timestamp.LocalDateTime\n\n let toTicks (timestamp: DateTimeOffset) : double = timestamp.ToUnixTimeSeconds() |> double","namespace Shared.Infrastructure\n\n\n[]\nmodule Bool =\n let fromConfigurationString boolString =\n match boolString with\n | \"true\"\n | \"1\" -> true\n | \"false\"\n | \"0\" -> false\n | _ -> failwithf \"Unknown configuration boolean '%s'\" boolString\n\n let toUserString bool = if bool then \"Ja\" else \"Nein\"","[]\nmodule Client.Components.Modal\n\nopen Browser.Types\nopen Fable.React\nopen Fulma\n\ntype ModalProps = {\n OnClose: MouseEvent -> unit\n Headline: string\n Body: ReactElement list\n Footer: ReactElement list\n}\n\nlet create = {\n OnClose = fun _ -> ()\n Headline = \"\"\n Body = []\n Footer = []\n}\n\nlet onClose (f: MouseEvent -> unit) props = { props with OnClose = f }\n\nlet headline (headline: string) props = { props with Headline = headline }\n\nlet body (body: ReactElement list) props = { props with Body = body }\n\nlet footer (footer: ReactElement list) props = { props with Footer = footer }\n\nlet view (props: ModalProps) =\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str props.Headline ]\n Delete.delete [ Delete.OnClick props.OnClose ] []\n ]\n Modal.Card.body [] [ Content.content [] props.Body ]\n Modal.Card.foot [] props.Footer\n ]\n ]","module Client.Forms.Gateway\n\nopen Client.Components\nopen Client.Components.Select\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fulma\nopen Shared\nopen Fable.React\nopen Shared.Dto.MySensGateway\nopen Shared.Dto.User\nopen Shared.Infrastructure\n\n\ntype GatewayData = {\n ExistingGateway: IdValue\n Note: string option\n Latitude: double option\n Longitude: double option\n UserSelected: UserDto option\n}\n\ntype Model = {\n Gateway: GatewayData\n Users: UserDto list\n RequestRunning: bool\n}\n\nlet init (users: UserDto list) (gateway: IdValue) =\n let gatewayData =\n let user =\n Option.map (fun userId -> List.tryFind (fun (user: UserDto) -> user.Id = userId) users) gateway.Value.UserId\n |> Option.flatten\n\n {\n ExistingGateway = gateway\n Note = gateway.Value.Note\n Latitude = gateway.Value.Latitude\n Longitude = gateway.Value.Longitude\n UserSelected = user\n }\n\n {\n Gateway = gatewayData\n RequestRunning = false\n Users = users\n }\n\nlet form dispatch (model: Model) =\n let optionalDoubleToString =\n fun maybeDouble -> Option.map string maybeDouble |> Option.defaultValue \"\"\n\n form [] [\n Field.div [] [\n Label.label [] [ str \"Notiz\" ]\n Control.div [] [\n Input.text [\n model.Gateway.Note |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> GatewayListMsg.NoteUpdated\n |> GatewayList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Breitengrad\" ]\n Control.div [] [\n Input.number [\n Input.Placeholder \"47.155999194351715\"\n model.Gateway.Latitude |> optionalDoubleToString |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> Inputs.toDoubleOption\n |> GatewayListMsg.LatitudeUpdated\n |> GatewayList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Längengrad\" ]\n Control.div [] [\n Input.number [\n Input.Placeholder \"15.649259567260742\"\n model.Gateway.Longitude |> optionalDoubleToString |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> Inputs.toDoubleOption\n |> GatewayListMsg.LongitudeUpdated\n |> GatewayList\n |> dispatch\n )\n ]\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Benutzer\" ]\n Control.div [ Control.IsExpanded ] [\n UserSelect.view\n (GatewayListMsg.SelectedUserUpdated >> GatewayList >> dispatch)\n model.Gateway.UserSelected\n model.Users\n ]\n ]\n ]\n\nlet createUpdateGatewayMsg\n (existingGateway: IdValue)\n (note: string option)\n (latitude: float option)\n (longitude: float option)\n (selectedUser: UserDto option)\n =\n let newGatewayData = {\n existingGateway.Value with\n Note = note\n Latitude = latitude\n Longitude = longitude\n UserId = Option.map (fun (selected: UserDto) -> selected.Id) selectedUser\n }\n\n GatewayListMsg.UpdateGateway { existingGateway with Value = newGatewayData }\n\n\nlet saveButton dispatch (model: Model) =\n let msg =\n createUpdateGatewayMsg\n model.Gateway.ExistingGateway\n model.Gateway.Note\n model.Gateway.Latitude\n model.Gateway.Longitude\n model.Gateway.UserSelected\n\n let buttonOptions = [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n Button.OnClick(fun _ -> dispatch (GatewayList msg))\n ]\n\n Button.button buttonOptions [ str \"Speichern\" ]\n\n\nlet view dispatch (model: Model) =\n let closeModal = (fun _ -> dispatch (GatewayListMsg.CloseModal |> GatewayList))\n\n let headline =\n sprintf \"MySens Gateway '%s' bearbeiten\" model.Gateway.ExistingGateway.Value.Name\n\n let body = form dispatch model\n let footer = saveButton dispatch model\n\n let props: Modal.ModalProps = {\n OnClose = closeModal\n Headline = headline\n Body = [ body ]\n Footer = [ footer ]\n }\n\n Modal.view props\n\nlet update (msg: GatewayListMsg) (model: Model) =\n let gatewayData =\n match msg with\n | GatewayListMsg.NoteUpdated note -> { model.Gateway with Note = note }\n | GatewayListMsg.SelectedUserUpdated selectedUser -> { model.Gateway with UserSelected = selectedUser }\n | GatewayListMsg.LatitudeUpdated latitude -> { model.Gateway with Latitude = latitude }\n | GatewayListMsg.LongitudeUpdated longitude -> { model.Gateway with Longitude = longitude }\n | _ -> model.Gateway\n\n { model with Gateway = gatewayData }, Cmd.none","namespace Client.Components\n\ntype StatusDot =\n | Green\n | Red\n | Grey\n\n[]\nmodule StatusDot =\n let private baseUrl = \"/images/status-dot\"\n\n let toImageUrl (dot: StatusDot) =\n let file =\n match dot with\n | Green -> \"dot_green.png\"\n | Red -> \"dot_red.png\"\n | Grey -> \"dot_grey.png\"\n\n sprintf \"%s/%s\" baseUrl file","module Client.Page.Admin.GatewayList\n\nopen System.Collections.Generic\nopen Client\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Domain\nopen Client.Infrastructure\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\n\nopen Client.Forms\nopen Elmish\nopen Fable.React.Props\nopen Fulma\nopen Fulma.Extensions.Wikiki\nopen Shared\nopen Shared.Dto\nopen Shared.Dto.Dto\nopen Shared.Infrastructure\nopen Fable.React\nopen Shared.Dto.Gateways\nopen Shared.Dto.MySensGateway\nopen Shared.Dto.User\nopen Thoth.Elmish\n\ntype Refreshable<'a> =\n | NotLoaded\n | Refreshing\n | Refreshed of 'a\n\ntype GatewayViewModel = {\n Id: int\n Gateway: MySensGateway\n Status: Refreshable\n}\n\nlet private gatewayToViewModel (gateway: IdValue) : GatewayViewModel = {\n Id = gateway.Id\n Gateway = gateway.Value\n Status = Refreshable.NotLoaded\n}\n\ntype DataModel = {\n Gateways: GatewayViewModel list\n Users: UserDto list\n Modal: Gateway.Model option\n RefreshAllGatewayStatsRunning: bool\n TTNRefreshRequestRunning: bool\n TTIRefreshRequestRunning: bool\n Session: UserSession\n}\n\ntype LoadingModel = {\n Session: UserSession\n Gateways: IdValue list option\n Users: UserDto list option\n}\n\nlet modelLoadingToData (model: LoadingModel) : DataModel option =\n Option.map2\n (fun gateways users -> {\n Gateways = List.map gatewayToViewModel gateways\n Session = model.Session\n Users = users\n Modal = None\n RefreshAllGatewayStatsRunning = false\n TTNRefreshRequestRunning = false\n TTIRefreshRequestRunning = false\n })\n model.Gateways\n model.Users\n\ntype Model = Loadable\n\nlet init (session: UserSession) =\n let request = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n let cmds =\n Cmd.batch [\n Cmd.OfAsync.perform api.getAllGateways request (GatewayListMsg.GatewaysReceived >> GatewayList)\n Cmd.OfAsync.perform api.getAllUsers request (GatewayListMsg.UsersReceived >> GatewayList)\n ]\n\n Loadable.Loading {\n Gateways = None\n Session = session\n Users = None\n },\n cmds\n\nlet updateRequestRunningModalState (model: DataModel) (requestRunning: bool) =\n let modalModel = Option.get model.Modal\n\n { model with Modal = Some { modalModel with RequestRunning = requestRunning } }\n\nlet private updateRefreshRequestRunning (model: DataModel) (running: bool) = {\n model with\n TTNRefreshRequestRunning = running\n TTIRefreshRequestRunning = running\n}\n\nlet private replaceGatewayData (gateways: GatewayViewModel list) (updatedGateway: IdValue) =\n gateways\n |> List.map (fun gw ->\n if gw.Id = updatedGateway.Id then\n { gw with Gateway = updatedGateway.Value }\n else\n gw\n )\n\nlet private updateGatewayViewModel (viewModel: GatewayViewModel) (status: GatewayWithStatus) =\n let newStatus = Refreshable.Refreshed status.Status\n\n let newGatewayData =\n match status.Location with\n | Some location -> {\n viewModel.Gateway with\n Latitude = Some location.Latitude\n Longitude = Some location.Longitude\n }\n | None -> viewModel.Gateway\n\n {\n viewModel with\n Status = newStatus\n Gateway = newGatewayData\n }\n\nlet private getStatus (stats: IDictionary) (viewModel: GatewayViewModel) =\n Dict.tryGetValue stats viewModel.Gateway.TtnId\n\nlet private updateAllGatewayWithStatus (gateways: GatewayViewModel list) (stats: GatewayWithStatus list) =\n let dict = Dict.ofList (fun g -> g.TtsId, g) stats\n\n gateways\n |> List.map (fun viewModel -> viewModel, getStatus dict viewModel)\n |> List.map (fun (viewModel, status) ->\n match status with\n | Some status -> updateGatewayViewModel viewModel status\n | None -> viewModel\n )\n\nlet update (msg: GatewayListMsg) (model: Model) : Model * Cmd =\n match msg, model with\n | GatewayListMsg.GatewaysReceived response, Loadable.Loading loadingModel ->\n match response with\n | AuthenticatedResponse.Ok gateways ->\n let updatedLoadingModel = { loadingModel with Gateways = Some gateways }\n\n let newModel =\n modelLoadingToData updatedLoadingModel\n |> Option.map Loadable.Data\n |> Option.defaultValue (Loadable.Loading updatedLoadingModel)\n\n newModel, Cmd.none\n | AuthenticatedResponse.Error _ -> Loadable.Error \"Fehler beim Laden der Gateways\", Cmd.none\n | GatewayListMsg.UsersReceived maybeUsers, Loadable.Loading loadingModel ->\n match maybeUsers with\n | Result.Ok users ->\n let updatedLoadingModel = { loadingModel with Users = Some users }\n\n let newModel =\n modelLoadingToData updatedLoadingModel\n |> Option.map Loadable.Data\n |> Option.defaultValue (Loadable.Loading updatedLoadingModel)\n\n newModel, Cmd.none\n | Result.Error _ -> Loadable.Error \"Fehler beim Laden der Benutzer\", Cmd.none\n | GatewayListMsg.LoadAllGatewayStatus, Loadable.Data dataModel ->\n let ids = dataModel.Gateways |> List.map (fun g -> g.Gateway.TtnId)\n\n let request: AuthenticatedRequest = {\n SessionKey = dataModel.Session.SessionKey\n Data = ids\n }\n\n let cmd =\n Cmd.OfAsync.perform api.loadGatewayStatus request (GatewayListMsg.GatewayStatusReceived >> GatewayList)\n\n Loadable.Data { dataModel with RefreshAllGatewayStatsRunning = true }, cmd\n | GatewayListMsg.GatewayStatusReceived response, Loadable.Data dataModel ->\n match response with\n | AuthenticatedResponse.Ok gatewayStats ->\n let newModel = {\n dataModel with\n Gateways = updateAllGatewayWithStatus dataModel.Gateways gatewayStats\n RefreshAllGatewayStatsRunning = false\n }\n\n Loadable.Data newModel, Cmd.none\n | AuthenticatedResponse.Error _ ->\n let toastCmd =\n Toast.create \"Fehler beim Laden des Status aller Gateways\" |> Toast.error\n\n Loadable.Data { dataModel with RefreshAllGatewayStatsRunning = false }, toastCmd\n | GatewayListMsg.RefreshGatewaysTTN, Loadable.Data data ->\n let cmd =\n Cmd.OfAsync.perform api.refreshGatewaysFromTtn () (GatewayListMsg.GatewaysRefreshed >> GatewayList)\n\n Loadable.Data { data with TTNRefreshRequestRunning = true }, cmd\n | GatewayListMsg.RefreshGatewaysTTI, Loadable.Data data ->\n let cmd =\n Cmd.OfAsync.perform api.refreshGatewaysFromTti () (GatewayListMsg.GatewaysRefreshed >> GatewayList)\n\n Loadable.Data { data with TTIRefreshRequestRunning = true }, cmd\n | GatewayListMsg.GatewaysRefreshed successful, Loadable.Data data ->\n if successful then\n let toastCmd =\n Toast.create \"Die Gateways wurden erfolgreich aktualisiert\" |> Toast.success\n\n init data.Session |> Cmds.batch toastCmd\n else\n let toastCmd =\n Toast.create \"Ein Fehler ist aufgetreten beim aktualisieren der Gateways\"\n |> Toast.error\n\n Loadable.Data(updateRefreshRequestRunning data false), toastCmd\n\n\n | GatewayListMsg.CloseModal, Loadable.Data data -> Loadable.Data { data with Modal = None }, Cmd.none\n | GatewayListMsg.OpenModal gateway, Loadable.Data data ->\n Loadable.Data { data with Modal = Some(Gateway.init data.Users gateway) }, Cmd.none\n | GatewayListMsg.GatewayUpdated(gateway, success), Loadable.Data data ->\n if success then\n let toastCmd =\n Toast.create \"Der Gateway wurde erfolgreich gespeichert\" |> Toast.success\n\n Loadable.Data {\n data with\n Gateways = replaceGatewayData data.Gateways gateway\n Modal = None\n },\n toastCmd\n else\n let toastCmd = Toast.create \"Das Speichern ist fehlgeschlagen\" |> Toast.error\n\n Loadable.Data(updateRequestRunningModalState data false), toastCmd\n | GatewayListMsg.UpdateGateway gateway, Loadable.Data data ->\n Loadable.Data(updateRequestRunningModalState data true),\n Cmd.OfAsync.perform\n api.updateGateway\n gateway\n ((fun success -> gateway, success)\n >> GatewayListMsg.GatewayUpdated\n >> GatewayList)\n | _, Loadable.Data data ->\n let result =\n match data.Modal with\n | Some modal -> Gateway.update msg modal |> (fun (modal, cmd) -> Some modal, cmd)\n | None -> None, Cmd.none\n\n Loadable.Data { data with Modal = fst result }, snd result\n | _, _ -> model, Cmd.none\n\nlet maybeFloatToString (maybeFloat: float option) =\n maybeFloat\n |> Option.map (fun float -> float.ToString())\n |> Option.defaultValue \"\"\n\nlet private createStatusTableCell (label: string) (statusDot: StatusDot) (maybeTooltip: string option) =\n td [] [\n div [\n classList [\n (Tooltip.ClassName, true)\n (\"device-status\", true)\n ]\n match maybeTooltip with\n | Some tooltip -> Tooltip.dataTooltip tooltip\n | None -> ()\n ] [\n p [] [ str label ]\n img [\n Style [ Height \"10px\" ]\n Src(StatusDot.toImageUrl statusDot)\n ]\n ]\n ]\n\nlet private createStatusCellFromStatus (status: GatewayStatus option) : ReactElement =\n match status with\n | Some(Connected connected) ->\n let tooltip =\n sprintf \"Seit %s \" (DateTime.toShortString connected.ConnectedAt.LocalDateTime)\n\n createStatusTableCell \"Verbunden\" StatusDot.Green (Some tooltip)\n | Some(Disconnected disconnected) ->\n let tooltip =\n match disconnected.DisconnectedAt with\n | Some disconnectedAt -> sprintf \"Seit %s \" (DateTime.toShortString disconnectedAt.LocalDateTime)\n | None -> \"Schon seit längerem (noch nie?) gibt es keine Verbindung zum Gateway\"\n\n createStatusTableCell \"Keine Verbindung\" StatusDot.Red (Some tooltip)\n | None -> createStatusTableCell \"Fehler\" StatusDot.Grey (Some \"Fehler beim Laden des Gateway Status\")\n\nlet private createStatusCell (status: Refreshable) =\n match status with\n | NotLoaded -> createStatusTableCell \"Unbekannt\" StatusDot.Grey None\n | Refreshing ->\n Panel.Block.div [] [\n Button.button [ Button.IsLink; Button.IsLoading true ] [ str \"Aktueller Status laden\" ]\n ]\n | Refreshed data -> createStatusCellFromStatus data\n\nlet private gatewayHasValidLocation (gateway: MySensGateway) : bool =\n Location.fromOptional gateway.Longitude gateway.Latitude |> Option.isSome\n\nlet gatewayToRow dispatch (users: UserDto list) (index: int) (gateway: GatewayViewModel) =\n let findUser =\n fun userId -> List.tryFind (fun (user: UserDto) -> user.Id = userId) users\n\n let validLocationLabel =\n if gatewayHasValidLocation gateway.Gateway then\n \"Ja\"\n else\n \"Nein\"\n\n let statusCell = createStatusCell gateway.Status\n\n tr [] [\n td [] [ Table.rowIndexString index ]\n td [] [ str gateway.Gateway.TtnId ]\n td [] [ str gateway.Gateway.Eui ]\n td [] [ str gateway.Gateway.Name ]\n td [] [\n str (gateway.Gateway.TtsDescription |> Option.defaultValue \"\")\n ]\n td [] [\n str (gateway.Gateway.Note |> Option.defaultValue \"\")\n ]\n td [] [ str validLocationLabel ]\n statusCell\n td [] [\n Option.map findUser gateway.Gateway.UserId\n |> Option.flatten\n |> Option.map (fun user -> getFullName user)\n |> Option.defaultValue \"\"\n |> str\n ]\n td [] [\n Button.button [\n Button.OnClick(fun _ ->\n dispatch (\n GatewayListMsg.OpenModal {\n Id = gateway.Id\n Value = gateway.Gateway\n }\n |> GatewayList\n )\n )\n ] [ str \"Bearbeiten\" ]\n ]\n ]\n\nlet gatewayListToTable dispatch (gateways: GatewayViewModel list) (users: UserDto list) =\n Table.table [\n Table.IsBordered\n Table.IsFullWidth\n Table.IsStriped\n ] [\n thead [] [\n tr [] [\n th [] [ str \"#\" ]\n th [] [ str \"TTS Id\" ]\n th [] [ str \"EUI\" ]\n th [] [ str \"Name\" ]\n th [] [ str \"TTS Beschreibung\" ]\n th [] [ str \"Interne Notiz\" ]\n th [] [ str \"GPS-Position?\" ]\n th [ classList [ (\"last_date\", true) ] ] [ str \"Status\" ]\n th [] [ str \"Zugeordneter Benutzer\" ]\n th [] []\n ]\n ]\n tbody\n []\n (gateways\n |> List.sortBy (fun gw -> gw.Gateway.Name)\n |> List.mapi (gatewayToRow dispatch users))\n ]\n\nlet refreshGatewayStats isRefreshRequestRunning dispatch =\n Button.button [\n Button.IsLoading isRefreshRequestRunning\n Button.Color IsLink\n Button.OnClick(fun _ -> dispatch (GatewayListMsg.LoadAllGatewayStatus |> GatewayList))\n ] [ str \"Status aller Gateways laden\" ]\n\nlet refreshDevicesTTNButton isRefreshRequestRunning dispatch =\n Button.button [\n Button.IsLoading isRefreshRequestRunning\n Button.Color IsLink\n Button.OnClick(fun _ -> dispatch (GatewayList GatewayListMsg.RefreshGatewaysTTN))\n ] [ str \"Gateways aus TTN aktualisieren\" ]\n\nlet refreshDevicesTTIButton isRefreshRequestRunning dispatch =\n Button.button [\n Button.IsLoading isRefreshRequestRunning\n Button.Color IsLink\n Button.OnClick(fun _ -> dispatch (GatewayList GatewayListMsg.RefreshGatewaysTTI))\n ] [ str \"Gateways aus TTI aktualisieren\" ]\n\nlet tableHeader dispatch model =\n Level.level [] [\n Level.left [] []\n Level.right [] [\n Level.item [] [\n Field.div [] [\n Control.div [] [\n refreshGatewayStats model.RefreshAllGatewayStatsRunning dispatch\n ]\n ]\n ]\n Level.item [] [\n Field.div [] [\n Control.div [] [\n refreshDevicesTTNButton model.TTNRefreshRequestRunning dispatch\n ]\n ]\n ]\n Level.item [] [\n Field.div [] [\n Control.div [] [\n refreshDevicesTTIButton model.TTIRefreshRequestRunning dispatch\n ]\n ]\n ]\n ]\n ]\n\nlet private dataView dispatch (data: DataModel) =\n let table = gatewayListToTable dispatch data.Gateways data.Users\n\n let modal =\n data.Modal\n |> Option.map (Gateway.view dispatch)\n |> Option.defaultValue (div [] [])\n\n Container.container [ Container.IsFluid ] [\n Heading.h1 [] [ str \"MySens Gateway Liste\" ]\n tableHeader dispatch data\n Table.scrollableTable table\n modal\n ]\n\nlet view (model: Model) dispatch = Loadable.view (dataView dispatch) model","namespace Shared.Infrastructure\n\nopen System.Collections.Generic\n\n[]\nmodule Dict =\n let tryGetValue (dict: IDictionary<'key, 'value>) (key: 'key) : 'value option =\n if dict.ContainsKey key then Some(dict.Item key) else None\n\n let values (dict: IDictionary<'key, 'value>) : 'value list = dict.Values |> List.ofSeq\n\n let ofList (f: 'input -> 'key * 'value) (values: 'input list) : IDictionary<'key, 'value> =\n values |> List.map f |> dict","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Panel =\r\n\r\n type Option =\r\n | Color of IColor\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Tab =\r\n\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n module Block =\r\n\r\n type Option =\r\n /// Add `is-active` class if true\r\n | [] IsActive of bool\r\n | Props of IHTMLProp list\r\n | CustomClass of string\r\n | Modifiers of Modifier.IModifier list\r\n\r\n let internal panel element (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | IsActive state -> if state then result.AddCaseName option else result\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"panel-block\").ToReactElement(element, children)\r\n\r\n /// Generate
      \r\n let div options children = panel div options children\r\n\r\n /// Generate \r\n let a options children = panel a options children\r\n\r\n /// Generate \r\n let label options children = panel label options children\r\n\r\n /// Generate

      \r\n let p options children = panel p options children\r\n\r\n /// Generate \r\n let checkbox (options : Block.Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Block.IsActive state -> if state then result.AddCaseName option else result\r\n | Block.Props props -> result.AddProps props\r\n | Block.CustomClass customClass -> result.AddClass customClass\r\n | Block.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"panel-block\").ToReactElement(label, children)\r\n\r\n /// Generate \r\n let panel (options: Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Color color -> ofColor color |> result.AddClass\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"panel\").ToReactElement(nav, children)\r\n\r\n /// Generate
      \r\n let heading (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"panel-heading\").ToReactElement(div, children)\r\n\r\n /// Generate
      \r\n let tabs (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"panel-tabs\").ToReactElement(div, children)\r\n\r\n /// Generate \r\n let tab (options: Tab.Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Tab.IsActive state -> if state then result.AddCaseName option else result\r\n | Tab.Props props -> result.AddProps props\r\n | Tab.CustomClass customClass -> result.AddClass customClass\r\n | Tab.Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions).ToReactElement(a, children)\r\n\r\n /// Generate \r\n let icon (options: GenericOption list) children =\r\n GenericOptions.Parse(options, parseOptions, \"panel-icon\").ToReactElement(span, children)\r\n","[]\nmodule Client.Components.Flatpickr\n\nopen Fable.React\nopen Fable.React.Props\nopen Fable.Core.JsInterop\nopen Fable.Core\nopen System\n\ntype IFlatpickrOption = interface end\n\ntype IFlatpickrLocale = interface end\n\ntype private OptionType = {\n Value: obj\n Key: string\n IsConfig: bool\n}\n\n[]\ntype Mode =\n | Single\n | Multiple\n | Range\n\n[]\nlet private setProp (propName: string) (propValue: obj) (any: obj) : unit = jsNative\n\n[]\nlet private typed<'a> (x: obj) : 'a = jsNative\n\n[]\nlet private getAs<'a> (x: obj) (key: string) : 'a = jsNative\n\n/// Sets the initial value for the Flatpickr component\nlet Value (date: DateTime) =\n {\n Value = date\n IsConfig = false\n Key = \"value\"\n }\n |> unbox\n\n/// Determines whether or not the date picker also contains a time picker\nlet EnableTimePicker (cond: bool) =\n {\n Value = cond\n IsConfig = true\n Key = \"enableTime\"\n }\n |> unbox\n\n/// Enables seconds in the time picker\nlet EnableSecondsPicker (cond: bool) =\n {\n Value = cond\n IsConfig = true\n Key = \"enableSeconds\"\n }\n |> unbox\n\n/// The minimum date that a user can start picking from (inclusive).\nlet MinimumDate (date: DateTime) =\n {\n Value = date\n IsConfig = true\n Key = \"minDate\"\n }\n |> unbox\n\n/// The minimum date that a user can start picking from (inclusive).\nlet MaximumDate (date: DateTime) =\n {\n Value = date\n IsConfig = true\n Key = \"maxDate\"\n }\n |> unbox\n\n/// A placeholder text for the input. It will be shown when no date value is selected.\nlet Placeholder (placeholder: string) =\n {\n Value = placeholder\n IsConfig = false\n Key = \"placeholder\"\n }\n |> unbox\n\n/// Defines the id of the input\nlet Id (id: string) =\n {\n Value = id\n IsConfig = false\n Key = \"id\"\n }\n |> unbox\n\n/// Defines a custom property with key and value and flag that tells whether the option is from the flatpickr library or just an attribute of the input element\nlet custom key value config =\n {\n Value = unbox value\n IsConfig = config\n Key = key\n }\n |> unbox\n\n/// Sets the initial value of the hour element (12 by default)\nlet DefaultHour (hour: int) =\n {\n Value = hour\n IsConfig = true\n Key = \"defaultHour\"\n }\n |> unbox\n\n/// Sets the initial value of the minute element (0 by default)\nlet DefaultMinute (min: int) =\n {\n Value = min\n IsConfig = true\n Key = \"defaultMinute\"\n }\n |> unbox\n\n/// Enables display of week numbers in calendar.\nlet EnableWeekNumbers (cond: bool) =\n {\n Value = cond\n IsConfig = true\n Key = \"weekNumbers\"\n }\n |> unbox\n\n/// Registers an event handler for Flatpickr that is triggered when the user selects a new datetime value\nlet OnChange (callback: DateTime -> unit) =\n {\n Value =\n unbox (fun (dates: DateTime[]) ->\n // sometimes the library emits a null causing all kinds of errors\n // if that's the case, we ignore it\n if isNull (unbox dates) || Array.isEmpty dates then\n ()\n else\n callback dates.[0]\n )\n IsConfig = false\n Key = \"onChange\"\n }\n |> unbox\n\n/// Registers an event handler for Flatpickr that is triggered when the user selects a new datetime value\nlet OnManyChanged (callback: DateTime list -> unit) =\n {\n Value = unbox (fun (dates: DateTime[]) -> callback (List.ofArray dates))\n IsConfig = false\n Key = \"onChange\"\n }\n |> unbox\n\n/// Defines the class attribute for the Flatpickr element. Keep in mind that Flatpickr is implmented as wrapper around an `` element.\nlet ClassName name =\n {\n Value = name\n IsConfig = false\n Key = \"className\"\n }\n |> unbox\n\n/// Defines the inline styles of the Flatpickr element\nlet Style (props: CSSProp list) =\n {\n Value = keyValueList CaseRules.LowerFirst props\n IsConfig = false\n Key = \"style\"\n }\n |> unbox\n\n/// Defines whether or not the Flatpickr element is disabled.\nlet Disabled (value: bool) =\n {\n Value = value\n IsConfig = false\n Key = \"disabled\"\n }\n |> unbox\n\n/// Defines how the date is displayed on the component\nlet DateFormat (value: string) =\n {\n Value = value\n IsConfig = true\n Key = \"dateFormat\"\n }\n |> unbox\n\n/// Hides the calendar so that users cannot select dates\nlet HideCalendar (value: bool) =\n {\n Value = value\n IsConfig = true\n Key = \"noCalendar\"\n }\n |> unbox\n\n/// The selection mode changes wether the use can select a single value, multiple values or an inclusive range of dates.\nlet SelectionMode (mode: Mode) =\n {\n Value = mode\n IsConfig = true\n Key = \"mode\"\n }\n |> unbox\n\n/// If set to true, makes sure that the picker is always set shown to the user\nlet AlwaysOpen (value: bool) =\n {\n Value = value\n IsConfig = true\n Key = \"inline\"\n }\n |> unbox\n\n/// Disallow the user to select the given dates\nlet DisableDates (dates: list) =\n let datesArray = Array.ofList dates\n\n {\n Value = datesArray\n IsConfig = true\n Key = \"disable\"\n }\n |> unbox\n\n/// Disallow the user to select the dates using a predicate\nlet DisableBy (pred: DateTime -> bool) =\n {\n Value = [| pred |]\n IsConfig = true\n Key = \"disable\"\n }\n |> unbox\n\n/// Adjusts the step for the minute input (incl. scrolling)\nlet MinuteIncrement (min: int) =\n {\n Value = min\n IsConfig = true\n Key = \"minuteIncrement\"\n }\n |> unbox\n\n/// Adjusts the step for the hour input (incl. scrolling)\nlet HourIncrement (hours: int) =\n {\n Value = hours\n IsConfig = true\n Key = \"hourIncrement\"\n }\n |> unbox\n\n/// Disallow the user to select the dates that are between the given ranges\nlet DisableRanges (ranges: list) =\n let rangeObjects =\n ranges\n |> List.map (fun (fromDate, toDate) ->\n let range = obj ()\n setProp \"to\" toDate range\n setProp \"from\" fromDate range\n range\n )\n |> Array.ofList\n\n {\n Value = rangeObjects\n IsConfig = true\n Key = \"disable\"\n }\n |> unbox\n\n/// Enable only the given list of dates\nlet EnableDates (dates: list) =\n let datesArray = Array.ofList dates\n\n {\n Value = datesArray\n IsConfig = true\n Key = \"enable\"\n }\n |> unbox\n\n/// Enable only the dates that pass a given criteria\nlet EnableBy (pred: DateTime -> bool) =\n {\n Value = [| pred |]\n IsConfig = true\n Key = \"enable\"\n }\n |> unbox\n\n/// Allows using a custom date formatting function instead of the built-in handling for date formats using dateFormat.\nlet FormatDateBy (map: DateTime -> string) =\n {\n Value = map\n IsConfig = true\n Key = \"formatDate\"\n }\n |> unbox\n\n/// Displays time picker in 24 hour mode without AM/PM selection when enabled.\nlet TimeTwentyFour (cond: bool) =\n {\n Value = cond\n IsConfig = true\n Key = \"time_24hr\"\n }\n |> unbox\n\n\n/// Show the month using the shorthand version (ie, Sep instead of September).\nlet UseShorthandMonthNames (cond: bool) =\n {\n Value = cond\n IsConfig = true\n Key = \"shorthandCurrentMonth\"\n }\n |> unbox\n\n/// Enable only the given list of date ranges\nlet EnableRanges (ranges: list) =\n let rangeObjects =\n ranges\n |> List.map (fun (fromDate, toDate) ->\n let range = obj ()\n setProp \"to\" toDate range\n setProp \"from\" fromDate range\n range\n )\n |> Array.ofList\n\n {\n Value = rangeObjects\n IsConfig = true\n Key = \"enable\"\n }\n |> unbox\n\n/// Localize the instance\nlet Locale (loc: IFlatpickrLocale) =\n {\n Value = loc\n IsConfig = true\n Key = \"locale\"\n }\n |> unbox\n\n/// Initializes Flatpickr, a lightweight DateTime picker.\nlet flatpickr (options: IFlatpickrOption list) =\n let props = obj ()\n let propOptions = obj ()\n\n for option in unbox> options do\n if option.IsConfig then\n setProp option.Key option.Value propOptions\n else\n setProp option.Key option.Value props\n\n setProp \"options\" propOptions props\n ofImport \"default\" \"react-flatpickr\" props []\n\n\ntype Locales =\n static member inline russian: IFlatpickrLocale = import \"Russian\" \"flatpickr/dist/l10n/ru.js\"\n\n static member inline bulgarian: IFlatpickrLocale =\n import \"Bulgarian\" \"flatpickr/dist/l10n/bg.js\"\n\n static member inline czech: IFlatpickrLocale = import \"Czech\" \"flatpickr/dist/l10n/cs.js\"\n static member inline italian: IFlatpickrLocale = import \"Italian\" \"flatpickr/dist/l10n/it.js\"\n\n static member inline japanese: IFlatpickrLocale =\n import \"Japanese\" \"flatpickr/dist/l10n/ja.js\"\n\n static member inline korean: IFlatpickrLocale = import \"Korean\" \"flatpickr/dist/l10n/ko.js\"\n static member inline french: IFlatpickrLocale = import \"French\" \"flatpickr/dist/l10n/fr.js\"\n static member inline spanish: IFlatpickrLocale = import \"Spanish\" \"flatpickr/dist/l10n/es.js\"\n\n static member inline estonian: IFlatpickrLocale =\n import \"Estonian\" \"flatpickr/dist/l10n/et.js\"\n\n static member inline persian: IFlatpickrLocale = import \"Persian\" \"flatpickr/dist/l10n/fa.js\"\n static member inline finnish: IFlatpickrLocale = import \"Finnish\" \"flatpickr/dist/l10n/fi.js\"\n static member inline greek: IFlatpickrLocale = import \"Greek\" \"flatpickr/dist/l10n/gr.js\"\n static member inline hebrew: IFlatpickrLocale = import \"Hebrew\" \"flatpickr/dist/l10n/hr.js\"\n static member inline hindi: IFlatpickrLocale = import \"Hindi\" \"flatpickr/dist/l10n/hi.js\"\n\n static member inline croatian: IFlatpickrLocale =\n import \"Croatian\" \"flatpickr/dist/l10n/hr.js\"\n\n static member inline indonesian: IFlatpickrLocale =\n import \"Indonesian\" \"flatpickr/dist/l10n/id.js\"\n\n static member inline dutch: IFlatpickrLocale = import \"Dutch\" \"flatpickr/dist/l10n/nl.js\"\n\n static member inline norwegian: IFlatpickrLocale =\n import \"Norwegian\" \"flatpickr/dist/l10n/no.js\"\n\n static member inline polish: IFlatpickrLocale = import \"Polish\" \"flatpickr/dist/l10n/pl.js\"\n\n static member inline portuguese: IFlatpickrLocale =\n import \"Portuguese\" \"flatpickr/dist/l10n/pt.js\"\n\n static member inline romanian: IFlatpickrLocale =\n import \"Romanian\" \"flatpickr/dist/l10n/ro.js\"\n\n static member inline slovak: IFlatpickrLocale = import \"Slovak\" \"flatpickr/dist/l10n/sk.js\"\n\n static member inline slovenian: IFlatpickrLocale =\n import \"Slovenian\" \"flatpickr/dist/l10n/sl.js\"\n\n static member inline albanian: IFlatpickrLocale =\n import \"Albanian\" \"flatpickr/dist/l10n/sq.js\"\n\n static member inline serbian: IFlatpickrLocale = import \"Serbian\" \"flatpickr/dist/l10n/sr.js\"\n static member inline thai: IFlatpickrLocale = import \"Thai\" \"flatpickr/dist/l10n/th.js\"\n static member inline turkish: IFlatpickrLocale = import \"Turkish\" \"flatpickr/dist/l10n/tr.js\"\n\n static member inline ukrainian: IFlatpickrLocale =\n import \"Ukrainian\" \"flatpickr/dist/l10n/uk.js\"\n\n static member inline vietnamese: IFlatpickrLocale =\n import \"Vietnamese\" \"flatpickr/dist/l10n/vn.js\"\n\n static member inline Mandarin: IFlatpickrLocale =\n import \"Mandarin\" \"flatpickr/dist/l10n/zh.js\"\n\n static member inline german: IFlatpickrLocale = import \"German\" \"flatpickr/dist/l10n/de.js\"\n static member inline catalan: IFlatpickrLocale = import \"Catalan\" \"flatpickr/dist/l10n/cat.js\"","module Client.Forms.User\n\nopen System\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Fulma.Extensions.Wikiki\nopen Shared.Dto.Page.UserList\nopen Shared.Dto.User\nopen Shared\nopen Shared.Infrastructure\nopen Client\nopen Thoth.Elmish\nopen Fable.Core.JsInterop\n\n\nlet roleFromString role =\n match role with\n | \"Administrator\" -> Admin\n | \"Benutzer\" -> RegularUser\n | \"Test-Benutzer\" -> TestUser\n | _ -> failwith \"Unknown User Role\"\n\n\nlet roleToString role =\n match role with\n | Admin -> \"Administrator\"\n | RegularUser -> \"Benutzer\"\n | TestUser -> \"Test-Benutzer\"\n\nlet private roleFromDto (user: FullUserDto) =\n match user with\n | FullUserDto.Admin _ -> Admin\n | FullUserDto.RegularUser _ -> RegularUser\n | FullUserDto.TestUser _ -> TestUser\n\ntype UserData = {\n Id: int option\n FirstName: string option\n LastName: string option\n Mail: string option\n Password: string option\n Role: Role\n Packages: IdValue list\n DeletedPackages: int list\n ValidUntil: DatePicker\n CustomerNumber: string option\n}\n\n\ntype Model = {\n Data: UserData\n RequestRunning: bool\n}\n\ntype FormResult =\n | Noop\n | CloseModal\n | CloseAndRefresh\n\nlet private defaultValidUntil =\n let defaultSelected = DateTime.Now.AddDays 7.\n\n DatePicker.init DateTime.Now None defaultSelected\n\nlet private createNewModel = {\n Id = None\n FirstName = None\n LastName = None\n Mail = None\n Password = None\n Role = RegularUser\n Packages = []\n DeletedPackages = []\n ValidUntil = defaultValidUntil\n CustomerNumber = None\n}\n\nlet private modelFromDto (user: IdValue) =\n let validUntil =\n match user.Value with\n | FullUserDto.TestUser testUser -> DatePicker.initFutureDate testUser.ValidUntil\n | _ -> defaultValidUntil\n\n let customerNumber =\n match user.Value with\n | FullUserDto.RegularUser regularUser -> regularUser.CustomerNumber\n | _ -> None\n\n {\n Id = Some user.Id\n FirstName = Some(getFirstName user.Value)\n LastName = Some(getLastName user.Value)\n Mail = Some(getMail user.Value)\n Password = None\n Role = roleFromDto user.Value\n Packages = (getPackages user.Value)\n DeletedPackages = []\n ValidUntil = validUntil\n CustomerNumber = customerNumber\n }\n\nlet init (maybeUser: IdValue option) =\n let data =\n match maybeUser with\n | None -> createNewModel\n | Some user -> modelFromDto user\n\n {\n RequestRunning = false\n Data = data\n }\n\nlet private createUserData firstName lastName mail password role packages validUntil customerNumber : FullUserDto =\n let data: BaseUserDataDto = {\n FirstName = firstName\n LastName = lastName\n Mail = mail\n Password = password\n LastLogin = None\n }\n\n match role with\n | Admin -> FullUserDto.Admin data\n | RegularUser ->\n FullUserDto.RegularUser {\n Base = data\n Packages = packages\n CustomerNumber = customerNumber\n }\n | TestUser ->\n FullUserDto.TestUser {\n Base = data\n ValidUntil = validUntil\n }\n\nlet createUpdateUserMsg (data: UserData) =\n let userDto =\n Some createUserData\n |> Option.apply data.FirstName\n |> Option.apply data.LastName\n |> Option.apply data.Mail\n |> Option.apply (Some data.Password)\n |> Option.apply (Some data.Role)\n |> Option.apply (Some data.Packages)\n |> Option.apply (Some data.ValidUntil.SelectedDate)\n |> Option.apply (Some data.CustomerNumber)\n\n match data.Id, userDto with\n | Some id, Some dto ->\n Some(\n UserFormMsg.UpdateUser {\n Id = id\n Value = dto\n }\n )\n | None, Some dto -> Some(UserFormMsg.CreateUser dto)\n | _, _ -> None\n\n\nlet ttnSensorToOption (role: Role) =\n let string = roleToString role\n\n option [ Value string ] [ str string ]\n\nlet rolesSelect (selected: Role) dispatch =\n let roles = [ Admin; RegularUser; TestUser ]\n\n let options = List.map ttnSensorToOption roles\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(roleToString selected)\n OnChange(fun event -> dispatch (event.target?value |> RoleChanged |> UserListMsg.FormMsg |> UserList))\n ]\n options\n ]\n\nlet packageRow dispatch (package: IdValue) =\n tr [] [\n td [] [\n package.Value.Package |> getPackageLabel |> str\n ]\n td [] [\n package.Value.ValidUntil |> DateOnly.toString |> str\n ]\n td [\n Class Tooltip.ClassName\n Tooltip.dataTooltip \"Löschen\"\n Style [ Width \"38px\" ]\n ] [\n (*Delete.delete [\n Delete.Props [ HTMLAttr.Disabled true ]\n Delete.Size Size.IsMedium\n Delete.OnClick(fun _ -> dispatch (RemovePackage package.Id |> UserListMsg.FormMsg |> UserList))\n ] []*)\n ]\n ]\n\nlet form dispatch (model: Model) =\n let packagesElements = model.Data.Packages |> List.map (packageRow dispatch)\n\n let packagesTable =\n Table.table [ Table.IsStriped; Table.IsFullWidth ] [\n thead [] [\n tr [] [\n th [] [ str \"Paket\" ]\n th [] [ str \"Ablaufdatum\" ]\n th [] []\n ]\n ]\n tbody [] packagesElements\n ]\n\n form [] [\n Field.div [] [\n Label.label [] [ str \"Vorname\" ]\n Control.div [] [\n Input.text [\n Input.Placeholder \"Max\"\n model.Data.FirstName |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> UserFormMsg.FirstNameChanged\n |> UserListMsg.FormMsg\n |> UserList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Nachname\" ]\n Control.div [] [\n Input.text [\n Input.Placeholder \"Mustermann\"\n model.Data.LastName |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> UserFormMsg.LastNameChanged\n |> UserListMsg.FormMsg\n |> UserList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Mail Adresse\" ]\n Control.div [] [\n Input.text [\n Input.Placeholder \"max.mustermann@example.com\"\n model.Data.Mail |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> UserFormMsg.MailChanged\n |> UserListMsg.FormMsg\n |> UserList\n |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Passwort\" ]\n Control.div [] [\n Input.text [\n Input.Placeholder \"\"\n model.Data.Password |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> UserFormMsg.PasswordChanged\n |> UserListMsg.FormMsg\n |> UserList\n |> dispatch\n )\n ]\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Benutzertyp\" ]\n Control.div [ Control.IsExpanded ] [ rolesSelect model.Data.Role dispatch ]\n ]\n match model.Data.Role with\n | RegularUser ->\n Field.div [] [\n Label.label [] [ str \"SevDesk Kundennummer\" ]\n Control.div [] [\n Input.text [\n Input.Placeholder \"\"\n model.Data.CustomerNumber |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> UserFormMsg.CustomerNumberChanged\n |> UserListMsg.FormMsg\n |> UserList\n |> dispatch\n )\n ]\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Gebuchte Pakete\" ]\n Control.div [] [ packagesTable ]\n ]\n | _ -> ()\n\n match model.Data.Role with\n | TestUser ->\n Field.div [] [\n Label.label [] [ str \"Gültig bis (bis 23:59 Uhr)\" ]\n Control.div [] [\n DatePicker.view\n \"Datum\"\n (UserFormMsg.ValidUntilChanged >> UserListMsg.FormMsg >> UserList >> dispatch)\n model.Data.ValidUntil\n ]\n ]\n | _ -> ()\n ]\n\nlet saveButton dispatch (model: Model) =\n let maybeOnClick =\n createUpdateUserMsg model.Data\n |> Option.map (fun msg -> Button.OnClick(fun _ -> dispatch (UserListMsg.FormMsg msg |> UserList)))\n\n let buttonOptions = [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n Button.Disabled(Option.isNone maybeOnClick)\n ]\n\n Button.button (List.addToListIfSome buttonOptions maybeOnClick) [ str \"Speichern\" ]\n\n\nlet view dispatch (model: Model) =\n let closeModal =\n (fun _ -> dispatch (UserFormMsg.CloseModal |> UserListMsg.FormMsg |> UserList))\n\n let headline =\n if Option.isSome model.Data.Id then\n \"Benutzer bearbeiten\"\n else\n \"Neuen Benutzer erstellen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ form dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]\n\nlet private updateData (model: Model) f = { model with Data = f model.Data }\n\nlet update (msg: UserFormMsg) (model: Model) =\n match msg with\n | FirstNameChanged firstName ->\n updateData model (fun data -> { data with FirstName = firstName }), Cmd.none, FormResult.Noop\n | LastNameChanged lastName ->\n updateData model (fun data -> { data with LastName = lastName }), Cmd.none, FormResult.Noop\n | MailChanged mail -> updateData model (fun data -> { data with Mail = mail }), Cmd.none, FormResult.Noop\n | UserFormMsg.PasswordChanged password ->\n updateData model (fun data -> { data with Password = password }), Cmd.none, FormResult.Noop\n | RoleChanged role ->\n updateData\n model\n (fun data -> {\n data with\n Role = roleFromString role\n CustomerNumber = None\n }),\n Cmd.none,\n FormResult.Noop\n | CreateUser user ->\n { model with RequestRunning = true },\n Cmd.OfAsync.perform api.createUser user (UserUpdated >> UserListMsg.FormMsg >> UserList),\n FormResult.Noop\n | UpdateUser user ->\n { model with RequestRunning = true },\n Cmd.OfAsync.perform api.updateUser user (UserUpdated >> UserListMsg.FormMsg >> UserList),\n FormResult.Noop\n | UserUpdated successful ->\n if successful then\n let toastCmd = Toast.create \"Benutzer erfolgreich gespeichert\" |> Toast.success\n\n { model with RequestRunning = false }, toastCmd, FormResult.CloseAndRefresh\n else\n let toastCmd = Toast.create \"Fehler beim Speichern des Benutzers\" |> Toast.error\n\n { model with RequestRunning = false }, toastCmd, FormResult.Noop\n | RemovePackage id ->\n let newPackages =\n model.Data.Packages |> List.filter (fun package -> package.Id <> id)\n\n let newData = {\n model.Data with\n Packages = newPackages\n DeletedPackages = id :: model.Data.DeletedPackages\n }\n\n { model with Data = newData }, Cmd.none, FormResult.Noop\n | ValidUntilChanged dateTime ->\n let date = dateTime.AddHours(23.).AddMinutes(59.)\n\n let newData = { model.Data with ValidUntil = DatePicker.updateSelectedDate model.Data.ValidUntil date }\n\n { model with Data = newData }, Cmd.none, FormResult.Noop\n | UserFormMsg.CloseModal -> model, Cmd.none, FormResult.CloseModal\n | CustomerNumberChanged customerNumber ->\n updateData model (fun data -> { data with CustomerNumber = customerNumber }), Cmd.none, FormResult.Noop","namespace Client.Components\n\nopen System\n\ntype DatePicker = {\n MinDate: DateTime\n MaxDate: DateTime option\n\n SelectedDate: DateTime\n}\n\n[]\nmodule DatePicker =\n let init (min: DateTime) (max: DateTime option) (selected: DateTime) = {\n MinDate = min\n MaxDate = max\n SelectedDate = selected\n }\n\n let initFutureDate (selected: DateTime) = {\n MinDate = DateTime.Now.Date\n MaxDate = None\n SelectedDate = selected\n }\n\n let updateSelectedDate (data: DatePicker) (newDate: DateTime) = { data with SelectedDate = newDate }\n\n let view (placeHolder: string) callback (data: DatePicker) =\n let flatpickrOptions = [\n Flatpickr.custom \"defaultDate\" data.SelectedDate true\n Flatpickr.Placeholder placeHolder\n Flatpickr.Locale Flatpickr.Locales.german\n Flatpickr.DateFormat \"d.m.Y\"\n Flatpickr.SelectionMode Flatpickr.Mode.Single\n Flatpickr.OnChange callback\n Flatpickr.ClassName \"input\"\n Flatpickr.MinimumDate data.MinDate\n\n match data.MaxDate with\n | Some maxDate -> Flatpickr.MaximumDate maxDate\n | None -> ()\n ]\n\n Flatpickr.flatpickr flatpickrOptions","[]\nmodule Shared.Infrastructure.DateOnly\n\nopen System\n\nlet toString (date: DateOnly) : string =\n date.ToDateTime(TimeOnly(0, 0)).ToString(\"dd.MM.yyyy\")\n\nlet toShortString (date: DateOnly) : string =\n date.ToDateTime(TimeOnly(0, 0)).ToString(\"dd.MM.yy\")","module Client.Forms.AddPackage\n\n\nopen Client.Domain\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React.Props\nopen Fable.Remoting.MsgPack.Write\nopen Fulma\nopen Shared.Dto.User\nopen Fable.React.Standard\nopen Fable.React.Helpers\nopen Client.Infrastructure.Api\nopen Client\nopen Thoth.Elmish\nopen Fable.Core.JsInterop\n\ntype DataModel = {\n RequestRunning: bool\n UserId: int\n AvailablePackages: Package list\n SelectedPackage: Package\n}\n\ntype FormResult =\n | Noop\n | CloseModal\n | CloseAndRefresh\n\ntype Model = Loadable\n\nlet init userId availablePackages = {\n RequestRunning = false\n UserId = userId\n AvailablePackages = availablePackages\n SelectedPackage = availablePackages.Head\n}\n\nlet packageToOption (package: Package) =\n let label = getPackageLabel package\n let value = getPackageId package\n\n option [ Value value ] [ str label ]\n\nlet packageSelect dispatch selected availablePackages =\n let options = List.map packageToOption availablePackages\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(getPackageLabel selected)\n OnChange(fun event ->\n dispatch (event.target?value |> packageFromId |> PackageSelected |> AddPackage |> UserList)\n )\n ]\n options\n ]\n\n\nlet form dispatch (model: DataModel) =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Paket\" ]\n Control.div [] [\n packageSelect dispatch model.SelectedPackage model.AvailablePackages\n ]\n ]\n ]\n\nlet saveButton dispatch (model: DataModel) =\n let buttonOptions = [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n Button.OnClick(fun _ ->\n dispatch (\n AddPackageFormMsg.AddPackage(model.UserId, model.SelectedPackage)\n |> AddPackage\n |> UserList\n )\n )\n ]\n\n Button.button buttonOptions [ str \"Hinzufügen\" ]\n\nlet modalView dispatch (model: DataModel) =\n let closeModal =\n (fun _ -> dispatch (AddPackageFormMsg.CloseModal |> AddPackage |> UserList))\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str \"Neues Paket hinzufügen\" ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ form dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]\n\nlet update (msg: AddPackageFormMsg) (model: Model) =\n match (msg, model) with\n | AvailablePackagesReceived packages, Loadable.Loading loadingModel ->\n Loadable.Data(init loadingModel packages), Cmd.none, FormResult.Noop\n | PackageSelected package, Loadable.Data data ->\n Loadable.Data { data with SelectedPackage = package }, Cmd.none, FormResult.Noop\n | AddPackageFormMsg.AddPackage(userId, package), Loadable.Data _ ->\n model,\n Cmd.OfAsync.perform api.addPackage (userId, package) (PackageAdded >> AddPackage >> UserList),\n FormResult.Noop\n | PackageAdded success, _ ->\n let toastCmd = Toast.create \"Paket erfolgreich hinzugefügt\" |> Toast.success\n\n model, toastCmd, FormResult.CloseAndRefresh\n | AddPackageFormMsg.CloseModal, _ -> model, Cmd.none, FormResult.CloseModal\n | _, _ -> model, Cmd.none, FormResult.Noop\n\n\nlet view dispatch (model: Model) =\n Loadable.view (modalView dispatch) model","module Client.Page.Admin.UserList\n\nopen System\nopen Client.Domain\nopen Client.Infrastructure\nopen Client.InfrastructureTypes\nopen Elmish\nopen Fulma\nopen Shared\nopen Client\nopen Fable.React\nopen Client.Infrastructure.Api\nopen Client.DomainTypes.Msg\nopen Shared.Dto.Dto\nopen Shared.Dto.Page.UserList\nopen Shared.Dto.User\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\ntype Data = {\n Users: IdValue list\n UserModal: Forms.User.Model option\n AddPackageModal: Forms.AddPackage.Model option\n Session: UserSession\n}\n\ntype Model = Loadable\n\nlet init (userSession: UserSession) =\n let request = {\n SessionKey = userSession.SessionKey\n Data = ()\n }\n\n let cmd =\n Cmd.OfAsync.perform api.getAllFullUsers request (UserListMsg.UsersLoaded >> UserList)\n\n Loadable.Loading userSession, cmd\n\nlet update (msg: UserListMsg) (model: Model) =\n match msg, model with\n | UsersLoaded maybeUserList, Loadable.Loading session ->\n match maybeUserList with\n | Result.Ok userList ->\n Loadable.Data {\n Users = userList\n Session = session\n UserModal = None\n AddPackageModal = None\n },\n Cmd.none\n | Result.Error message ->\n let errorMessage =\n match message with\n | AuthErr Unauthorized -> \"Sie dürfen die notwendigen Daten nicht laden\"\n | AuthErr Unauthenticated -> \"Sie sind nicht eingeloggt. Bitte laden Sie die Seite neu\"\n | CustomErr error -> error\n\n let cmd = Toast.create errorMessage |> Toast.error\n\n model, cmd\n | OpenModal user, Loadable.Data data -> Loadable.Data { data with UserModal = Some(Forms.User.init user) }, Cmd.none\n | UserListMsg.FormMsg formMsg, Loadable.Data data ->\n match data.UserModal with\n | Some modal ->\n let modal, cmd, formResult = Forms.User.update formMsg modal\n\n match formResult with\n | Forms.User.FormResult.Noop -> Loadable.Data { data with UserModal = Some modal }, cmd\n | Forms.User.FormResult.CloseModal -> Loadable.Data { data with UserModal = None }, cmd\n | Forms.User.FormResult.CloseAndRefresh -> init data.Session |> Cmds.batch cmd\n | None -> model, Cmd.none\n | OpenAddPackageModal userId, Loadable.Data data ->\n Loadable.Data {\n data with\n AddPackageModal =\n Some(\n Forms.AddPackage.init userId [\n Package.BaseAccess\n Package.AdditionalSensor\n Package.History\n Package.Alerts\n Package.Scab\n Package.Peronospora\n ]\n |> Loadable.Data\n )\n },\n Cmd.none\n | AddPackage addPackageMsg, Loadable.Data data ->\n match data.AddPackageModal with\n | Some modal ->\n let modal, cmd, formResult = Forms.AddPackage.update addPackageMsg modal\n\n match formResult with\n | Forms.AddPackage.FormResult.Noop -> Loadable.Data { data with AddPackageModal = Some modal }, cmd\n | Forms.AddPackage.FormResult.CloseModal -> Loadable.Data { data with AddPackageModal = None }, cmd\n | Forms.AddPackage.FormResult.CloseAndRefresh -> init data.Session |> Cmds.batch cmd\n | None -> model, Cmd.none\n | DeleteUser id, _ -> model, Cmd.OfAsync.perform api.deleteUser id (UserDeleted >> UserList)\n | UserDeleted success, Loadable.Data data ->\n if success then\n let toastCmd = Toast.create \"Benutzer erfolgreich gelöscht\" |> Toast.success\n\n init data.Session |> Cmds.batch toastCmd\n else\n let toastCmd = Toast.create \"Fehler beim Löschen des Benutzers\" |> Toast.error\n\n model, toastCmd\n | _, _ -> model, Cmd.none\n\n\nlet createNewUserButton dispatch =\n Button.button [\n Button.Color IsLink\n Button.OnClick(fun _ -> dispatch (UserList <| UserListMsg.OpenModal None))\n ] [ str \"Neuen Benutzer erstellen\" ]\n\nlet private getRoleDataString (user: FullUserDto) : string =\n match user with\n | FullUserDto.Admin _ -> \"\"\n | FullUserDto.RegularUser _ ->\n user\n |> getPackages\n |> List.map (fun purchased -> purchased.Value.Package |> getPackageCharacter)\n |> List.sort\n |> fun chars -> String.Join(\", \", chars)\n |> sprintf \"Pakete: %s\"\n | FullUserDto.TestUser testUser -> testUser.ValidUntil |> DateTime.toShortString |> sprintf \"Gültig bis: %s\"\n\nlet private userIsDisabled (user: FullUserDto) : bool =\n match user with\n | FullUserDto.Admin _\n | FullUserDto.RegularUser _ -> false\n | FullUserDto.TestUser testUser -> if testUser.ValidUntil > DateTime.Now then false else true\n\nlet userToRow dispatch (index: int) (user: IdValue) =\n let customerNumber =\n match user.Value with\n | FullUserDto.RegularUser regular -> regular.CustomerNumber\n | _ -> None\n\n tr [\n classList [ (\"user_disabled\", userIsDisabled user.Value) ]\n ] [\n td [] [ Table.rowIndexString index ]\n td [] [ str (getLastName user.Value) ]\n td [] [ str (getFirstName user.Value) ]\n td [] [ str (getMail user.Value) ]\n td [] [ str (userTypeToString user.Value) ]\n td [] [\n str (\n getLastLogin user.Value\n |> Option.map (fun dt -> dt.LocalDateTime)\n |> Option.map DateTime.toString\n |> Option.defaultValue \"Noch nie\"\n )\n ]\n td [] [ user.Value |> getRoleDataString |> str ]\n td [] [\n customerNumber |> Option.defaultValue \"\" |> str\n ]\n td [] [\n Button.button [\n Button.OnClick(fun _ -> dispatch (UserListMsg.OpenAddPackageModal user.Id |> UserList))\n ] [ str \"Paket hinzufügen\" ]\n ]\n td [] [\n Button.button [\n Button.OnClick(fun _ -> dispatch (UserListMsg.OpenModal(Some user) |> UserList))\n ] [ str \"Bearbeiten\" ]\n ]\n td [] [\n Button.button [\n Button.Color IsDanger\n Button.OnClick(fun _ -> dispatch (UserListMsg.DeleteUser user.Id |> UserList))\n ] [ str \"Löschen\" ]\n ]\n ]\n\nlet userListToTable dispatch (users: IdValue list) =\n Table.table [\n Table.IsBordered\n Table.IsFullWidth\n Table.IsStriped\n ] [\n thead [] [\n tr [] [\n th [] [ str \"#\" ]\n th [] [ str \"Nachname\" ]\n th [] [ str \"Vorname\" ]\n th [] [ str \"Email Adresse\" ]\n th [] [ str \"Benutzer Typ\" ]\n th [] [ str \"Letzer Login\" ]\n th [] [ str \"Rolle-Daten\" ]\n th [] [ str \"SevDesk Kundennr.\" ]\n th [] []\n th [] []\n th [] []\n ]\n ]\n tbody [] (List.mapi (userToRow dispatch) users)\n ]\n\nlet tableHeader dispatch =\n Level.level [] [\n Level.left [] []\n Level.right [] [\n Level.item [] [\n Field.div [] [\n Control.div [] [ createNewUserButton dispatch ]\n ]\n ]\n ]\n ]\n\nlet private dataView dispatch (data: Data) =\n let table = userListToTable dispatch data.Users\n\n Container.container [ Container.IsFluid ] [\n Heading.h1 [] [ str \"Benutzer Liste\" ]\n tableHeader dispatch\n Table.scrollableTable table\n\n match data.UserModal with\n | Some modal -> Forms.User.view dispatch modal\n | None -> ()\n\n match data.AddPackageModal with\n | Some modal -> Forms.AddPackage.view dispatch modal\n | None -> ()\n ]\n\n\nlet view (model: Model) dispatch = Loadable.view (dataView dispatch) model","module Client.Forms.LeafletWetnessConfiguration\n\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Fable.FontAwesome\nopen Fable.React\nopen Client.Components\nopen Fulma\nopen Shared\nopen Shared.Infrastructure\nopen Shared.Dto\n\ntype Model = {\n RequestRunning: bool\n\n WetHumidityLimit: float option\n DryHumidityLimit: float option\n\n DewPointLimit: float option\n\n RelativeHumidityDeltaLimit: float option\n AbsoluteHumidityFactorLimit: float option\n}\n\n\ntype FormResult =\n | Noop\n | Save of Dto.LeafletWetnessConfiguration\n\nlet init (config: Dto.LeafletWetnessConfiguration) : Model = {\n RequestRunning = false\n WetHumidityLimit = Some config.WetHumidityLimit\n DryHumidityLimit = Some config.DryHumidityLimit\n DewPointLimit = Some config.DewPointLimit\n RelativeHumidityDeltaLimit = Some config.RelativeHumidityDeltaLimit\n AbsoluteHumidityFactorLimit = Some config.AbsoluteHumidityFactorLimit\n}\n\nlet update (msg: LeafletWetnessConfigurationMsg) (model: Model) =\n match msg with\n | WetHumidityLimitChanged limit -> { model with WetHumidityLimit = limit }, FormResult.Noop\n | DryHumidityLimitChanged limit -> { model with DryHumidityLimit = limit }, FormResult.Noop\n | DewPointLimitChanged limit -> { model with DewPointLimit = limit }, FormResult.Noop\n | RelativeHumidityDeltaLimitChanged limit -> { model with RelativeHumidityDeltaLimit = limit }, FormResult.Noop\n | AbsoluteHumidityFactorLimitChanged limit -> { model with AbsoluteHumidityFactorLimit = limit }, FormResult.Noop\n | LeafletWetnessConfigurationMsg.Save config -> { model with RequestRunning = true }, FormResult.Save config\n\nlet private configurationFactory\n (wetHumidityLimit: float)\n (dryHumidityLimit: float)\n (dewPointLimit: float)\n (relativeHumidityDeltaLimit: float)\n (absoluteHumidityDeltaLimit: float)\n : Dto.LeafletWetnessConfiguration =\n {\n WetHumidityLimit = wetHumidityLimit\n DryHumidityLimit = dryHumidityLimit\n DewPointLimit = dewPointLimit\n RelativeHumidityDeltaLimit = relativeHumidityDeltaLimit\n AbsoluteHumidityFactorLimit = absoluteHumidityDeltaLimit\n }\n\nlet private createConfiguration (model: Model) : Dto.LeafletWetnessConfiguration option =\n (Some configurationFactory)\n |> Option.apply model.WetHumidityLimit\n |> Option.apply model.DryHumidityLimit\n |> Option.apply model.DewPointLimit\n |> Option.apply model.RelativeHumidityDeltaLimit\n |> Option.apply model.AbsoluteHumidityFactorLimit\n\nlet saveButton dispatch (model: Model) =\n let maybeConfiguration = createConfiguration model\n\n let dynamicOptions =\n match maybeConfiguration with\n | Some configuration -> [\n Button.Disabled false\n SubmitButton.onClick (fun _ -> dispatch (LeafletWetnessConfigurationMsg.Save configuration))\n ]\n | None -> [ Button.Disabled true ]\n\n let buttonOptions =\n List.append dynamicOptions [\n Button.Color IsSuccess\n Button.IsLoading model.RequestRunning\n ]\n\n Button.button buttonOptions [ str \"Speichern\" ]\n\nlet createControl isDanger input =\n let defaultControlOptions = [ Control.IsExpanded ]\n\n let controlOptions, additionalContent =\n if isDanger then\n let options = Control.HasIconRight :: defaultControlOptions\n\n let icon =\n Icon.icon [ Icon.Size IsSmall; Icon.IsRight ] [ Fa.i [ Fa.Solid.ExclamationTriangle ] [] ]\n\n options, [ icon ]\n else\n let options = defaultControlOptions\n\n options, []\n\n Control.div controlOptions (input :: additionalContent)\n\nlet createWetHumidityLimitInput dispatch maybeValue =\n let isDanger = Option.isNone maybeValue\n\n let input =\n Inputs.createPercentageInput maybeValue (WetHumidityLimitChanged >> dispatch)\n\n createControl isDanger input\n\nlet createDryHumidityLimitInput dispatch maybeValue =\n let isDanger = Option.isNone maybeValue\n\n let input =\n Inputs.createPercentageInput maybeValue (DryHumidityLimitChanged >> dispatch)\n\n createControl isDanger input\n\nlet createDewPointInput dispatch maybeValue =\n let isDanger = Option.isNone maybeValue\n\n let input =\n Inputs.createPositiveDoubleInput maybeValue (DewPointLimitChanged >> dispatch)\n\n createControl isDanger input\n\nlet createRelativeHumidityDeltaInput dispatch maybeValue =\n let isDanger = Option.isNone maybeValue\n\n let input =\n Inputs.createPercentageInput maybeValue (RelativeHumidityDeltaLimitChanged >> dispatch)\n\n createControl isDanger input\n\nlet createAbsoluteHumidityFactorInput dispatch maybeValue =\n let isDanger = Option.isNone maybeValue\n\n let input =\n Inputs.createPositiveDoubleInput maybeValue (AbsoluteHumidityFactorLimitChanged >> dispatch)\n\n createControl isDanger input\n\nlet view dispatch (model: Model) =\n let addonButton label =\n Control.div [] [\n Button.a [ Button.IsStatic true ] [ str label ]\n ]\n\n let percentAddon = addonButton \"%\"\n\n form [] [\n Field.div [ Field.IsHorizontal ] [\n Field.body [] [\n Field.div [ Field.IsExpanded ] [\n Label.label [] [ str \"Relative Luftfeuchtigkeit - Feucht\" ]\n Field.div [ Field.HasAddons ] [\n createWetHumidityLimitInput dispatch model.WetHumidityLimit\n percentAddon\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Relative Luftfeuchtigkeit - Trocken\" ]\n Field.div [ Field.HasAddons ] [\n createDryHumidityLimitInput dispatch model.DryHumidityLimit\n percentAddon\n ]\n ]\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Unterschied zw. Taupunkt/Temperatur\" ]\n Field.div [ Field.HasAddons ] [\n createDewPointInput dispatch model.DewPointLimit\n addonButton \"°C\"\n ]\n ]\n\n Field.div [ Field.IsHorizontal ] [\n Field.body [] [\n Field.div [ Field.IsExpanded ] [\n Label.label [] [ str \"Relative Luftfeuchtigkeit Delta\" ]\n Field.div [ Field.HasAddons ] [\n createRelativeHumidityDeltaInput dispatch model.RelativeHumidityDeltaLimit\n percentAddon\n ]\n ]\n\n Field.div [] [\n Label.label [] [\n str \"Absolute Luftfeuchtigkeit / Temperatur Faktor\"\n ]\n Field.div [] [\n createAbsoluteHumidityFactorInput dispatch model.AbsoluteHumidityFactorLimit\n ]\n ]\n ]\n ]\n\n Field.div [] [ Control.div [] [ saveButton dispatch model ] ]\n ]","module Client.Page.Admin.CalculationConfiguration\n\nopen Client.Forms\nopen Client.InfrastructureTypes\nopen Elmish\nopen Client.Infrastructure.Api\nopen Client.DomainTypes.Msg\nopen Client\nopen Fulma\nopen Thoth.Elmish\nopen Fable.React\n\n\ntype Model = { LeafletWetnessForm: LeafletWetnessConfiguration.Model option }\n\n\nlet init session =\n { LeafletWetnessForm = None },\n Cmd.OfAsync.perform\n api.getLeafletWetnessConfiguration\n ()\n (CalculationConfigurationMsg.LeafletWetnessReceived >> CalculationConfiguration)\n\nlet update (msg: CalculationConfigurationMsg) (model: Model) =\n match msg with\n | LeafletWetnessReceived configuration ->\n LeafletWetnessConfiguration.init configuration\n |> Some\n |> (fun form -> { model with LeafletWetnessForm = form }),\n Cmd.none\n | LeafletWetnessSaved success ->\n let toastCmd =\n if success then\n Toast.create \"Blattnässevariablen erfolgreich gespeichert\" |> Toast.success\n else\n Toast.create \"Blattnässevariablen konnten nicht gespeichert werden\"\n |> Toast.error\n\n let leafletWetnessModel =\n model.LeafletWetnessForm\n |> Option.map (fun lwModel -> { lwModel with RequestRunning = false })\n\n { model with LeafletWetnessForm = leafletWetnessModel }, toastCmd\n | LeafletWetnessFormMsg formMsg ->\n match model.LeafletWetnessForm with\n | Some form ->\n let formModel, result = LeafletWetnessConfiguration.update formMsg form\n\n let cmd =\n match result with\n | LeafletWetnessConfiguration.FormResult.Save config ->\n Cmd.OfAsync.perform\n api.updateLeafletWetnessConfiguration\n config\n (CalculationConfigurationMsg.LeafletWetnessSaved >> CalculationConfiguration)\n | LeafletWetnessConfiguration.FormResult.Noop -> Cmd.none\n\n { model with LeafletWetnessForm = Some formModel }, cmd\n | None -> model, Cmd.none\n\n\nlet leafletWetnessBox dispatch (maybeForm: LeafletWetnessConfiguration.Model option) =\n let content =\n match maybeForm with\n | Some form -> LeafletWetnessConfiguration.view dispatch form\n | None -> span [] [ str \"Noch nicht geladen\" ]\n\n Box.box' [] [\n Heading.h3 [] [ str \"Blattnässe Model - Konfiguration\" ]\n content\n ]\n\nlet view (dispatch: CalculationConfigurationMsg -> unit) (model: Model) =\n Container.container [ Container.isFullWidth ] [\n Heading.h1 [] [ str \"Konfiguration der Berechnungsmodelle\" ]\n leafletWetnessBox (CalculationConfigurationMsg.LeafletWetnessFormMsg >> dispatch) model.LeafletWetnessForm\n ]","module Client.Page.PasswordLost\n\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React\nopen Client.DomainTypes.Msg\nopen Client.Infrastructure.Api\nopen Client\nopen Fable.React.Props\nopen Fulma\nopen Shared\nopen Shared.Infrastructure\nopen Thoth.Elmish\nopen Client.Components\n\ntype Model = {\n Mail: string option\n RequestRunning: bool\n Message: string option\n}\n\nlet init = {\n Mail = None\n RequestRunning = false\n Message = None\n}\n\nlet buttonOptions (model: Model) dispatch =\n let buttonOptions = [\n Button.Color IsLink\n Button.IsLoading model.RequestRunning\n Button.Disabled(Option.isNone model.Mail)\n Button.Props [ HTMLAttr.Type \"submit\" ]\n ]\n\n model.Mail\n |> Option.map (fun mail -> SubmitButton.onClick (fun _ -> dispatch (SendRequest mail |> PasswordLost)))\n |> List.addToListIfSome buttonOptions\n\nlet view (model: Model) dispatch =\n let content =\n if Option.isSome model.Message then\n Notification.notification [ Notification.Color IsSuccess ] [ str model.Message.Value ]\n else\n Box.box' [] [\n form [] [\n Field.div [] [\n Label.label [] [ str \"E-Mail Adresse\" ]\n Control.div [ Control.HasIconLeft ] [\n Input.email [\n Input.Id \"mail\"\n Input.Value(String.fromOption model.Mail)\n Input.Placeholder \"max.mustermann@example.com\"\n Input.OnChange(fun x ->\n PasswordLostMsg.MailUpdated(String.toOption x.Value)\n |> Msg.PasswordLost\n |> dispatch\n )\n ]\n\n Icon.icon [ Icon.Size IsSmall; Icon.IsLeft ] [ Fa.i [ Fa.Solid.Envelope ] [] ]\n ]\n ]\n Field.div [ Field.IsGroupedRight ] [\n Control.p [] [\n Button.button (buttonOptions model dispatch) [ str \"Passwort zurücksetzen\" ]\n ]\n ]\n ]\n ]\n\n Hero.body [] [\n Container.container [] [\n Column.column [\n Column.Width(Screen.All, Column.Is6)\n Column.Offset(Screen.All, Column.Is3)\n ] [\n Heading.p [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ] [ str \"MySens - Passwort vergessen\" ]\n content\n ]\n ]\n ]\n\nlet update (msg: PasswordLostMsg) (model: Model) =\n match msg with\n | MailUpdated mail -> { model with Mail = mail }, Cmd.none\n | SendRequest mail ->\n { model with RequestRunning = true },\n Cmd.OfAsync.perform\n api.sendPasswordResetRequest\n mail\n (fun success -> RequestSent(mail, success) |> PasswordLost)\n | RequestSent(mail, successful) ->\n if successful then\n let message =\n sprintf\n \"Wenn die Email Adresse '%s' im System existiert, dann wurde eine Email zum Zurücksetzen des Passwortes versendet\"\n mail\n\n {\n model with\n Message = Some message\n RequestRunning = false\n },\n Cmd.none\n else\n let toastCmd = Toast.create \"Ups, da ist ein Fehler aufgetreten\" |> Toast.error\n\n { model with RequestRunning = false }, toastCmd","module Client.Page.ResetPassword\n\nopen Client.Domain\nopen Client.DomainTypes\nopen Client.Infrastructure\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React\nopen Client.DomainTypes.Msg\nopen Client.Infrastructure.Api\nopen Client\nopen Fable.React.Props\nopen Fulma\nopen Shared\nopen Shared.Infrastructure\nopen Client.Components\nopen Shared.Dto.Dto\nopen Thoth.Elmish\n\ntype DataModel = {\n ResetRequest: PasswordResetRequest option\n Password: string option\n PasswordRepeated: string option\n RequestRunning: bool\n}\n\ntype Model = Loadable\n\nlet init token session =\n Loadable.Loading(), Cmd.OfAsync.perform api.getPasswordResetRequest token (RequestLoaded >> ResetPassword)\n\nlet initDataModel request = {\n ResetRequest = request\n Password = None\n PasswordRepeated = None\n RequestRunning = false\n}\n\nlet buttonOptions (model: DataModel) dispatch =\n let maybeRequestData =\n Option.map2\n (fun password passwordRepeated -> if password = passwordRepeated then Some password else None)\n model.Password\n model.PasswordRepeated\n |> Option.flatten\n\n let buttonOptions = [\n Button.Color IsLink\n Button.IsLoading model.RequestRunning\n Button.Disabled(Option.isNone maybeRequestData)\n Button.Props [ HTMLAttr.Type \"submit\" ]\n ]\n\n maybeRequestData\n |> Option.map (fun password ->\n SubmitButton.onClick (fun _ -> dispatch (ResetPasswordMsg.ChangePassword password |> ResetPassword))\n )\n |> List.addToListIfSome buttonOptions\n\nlet noRequestView =\n Notification.notification [ Notification.Color IsDanger ] [\n str \"Der Token zum Zurücksetzen des Passwortes existiert nicht oder ist abgelaufen\"\n ]\n\nlet dataView dispatch (model: DataModel) =\n let content =\n if Option.isSome model.ResetRequest then\n Box.box' [] [\n form [] [\n Field.div [] [\n Label.label [] [ str \"Passwort\" ]\n Control.div [ Control.HasIconLeft ] [\n Input.password [\n Input.Id \"password\"\n Input.Value(String.fromOption model.Password)\n Input.OnChange(fun x ->\n ResetPasswordMsg.PasswordUpdated(String.toOption x.Value)\n |> ResetPassword\n |> dispatch\n )\n ]\n\n Icon.icon [ Icon.Size IsSmall; Icon.IsLeft ] [ Fa.i [ Fa.Solid.Key ] [] ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Passwort wiederholen\" ]\n Control.div [ Control.HasIconLeft ] [\n Input.password [\n Input.Id \"password_repeated\"\n Input.Value(String.fromOption model.PasswordRepeated)\n Input.OnChange(fun x ->\n ResetPasswordMsg.RepeatedPasswordUpdated(String.toOption x.Value)\n |> Msg.ResetPassword\n |> dispatch\n )\n ]\n\n Icon.icon [ Icon.Size IsSmall; Icon.IsLeft ] [ Fa.i [ Fa.Solid.Key ] [] ]\n ]\n ]\n Field.div [ Field.IsGroupedRight ] [\n Control.p [] [\n Button.button (buttonOptions model dispatch) [ str \"Passwort aktualisieren\" ]\n ]\n ]\n ]\n ]\n else\n noRequestView\n\n\n Hero.body [] [\n Container.container [] [\n Column.column [\n Column.Width(Screen.All, Column.Is6)\n Column.Offset(Screen.All, Column.Is3)\n ] [\n Heading.p [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ] [ str \"MySens - Passwort aktualisieren\" ]\n content\n ]\n ]\n ]\n\nlet view (model: Model) dispatch = Loadable.view (dataView dispatch) model\n\nlet update (msg: ResetPasswordMsg) (model: Model) =\n match msg, model with\n | RequestLoaded request, Loadable.Loading _ -> Loadable.Data(initDataModel request), Cmd.none\n | PasswordUpdated password, Loadable.Data data -> Loadable.Data { data with Password = password }, Cmd.none\n | RepeatedPasswordUpdated repeatedPassword, Loadable.Data data ->\n Loadable.Data { data with PasswordRepeated = repeatedPassword }, Cmd.none\n | ChangePassword password, Loadable.Data data ->\n let args = (data.ResetRequest.Value.Token, password)\n\n Loadable.Data { data with RequestRunning = true },\n Cmd.OfAsync.perform api.resetPassword args (ResetPasswordMsg.PasswordChanged >> ResetPassword)\n | PasswordChanged successful, Loadable.Data data ->\n if successful then\n let toastCmd =\n Toast.create \"Das Passwort wurde erfolgreich gespeichert\" |> Toast.success\n\n let routingCmd = Cmd.ofMsg (Clickable.goToRouteMsg Route.Home)\n\n Loadable.Data { data with RequestRunning = false }, Cmd.batch [ toastCmd; routingCmd ]\n else\n let toastCmd = Toast.create \"Ups, da ist ein Fehler aufgetreten\" |> Toast.error\n\n Loadable.Data { data with RequestRunning = false }, toastCmd\n | _, _ -> model, Cmd.none","namespace Client.Components.Graph\n\nopen Feliz.Recharts\nopen Shared.Infrastructure\nopen System\n\n[]\nmodule AxisTicks =\n let createYProperty (ticks: float list) =\n ticks |> List.toArray |> Interop.mkYAxisAttr \"ticks\"\n\n let rec generate includeZero delta (minValue: float) (maxValue: float) =\n let startDataValue = Math.Floor(minValue / delta) * delta\n\n let startValue =\n if includeZero && 0. < startDataValue then\n 0.\n else\n startDataValue\n\n\n let endValue = Math.Ceiling(maxValue / delta) * delta\n\n let roundTicks = List.map (Math.round 1)\n\n let ticks = [ startValue..delta..endValue ] |> roundTicks\n\n match ticks with\n | [ _ ] -> [ startValue..delta .. (startValue + 4. * delta) ] |> roundTicks\n | x when List.length x <= 2 -> generate includeZero (delta / 2.) minValue maxValue\n | x when List.length x > 6 -> generate includeZero (delta * 2.) minValue maxValue\n | _ -> ticks\n\n let generateBy (includeZero: bool) (delta: float) (valueFunc: 'a -> float) (data: 'a list) =\n let values = List.map valueFunc data\n\n let minValue = List.min values\n let maxValue = List.max values\n\n generate includeZero delta minValue maxValue\n\n let generateByWithMinMax\n (includeZero: bool)\n (delta: float)\n (valueFunc: 'a -> float)\n (min: float option)\n (max: float option)\n (data: 'a list)\n =\n let values = List.map valueFunc data\n\n let minValue =\n match min with\n | Some min -> List.min (min - 5. :: values)\n | None -> List.min values\n\n let maxValue =\n match max with\n | Some max -> List.max (max + 5. :: values)\n | None -> List.max values\n\n generate includeZero delta minValue maxValue\n\n let rec generateFixedStart delta (minValue: float) (maxValue: float) =\n let endValue = Math.Ceiling(maxValue / delta) * delta\n\n let roundTicks = List.map (Math.round 1)\n\n let ticks = [ minValue..delta..endValue ] |> roundTicks\n\n match ticks with\n | x when List.length x <= 2 -> generateFixedStart (delta / 2.) minValue maxValue\n | x when List.length x > 6 -> generateFixedStart (delta * 2.) minValue maxValue\n | _ -> ticks\n\n let generateFixedStartBy (minValue: float) (delta: float) (valueFunc: 'a -> float) (data: 'a list) =\n let values = List.map valueFunc data\n\n let maxValue = List.max values\n\n generateFixedStart delta minValue maxValue","namespace Client.Components\n\nopen System\nopen Client.Components.Graph.Recharts\nopen Fable.React\nopen Fable.React.Props\nopen Feliz\nopen Feliz.Recharts\nopen Fulma\nopen Fable.Core.JsInterop\n\nmodule GraphCommon =\n type SimpleGraphData<'a> = { Data: 'a list }\n\n let fullHeightGraphBoxClass = \"full-height-graph-box\"\n let halfHeightGraphBoxClass = \"half-height-graph-box\"\n\n let createBox (content: ReactElement list) =\n Column.column [ Column.Width(Screen.All, Column.IsFull) ] content\n\n let boxTitle (headline: string) =\n Heading.h3 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Option.Centered)\n ]\n ] [ str headline ]\n\n let private createBoxWithStringHeadline (headline: string) (content: ReactElement) =\n createBox [ boxTitle headline; content ]\n\n let graphWrapper (cssClass: string) (graph: ReactElement) =\n div [ Class cssClass ] [\n Recharts.responsiveContainer [\n responsiveContainer.debounce 1\n responsiveContainer.chart graph\n ]\n ]\n\n let graphBox (headline: string) (cssClass: string) (graph: ReactElement) =\n let graphWrapper = graphWrapper cssClass graph\n\n createBoxWithStringHeadline headline graphWrapper\n\n let fullHeightGraphBox (headline: string) (graph: ReactElement) =\n graphBox headline fullHeightGraphBoxClass graph\n\n let halfHeightGraphBox (headline: string) (graph: ReactElement) =\n graphBox headline halfHeightGraphBoxClass graph\n\n let currentDataLevelItem label value =\n Level.item [ Level.Item.HasTextCentered ] [\n div [] [\n Level.heading [] [ str label ]\n Level.title [] [ str value ]\n ]\n ]\n\n let temperatureToString = sprintf \"%.2f °C\"\n\n let percentageToString = sprintf \"%.2f %%\"\n\n let rainFallToString = sprintf \" %.1f mm\"\n\n let windSpeedToString = sprintf \" %.1f km/h\"\n\n let formatTimeTick (unixTimeStamp: float) =\n let localTime =\n DateTimeOffset.FromUnixTimeSeconds(int64 unixTimeStamp).ToLocalTime()\n\n localTime.ToString(\"dd.MM. HH:mm\")\n\n let xAxisTimeTickFormatter = xAxis.tickFormatter formatTimeTick\n\n let tooltipContent properties =\n let label = properties?label\n let values: obj[] option = properties?payload\n\n let header =\n DateTimeOffset.FromUnixTimeSeconds(int64 label)\n |> fun dto -> dto.ToLocalTime().ToString(\"dd.MM HH:mm\")\n\n match values with\n | Some values when not (Array.isEmpty values) ->\n let lines =\n Array.map\n (fun item ->\n let text = sprintf \"%s: %.2f\" item?name item?value\n\n p [ Style [ Color item?stroke ] ] [ str text ]\n )\n values\n\n div [ Class \"custom-tooltip\" ] [ h1 [] [ str header ]; yield! lines ]\n | _ -> div [] []\n\n let timestampToTicks (timestamp: DateTimeOffset) : int = timestamp.ToUnixTimeSeconds() |> int\n\n let tooltipContentWithForecast properties =\n let label = properties?label\n let values: obj[] option = properties?payload\n\n let header =\n DateTimeOffset.FromUnixTimeSeconds(int64 label)\n |> fun dto -> dto.ToLocalTime().ToString(\"dd.MM HH:mm\")\n\n\n match values with\n | Some values when not (Array.isEmpty values) ->\n let originalData = values[0]?payload\n\n let lines =\n Array.map\n (fun item ->\n let text = sprintf \"%s: %.2f\" item?name item?value\n\n p [ Style [ Color item?stroke ] ] [ str text ]\n )\n values\n\n div [ Class \"custom-tooltip\" ] [\n h1 [] [ str header ]\n\n if originalData?IsForecast then\n p [] [ str \"Prognosedaten\" ]\n else\n ()\n\n yield! lines\n ]\n | _ -> div [] []\n\n\n let forecastLineProps (now: DateTimeOffset) =\n let labelProps = [\n Interop.mkLabelAttr \"value\" \"Prognose\"\n Interop.mkLabelAttr \"position\" \"right\"\n ]\n\n let label =\n Interop.reactApi.createElement (import \"Label\" \"recharts\", createObj !!labelProps)\n\n [\n referenceLine.x (timestampToTicks now)\n referenceLine.label label\n referenceLine.isFront true\n referenceLine.strokeWidth 2\n referenceLine.stroke \"black\"\n ]\n\n let createFullColumn content =\n Column.column [ Column.Width(Screen.All, Column.IsFull) ] [ content ]\n\n let boxSubtitle (content: ReactElement list) =\n Heading.h5\n [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Option.Centered)\n ]\n Heading.IsSubtitle\n ]\n content\n\n let boxStringSubtitle label = boxSubtitle [ str label ]","module Client.Components.Graph.AirSensor\n\nopen System\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Feliz.Recharts\nopen Fulma\nopen Shared\nopen Shared.Dto.Dto\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.SensorGraphData\nopen Shared.Infrastructure\n\ntype AirSensorGraphNode = {\n Ticks: int\n Temperature: float\n HumidTemperature: float\n DewPoint: float\n AirHumidity: float\n LeafletWetness: int\n IsForecast: bool\n}\n\ntype AirSensorGraphData = {\n TemperatureAxis: float list\n HumidityAxis: float list\n Data: AirSensorGraphNode list\n CurrentTimestamp: DateTimeOffset\n}\n\nlet private createTemperatureAxisTicks (data: AirSensorGraphNode list) =\n let minValue =\n data\n |> List.map (fun graphNode ->\n [\n graphNode.Temperature\n graphNode.HumidTemperature\n graphNode.DewPoint\n ]\n |> List.min\n )\n |> List.min\n\n let maxValue =\n data\n |> List.map (fun graphNode ->\n [\n graphNode.Temperature\n graphNode.HumidTemperature\n graphNode.DewPoint\n ]\n |> List.max\n )\n |> List.max\n\n AxisTicks.generate false 5. minValue maxValue\n\nlet createAirSensorGraphData (data: AirSensorGraphNode list) =\n let temperatureAxisTicks = createTemperatureAxisTicks data\n\n let humidityAxis = [ 0. .. 20. .. 100. ]\n\n {\n TemperatureAxis = temperatureAxisTicks\n HumidityAxis = humidityAxis\n Data = data\n CurrentTimestamp = DateTimeOffset.Now\n }\n\nlet toAirSensorGraphData (data: GraphAirDataDto) = {\n Ticks = timestampToTicks data.TimeStamp\n Temperature = data.AirTemperature\n HumidTemperature = Math.Round(data.HumidTemperature, 2)\n DewPoint = Math.Round(data.DewPoint, 2)\n AirHumidity = data.AirHumidity\n LeafletWetness = leafletWetnessToInt data.LeafletWetness\n IsForecast = data.IsForecast\n}\n\nlet mapDataToAir (data: GraphDataDto) =\n match data with\n | Air airData -> Some airData\n | _ -> None\n\nlet graphDataDtoToAirGraphData data =\n data |> List.map toAirSensorGraphData |> createAirSensorGraphData\n\nlet currentAirDataBox (data: AirSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toShortString data.Date.LocalDateTime)\n currentDataLevelItem \"Akt. Temperatur\" (temperatureToString data.AirTemperature)\n currentDataLevelItem \"Akt. Luftfeuchtigkeit\" (percentageToString data.AirHumidity)\n currentDataLevelItem \"Min. Temperatur\" (DatedValue.toString temperatureToString data.MinAirTemperature)\n currentDataLevelItem \"Max. Temperatur\" (DatedValue.toString temperatureToString data.MaxAirTemperature)\n ]\n]\n\nlet airDataGraphs (graphData: AirSensorGraphData) =\n let ticks = AxisTicks.createYProperty graphData.TemperatureAxis\n\n let xDomain = xAxis.domain (domain.min, domain.max)\n\n let yDomain = yAxis.domain (domain.min, domain.max)\n\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let dataKey = (fun (p: AirSensorGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n\n let forecastLine = forecastLineProps graphData.CurrentTimestamp\n\n let temperatureChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [ ticks; yAxis.unit \" °C\"; yDomain ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.Temperature)\n line.name \"Temperatur [°C]\"\n line.stroke \"#FFC000\"\n ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.HumidTemperature)\n line.name \"Feuchttemperatur [°C]\"\n line.stroke \"#7030A0\"\n ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.DewPoint)\n line.name \"Taupunkt [°C]\"\n line.stroke \"#0071C1\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Temperatur\"\n\n let humidityYAxis = AxisTicks.createYProperty graphData.HumidityAxis\n\n let humidityChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n ]\n Recharts.yAxis [ yAxis.unit \"%\"; humidityYAxis ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.AirHumidity)\n line.name \"Luftfeuchtigkeit [%]\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Luftfeuchtigkeit\"\n\n let wetnessTicks = AxisTicks.createYProperty [ 0; 1 ]\n\n let leafletWetnessGraph =\n Recharts.areaChart [\n areaChart.syncId \"syncId1\"\n areaChart.data graphData.Data\n areaChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n ]\n Recharts.yAxis [\n yAxis.dataKey (fun (p: AirSensorGraphNode) -> p.LeafletWetness)\n yAxis.number\n wetnessTicks\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.area [\n area.fillOpacity 0.2\n area.dataKey (fun (p: AirSensorGraphNode) -> p.LeafletWetness)\n area.name \"Blattnässe\"\n ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> halfHeightGraphBox \"Verlauf der Blattnässe\"\n\n [\n temperatureChart\n humidityChart\n leafletWetnessGraph\n ]","module Client.Components.Graph.GroundSensor\n\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Feliz.Recharts\nopen Fulma\nopen Shared\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.SensorGraphData\nopen Shared.Infrastructure\n\n\ntype GroundSensorGraphNode = {\n Ticks: double\n Temperature: float\n SoilHumidity: float\n SoilConductivity: float\n}\n\ntype GroundSensorGraphData = {\n TemperatureAxisTicks: float list\n HumidityAxisTicks: float list\n ConductivityAxisTicks: float list\n Data: GroundSensorGraphNode list\n WetLimit: float option\n DryLimit: float option\n}\n\nlet createGroundSensorGraphData (wetLimit: float option) (dryLimit: float option) (data: GroundSensorGraphNode list) =\n let temperatureAxis =\n AxisTicks.generateBy true 5. (fun node -> node.Temperature) data\n\n let humidityAxis =\n AxisTicks.generateByWithMinMax true 5. (fun node -> node.SoilHumidity) dryLimit wetLimit data\n\n let conductivityAxis =\n AxisTicks.generateBy true 100. (fun node -> node.SoilConductivity) data\n\n {\n TemperatureAxisTicks = temperatureAxis\n HumidityAxisTicks = humidityAxis\n ConductivityAxisTicks = conductivityAxis\n WetLimit = wetLimit\n DryLimit = dryLimit\n Data = data\n }\n\nlet toGroundSensorGraphData (data: GraphSoilDataNodeDto) = {\n Ticks = data.TimeStamp.ToUnixTimeSeconds() |> double\n Temperature = data.SoilTemperature\n SoilHumidity = data.SoilHumidity\n SoilConductivity = data.SoilConductivity\n}\n\nlet mapDataToGround (data: GraphDataDto) =\n match data with\n | Soil groundData -> Some groundData\n | _ -> None\n\nlet graphDataDtoToGroundGraphData (data: GraphSoilDataDto) : GroundSensorGraphData =\n let list = data.Nodes |> List.map toGroundSensorGraphData\n\n createGroundSensorGraphData data.WetLimit data.DryLimit list\n\nlet currentGroundDataBox (data: GroundSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toShortString data.Date.LocalDateTime)\n currentDataLevelItem \"Akt. Bodenfeuchtigkeit\" (percentageToString data.GroundHumidity)\n currentDataLevelItem \"Akt. Temperatur\" (temperatureToString data.GroundTemperature)\n currentDataLevelItem \"Min. Bodenfeuchtigkeit\" (DatedValue.toString percentageToString data.MinGroundHumidity)\n currentDataLevelItem \"Max. Bodenfeuchtigkeit\" (DatedValue.toString percentageToString data.MaxGroundHumidity)\n ]\n]\n\nlet groundDataGraphs (graphData: GroundSensorGraphData) =\n let xStart = graphData.Data |> List.map (fun node -> node.Ticks) |> List.min\n\n let xDomain = xAxis.domain (domain.min, domain.max)\n\n let yDomain = yAxis.domain (domain.min, domain.max)\n\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let dataKey = (fun (p: GroundSensorGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let humidityAxisTicks = AxisTicks.createYProperty graphData.HumidityAxisTicks\n\n let limitAreas = [\n match graphData.DryLimit with\n | Some dryLimit ->\n Recharts.referenceArea [\n referenceArea.fillOpacity 0.3\n referenceArea.x1 xStart\n referenceArea.y1 0.\n referenceArea.y2 dryLimit\n referenceArea.label \"Trocken\"\n ]\n | None -> ()\n\n match graphData.WetLimit with\n | Some wetLimit ->\n Recharts.referenceArea [\n referenceArea.fillOpacity 0.3\n referenceArea.x1 xStart\n referenceArea.y1 wetLimit\n referenceArea.label \"Nass\"\n ]\n | None -> ()\n ]\n\n let humidityChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n yAxis.unit \"%\"\n yAxis.number\n humidityAxisTicks\n yAxis.tickCount 6\n yDomain\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.SoilHumidity)\n line.name \"Bodenfeuchtigkeit [%]\"\n line.stroke \"#01B0F1\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n yield! limitAreas\n ]\n ]\n |> fullHeightGraphBox \"Bodenfeuchtigkeit\"\n\n let temperatureAxisTicks = AxisTicks.createYProperty graphData.TemperatureAxisTicks\n\n let temperatureChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n yAxis.unit \" °C\"\n temperatureAxisTicks\n yDomain\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.Temperature)\n line.name \"Bodentemperatur [in °C]\"\n line.stroke \"#FFC000\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Bodentemperatur\"\n\n let conductivityAxisTicks =\n AxisTicks.createYProperty graphData.ConductivityAxisTicks\n\n let conductivityChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n yAxis.unit \" μS/cm\"\n conductivityAxisTicks\n yDomain\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.SoilConductivity)\n line.name \"Leitfähigkeit in [in μS/cm]\"\n line.stroke \"#EB9934\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Bodenleitfähigkeit\"\n\n [\n humidityChart\n temperatureChart\n conductivityChart\n ]","module Client.Components.Graph.RainFallSensor\n\nopen System\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Fable.React\nopen Feliz.Recharts\nopen Fulma\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.SensorGraphData\nopen Shared.Infrastructure\n\ntype RainFallSensorGraphNode = {\n Ticks: double\n AmountOfRain: float\n RainSum: float\n IsForecast: bool\n}\n\ntype RainFallSensorGraphData = {\n AmountOfRainAxisTicks: float list\n SumOfRainAxisTicks: float list\n TotalRainSum: float option\n FirstDateTime: DateTime\n LastDateTime: DateTime\n Data: RainFallSensorGraphNode list\n CurrentTimestamp: DateTimeOffset\n}\n\nlet createRainFallSensorGraphData\n (firstDateTime: DateTime)\n (lastDateTime: DateTime)\n (data: RainFallSensorGraphNode list)\n =\n let amountAxisTicks, sumAxisTicks, totalSum =\n if not (List.isEmpty data) then\n AxisTicks.generateBy true 1. (fun node -> node.AmountOfRain) data,\n AxisTicks.generateBy true 1. (fun node -> node.RainSum) data,\n data |> List.map (fun node -> node.RainSum) |> List.max |> Some\n else\n [], [], None\n\n {\n AmountOfRainAxisTicks = amountAxisTicks\n SumOfRainAxisTicks = sumAxisTicks\n TotalRainSum = totalSum\n FirstDateTime = firstDateTime\n LastDateTime = lastDateTime\n Data = data\n CurrentTimestamp = DateTimeOffset.Now\n }\n\nlet toRainFallSensorGraphData (data: GraphRainFallDataDto) = {\n Ticks = data.TimeStamp.ToUnixTimeSeconds() |> double\n AmountOfRain = Math.Round(data.CurrentRainFall, 2)\n RainSum = Math.Round(data.RainFallSum, 2)\n IsForecast = data.IsForecast\n}\n\nlet mapDataToRainFall (data: GraphDataDto) =\n match data with\n | RainFall rainFallData -> Some rainFallData\n | _ -> None\n\nlet graphDataDtoToRainFallGraphData (dtoList: GraphRainFallDataDto list) =\n let getLocalDateTime (f: GraphRainFallDataDto list -> GraphRainFallDataDto) =\n dtoList |> f |> (fun item -> item.TimeStamp) |> (fun dt -> dt.LocalDateTime)\n\n let firstDateTime = getLocalDateTime List.head |> DateTime.addMinutes -15\n let lastDateTime = getLocalDateTime List.last\n\n let nodes = List.map toRainFallSensorGraphData dtoList\n\n createRainFallSensorGraphData firstDateTime lastDateTime nodes\n\nlet currentRainfallDataBox (data: RainFallSensorData) = [\n let maybeRainFallToString = Option.map rainFallToString >> Option.defaultValue \"-\"\n\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Regen aktuell\" (rainFallToString data.CurrentRainFall)\n currentDataLevelItem \"Regen letzte Stunde\" (maybeRainFallToString data.RainFallLastHour)\n currentDataLevelItem \"Regen letzte 24 Stunden\" (maybeRainFallToString data.RainFallLast24h)\n ]\n]\n\nlet private createRainSumHeading (data: RainFallSensorGraphData) : (string * string) option =\n data.TotalRainSum\n |> Option.map (fun sum ->\n let first = sprintf \"Gesamt: %.1f mm\" sum\n\n let second =\n sprintf\n \"von %s bis %s\"\n (DateTime.toShortString data.FirstDateTime)\n (DateTime.toShortString data.LastDateTime)\n\n first, second\n )\n\nlet rainFallDataGraphs (graphData: RainFallSensorGraphData) =\n let amountAxisTicks = AxisTicks.createYProperty graphData.AmountOfRainAxisTicks\n\n let xDomain = xAxis.domain (domain.min, domain.max)\n\n let yDomain = yAxis.domain (domain.min, domain.max)\n\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let dataKey = (fun (p: RainFallSensorGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let yAxisWidth = 70\n\n let forecastLine = forecastLineProps graphData.CurrentTimestamp\n\n let rainFallChart =\n Recharts.barChart [\n barChart.data graphData.Data\n barChart.syncId \"syncId\"\n barChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n amountAxisTicks\n yAxis.dataKey (fun p -> p.AmountOfRain)\n yAxis.unit \"mm\"\n yAxis.number\n yDomain\n yAxis.width yAxisWidth\n ]\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.legend []\n\n Recharts.bar [\n bar.dataKey (fun p -> p.AmountOfRain)\n bar.name \"Regenmenge [mm/15 Minuten]\"\n bar.fill \"#0033FF\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> fullHeightGraphBox \"Regenmenge [mm/15 Minuten]\"\n\n let sumAxisTicks = AxisTicks.createYProperty graphData.SumOfRainAxisTicks\n\n let sumGraph =\n Recharts.areaChart [\n areaChart.data graphData.Data\n areaChart.syncId \"syncId\"\n areaChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n sumAxisTicks\n yAxis.allowDecimals false\n yAxis.dataKey (fun p -> p.RainSum)\n yAxis.unit \"mm\"\n yAxis.number\n yDomain\n yAxis.width yAxisWidth\n ]\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.legend []\n\n Recharts.area [\n area.dataKey (fun p -> p.RainSum)\n area.name \"Regenmenge [mm]\"\n area.fill \"#0033FF\"\n area.fillOpacity 0.3\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> graphWrapper fullHeightGraphBoxClass\n\n let header = [\n boxTitle \"Summe der Regenmenge\"\n\n match createRainSumHeading graphData with\n | Some(first, second) -> boxSubtitle [ p [] [ str first ]; p [] [ str second ] ]\n | None -> ()\n ]\n\n let sumChart = createBox (header @ [ sumGraph ])\n\n [ rainFallChart; sumChart ]","module Client.Components.Graph.LeafletMoistureSensor\n\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Feliz.Recharts\nopen Fulma\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.SensorGraphData\nopen Shared.Infrastructure\n\ntype LeafletMoistureGraphNode = {\n Ticks: double\n LeafletMoisture: float\n LeafletTemperature: float\n}\n\nlet toLeafletMoistureSensorGraphData (data: GraphLeafletMoistureDataDto) : LeafletMoistureGraphNode = {\n Ticks = data.TimeStamp.ToUnixTimeSeconds() |> double\n LeafletMoisture = data.LeafletMoisture\n LeafletTemperature = data.LeafletTemperature\n}\n\nlet mapDataToLeafletMoisture (data: GraphDataDto) =\n match data with\n | LeafletMoisture moistureData -> Some moistureData\n | _ -> None\n\nlet private createMoistureAxisTicks (data: LeafletMoistureGraphNode list) =\n let moisture = data |> List.map (fun i -> i.LeafletMoisture)\n\n let min = List.min moisture\n let max = List.max moisture\n\n AxisTicks.generate true 5. min max\n\nlet private createTemperatureAxisTicks (data: LeafletMoistureGraphNode list) =\n let moisture = data |> List.map (fun i -> i.LeafletTemperature)\n\n let min = List.min moisture\n let max = List.max moisture\n\n AxisTicks.generate true 5. min max\n\nlet leafletMoistureDataGraphs (graphData: SimpleGraphData) =\n let moistureYAxis =\n graphData.Data |> createMoistureAxisTicks |> AxisTicks.createYProperty\n\n let xDomain = xAxis.domain (domain.min, domain.max)\n let yDomain = yAxis.domain (domain.min, domain.max)\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let dataKey = (fun (p: LeafletMoistureGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let moistureChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n moistureYAxis\n yAxis.unit \"%\"\n yAxis.number\n yDomain\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.LeafletMoisture)\n line.name \"Blattnässe [%]\"\n line.stroke \"#01B0F1\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Blattnässe\"\n\n let temperatureYAxis =\n graphData.Data |> createTemperatureAxisTicks |> AxisTicks.createYProperty\n\n let temperatureChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [ temperatureYAxis; yAxis.unit \" °C\"; yDomain ]\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.legend []\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.LeafletTemperature)\n line.name \"Blatttemperatur [in °C]\"\n line.stroke \"#FFC000\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Blatttemperatur\"\n\n [ moistureChart; temperatureChart ]\n\nlet currentLeafletMoistureDataBox (data: LeafletMoistureSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Blattnässe\" (percentageToString data.LeafletMoisture)\n currentDataLevelItem \"Blatttemperatur\" (temperatureToString data.LeafletTemperature)\n ]\n]\n\nlet graphDataToLeafletMoistureData data : SimpleGraphData =\n data\n |> List.map toLeafletMoistureSensorGraphData\n |> (fun list -> { Data = list })","module Client.Components.Graph.SoilPhSensor\n\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Feliz.Recharts\nopen Fulma\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.SensorGraphData\nopen Shared.Infrastructure\n\ntype SoilPhGraphNode = {\n Ticks: double\n SoilPh: float\n SoilTemperature: float\n}\n\nlet toSoilPhSensorGraphData (data: GraphSoilPhDataDto) : SoilPhGraphNode = {\n Ticks = data.TimeStamp.ToUnixTimeSeconds() |> double\n SoilPh = data.SoilPh\n SoilTemperature = data.SoilTemperature\n}\n\nlet mapDataToSoilPh (data: GraphDataDto) =\n match data with\n | SoilPh data -> Some data\n | _ -> None\n\nlet currentSoilPhDataBox (data: SoilPhSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"PH-Wert\" (sprintf \"%.2f\" data.SoilPh)\n currentDataLevelItem \"Bodentemperatur\" (temperatureToString data.SoilTemperature)\n ]\n]\n\nlet private createSoilPhYAxisTicks (data: SoilPhGraphNode list) =\n let values = data |> List.map (fun item -> item.SoilPh)\n\n let min = List.min values\n let max = List.max values\n\n AxisTicks.generate true 1. min max\n\nlet private createSoilTemperatureYAxisTicks (data: SoilPhGraphNode list) =\n let values = data |> List.map (fun item -> item.SoilTemperature)\n\n let min = List.min values\n let max = List.max values\n\n AxisTicks.generate true 5. min max\n\nlet soilPhDataGraphs (graphData: SimpleGraphData) =\n let xDomain = xAxis.domain (domain.min, domain.max)\n let yDomain = yAxis.domain (domain.min, domain.max)\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let phYAxisTicks =\n graphData.Data |> createSoilPhYAxisTicks |> AxisTicks.createYProperty\n\n let dataKey = (fun (p: SoilPhGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let phChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [ yAxis.number; phYAxisTicks; yDomain ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.SoilPh)\n line.name \"PH-Wert\"\n line.stroke \"#cc9933\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Verlauf des PH-Werts\"\n\n let temperatureYAxisTicks =\n graphData.Data |> createSoilTemperatureYAxisTicks |> AxisTicks.createYProperty\n\n let temperatureChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n yAxis.unit \" °C\"\n temperatureYAxisTicks\n yDomain\n ]\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.legend []\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.SoilTemperature)\n line.name \"Bodentemperatur [in °C]\"\n line.stroke \"#FFC000\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Bodentemperatur\"\n\n [ phChart; temperatureChart ]\n\n\nlet graphDataToSoilPhGraphData data =\n data |> List.map toSoilPhSensorGraphData |> (fun list -> { Data = list })","module Client.Components.Graph.AverageWindSpeedSensor\n\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Feliz.Recharts\nopen Fulma\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.SensorGraphData\nopen Shared.Infrastructure\n\n\nlet currentAverageWindSpeedDataBox (data: AverageWindSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Akt. Windgeschwindigkeit Durchschnitt\" (windSpeedToString data.AverageWindSpeed)\n ]\n]\n\ntype AverageWindSpeedGraphNode = {\n Ticks: double\n AverageWindSpeed: float\n}\n\ntype AverageWindSpeedGraphsData = {\n Ticks: float list\n Data: AverageWindSpeedGraphNode list\n}\n\nlet toAverageWindSpeedSensorGraphData (data: GraphAverageWindSpeedDataDto) : AverageWindSpeedGraphNode = {\n Ticks = data.TimeStamp.ToUnixTimeSeconds() |> double\n AverageWindSpeed = data.AverageWindSpeed\n}\n\nlet mapDataToAverageWindSpeed (data: GraphDataDto) =\n match data with\n | AverageWindSpeed data -> Some data\n | _ -> None\n\nlet createAverageWindSpeedGraphsData (data: AverageWindSpeedGraphNode list) =\n let ticks =\n if not (List.isEmpty data) then\n AxisTicks.generateBy true 2.0 (fun node -> node.AverageWindSpeed) data\n else\n []\n\n {\n Ticks = ticks\n Data = data\n }\n\nlet graphDataToAverageWindSpeedGraphData data =\n data\n |> List.map toAverageWindSpeedSensorGraphData\n |> createAverageWindSpeedGraphsData\n\nlet averageWindSpeedDataGraphs (graphData: AverageWindSpeedGraphsData) =\n let ticks = AxisTicks.createYProperty graphData.Ticks\n\n let xDomain = xAxis.domain (domain.min, domain.max)\n\n let yDomain = yAxis.domain (domain.min, domain.max)\n\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let dataKey = (fun (p: AverageWindSpeedGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let averageWindSpeedChart =\n Recharts.barChart [\n barChart.syncId \"syncId1\"\n barChart.data graphData.Data\n barChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n yAxis.unit \"km/h\"\n yAxis.number\n ticks\n yDomain\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.bar [\n bar.dataKey (fun p -> p.AverageWindSpeed)\n bar.name \"Windgeschwindigkeit [km/h]\"\n bar.fill \"#663399\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Durchschnittliche Windgeschwindigkeit\"\n\n [ averageWindSpeedChart ]","module Client.Components.Graph.WeatherStation\n\nopen System\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Feliz.Recharts\nopen Fulma\nopen Shared\nopen Shared.Dto.Dto\nopen Shared.Dto.SensorGraphData\nopen Shared.DtoTypes.MapSensorData\nopen Shared.Infrastructure\n\ntype WeatherStationGraphNode = {\n Ticks: int\n Temperature: float\n HumidTemperature: float\n DewPoint: float\n AirHumidity: float\n LeafletWetness: int\n MaxWindSpeed: float\n AverageWindSpeed: float\n IsForecast: bool\n}\n\ntype WeatherStationGraphData = {\n TemperatureAxis: float list\n HumidityAxis: float list\n WindSpeedAxis: float list\n Data: WeatherStationGraphNode list\n CurrentTimestamp: DateTimeOffset\n}\n\nlet private createTemperatureAxisTicks (data: WeatherStationGraphNode list) =\n let minValue =\n data\n |> List.map (fun graphNode ->\n [\n graphNode.Temperature\n graphNode.HumidTemperature\n graphNode.DewPoint\n ]\n |> List.min\n )\n |> List.min\n\n let maxValue =\n data\n |> List.map (fun graphNode ->\n [\n graphNode.Temperature\n graphNode.HumidTemperature\n graphNode.DewPoint\n ]\n |> List.max\n )\n |> List.max\n\n AxisTicks.generate false 5. minValue maxValue\n\nlet private createWindSpeedAxisTicks (data: WeatherStationGraphNode list) =\n let minValue =\n data\n |> List.map (fun graphNode ->\n [\n graphNode.MaxWindSpeed\n graphNode.AverageWindSpeed\n ]\n |> List.min\n )\n |> List.min\n\n let maxValue =\n data\n |> List.map (fun graphNode ->\n [\n graphNode.MaxWindSpeed\n graphNode.AverageWindSpeed\n ]\n |> List.max\n )\n |> List.max\n\n AxisTicks.generate true 1. minValue maxValue\n\nlet private createWeatherStationGraphData (data: WeatherStationGraphNode list) =\n let temperatureAxisTicks = createTemperatureAxisTicks data\n let windSpeedAxisTicks = createWindSpeedAxisTicks data\n let humidityAxis = [ 0. .. 20. .. 100. ]\n\n {\n TemperatureAxis = temperatureAxisTicks\n HumidityAxis = humidityAxis\n WindSpeedAxis = windSpeedAxisTicks\n Data = data\n CurrentTimestamp = DateTimeOffset.Now\n }\n\nlet private toWeatherGraphData (data: GraphWeatherStationDataDto) = {\n Ticks = timestampToTicks data.TimeStamp\n Temperature = data.AirTemperature\n HumidTemperature = Math.Round(data.HumidTemperature, 2)\n DewPoint = Math.Round(data.DewPoint, 2)\n AirHumidity = data.AirHumidity\n LeafletWetness = leafletWetnessToInt data.LeafletWetness\n AverageWindSpeed = data.AverageWindSpeed\n MaxWindSpeed = data.MaxWindSpeed\n IsForecast = data.IsForecast\n}\n\nlet mapDataToWeatherStation (data: GraphDataDto) =\n match data with\n | WeatherStation weatherStationData -> Some weatherStationData\n | _ -> None\n\nlet graphDataDtoToWeatherStationGraphData data =\n data |> List.map toWeatherGraphData |> createWeatherStationGraphData\n\nlet currentWeatherStationDataBox (data: WeatherStationSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toShortString data.Date.LocalDateTime)\n currentDataLevelItem \"Akt. Temperatur\" (temperatureToString data.AirTemperature)\n currentDataLevelItem \"Akt. Luftfeuchtigkeit\" (percentageToString data.AirHumidity)\n currentDataLevelItem \"Min. Temperatur\" (DatedValue.toString temperatureToString data.MinTemperature)\n currentDataLevelItem \"Max. Temperatur\" (DatedValue.toString temperatureToString data.MaxTemperature)\n currentDataLevelItem\n \"Max. Windgeschwindigkeit\"\n (data.MaxWindSpeed\n |> Option.map (DatedValue.toString windSpeedToString)\n |> Option.defaultValue \"-\")\n currentDataLevelItem\n \"Durchschn. Windgeschwindigkeit\"\n (data.AverageWindSpeed |> Option.map windSpeedToString |> Option.defaultValue \"-\")\n ]\n]\n\nlet weatherStationDataGraphs (graphData: WeatherStationGraphData) =\n let temperatureTicks = AxisTicks.createYProperty graphData.TemperatureAxis\n\n let xDomain = xAxis.domain (domain.min, domain.max)\n\n let yDomain = yAxis.domain (domain.min, domain.max)\n\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let dataKey = (fun (p: WeatherStationGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let forecastLine = forecastLineProps graphData.CurrentTimestamp\n\n let temperatureChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [ temperatureTicks; yAxis.unit \" °C\"; yDomain ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.Temperature)\n line.name \"Temperatur [°C]\"\n line.stroke \"#FFC000\"\n ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.HumidTemperature)\n line.name \"Feuchttemperatur [°C]\"\n line.stroke \"#7030A0\"\n ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.DewPoint)\n line.name \"Taupunkt [°C]\"\n line.stroke \"#0071C1\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Temperatur\"\n\n let humidityYAxis = AxisTicks.createYProperty graphData.HumidityAxis\n\n let humidityChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n ]\n Recharts.yAxis [ yAxis.unit \"%\"; humidityYAxis ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.AirHumidity)\n line.name \"Luftfeuchtigkeit [%]\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Luftfeuchtigkeit\"\n\n let wetnessTicks = AxisTicks.createYProperty [ 0; 1 ]\n\n let leafletWetnessGraph =\n Recharts.areaChart [\n areaChart.syncId \"syncId1\"\n areaChart.data graphData.Data\n areaChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n ]\n Recharts.yAxis [\n yAxis.dataKey (fun (p: WeatherStationGraphNode) -> p.LeafletWetness)\n yAxis.number\n wetnessTicks\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.area [\n area.fillOpacity 0.2\n area.dataKey (fun (p: WeatherStationGraphNode) -> p.LeafletWetness)\n area.name \"Blattnässe\"\n ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> halfHeightGraphBox \"Verlauf der Blattnässe\"\n\n let windSpeedTicks = AxisTicks.createYProperty graphData.WindSpeedAxis\n\n let windSpeedChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [ windSpeedTicks; yAxis.unit \" km/h\"; yDomain ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.line [\n line.dot false\n line.dataKey (fun (p: WeatherStationGraphNode) -> p.AverageWindSpeed)\n line.name \"Durchschnittliche Windgeschwindigkeit [km/h]\"\n line.stroke \"#FFC000\"\n ]\n Recharts.line [\n line.dot false\n line.dataKey (fun (p: WeatherStationGraphNode) -> p.MaxWindSpeed)\n line.name \"Max. Windgeschwindigkeit [km/h]\"\n line.stroke \"#7030A0\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Windgeschwindigkeit\"\n\n [\n temperatureChart\n humidityChart\n leafletWetnessGraph\n windSpeedChart\n ]","module Client.Components.Graph.LiquidLevelSensor\n\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Client.Domain.MeasuredValueString\nopen Feliz.Recharts\nopen Fulma\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.SensorGraphData\nopen Shared.Infrastructure\n\ntype LiquidLevelGraphNode = {\n Ticks: double\n LiquidLevel: float\n}\n\nlet toLiquidLevelSensorGraphData (data: GraphLiquidLevelDataDto) : LiquidLevelGraphNode = {\n Ticks = data.TimeStamp.ToUnixTimeSeconds() |> double\n LiquidLevel = data.LiquidLevel\n}\n\nlet mapDataToLiquidLevel (data: GraphDataDto) =\n match data with\n | LiquidLevel data -> Some data\n | _ -> None\n\nlet currentLiquidLevelDataBox (data: LiquidLevelData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Füllstand\" (liquidLevelToString data.LiquidLevel)\n ]\n]\n\nlet private createLiquidLevelYAxisTicks (data: LiquidLevelGraphNode list) =\n let values = data |> List.map (fun item -> item.LiquidLevel)\n\n let min = List.min values\n let max = List.max values\n\n AxisTicks.generate true 5. min max\n\nlet liquidLevelGraphs (graphData: SimpleGraphData) =\n let xDomain = xAxis.domain (domain.min, domain.max)\n let yDomain = yAxis.domain (domain.min, domain.max)\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let liquidLevelYAxisTicks =\n graphData.Data |> createLiquidLevelYAxisTicks |> AxisTicks.createYProperty\n\n let dataKey = (fun (p: LiquidLevelGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let liquidLevelChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n yAxis.number\n liquidLevelYAxisTicks\n yDomain\n yAxis.unit \"mm\"\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.LiquidLevel)\n line.name \"Füllstand [mm]\"\n line.stroke \"#cc9933\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Verlauf des Füllstandes\"\n\n\n [ liquidLevelChart ]\n\nlet graphDataToLiquidLevelGraphData data =\n data |> List.map toLiquidLevelSensorGraphData |> (fun list -> { Data = list })","module Client.Components.Graph.SolarRadiationSensor\n\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Client.Domain.MeasuredValueString\nopen Feliz.Recharts\nopen Fulma\nopen Shared.Dto.MapSensorData\nopen Shared.Dto.SensorGraphData\nopen Shared.Infrastructure\n\ntype SolarRadiationGraphNode = {\n Ticks: double\n SolarRadiation: float\n}\n\nlet toSolarRadiationSensorGraphData (data: GraphSolarRadiationDataDto) : SolarRadiationGraphNode = {\n Ticks = data.TimeStamp.ToUnixTimeSeconds() |> double\n SolarRadiation = data.SolarRadiation\n}\n\nlet mapDataToSolarRadiation (data: GraphDataDto) =\n match data with\n | SolarRadiation data -> Some data\n | _ -> None\n\nlet currentSolarRadiationDataBox (data: SolarRadiationData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Globalstrahlung\" (solarRadiationToString data.SolarRadiation)\n ]\n]\n\nlet private createSolarRadiationYAxisTicks (data: SolarRadiationGraphNode list) =\n let values = data |> List.map (fun item -> item.SolarRadiation)\n\n let min = List.min values\n let max = List.max values\n\n AxisTicks.generate true 5. min max\n\nlet solarRadiationGraphs (graphData: SimpleGraphData) =\n let xDomain = xAxis.domain (domain.min, domain.max)\n let yDomain = yAxis.domain (domain.min, domain.max)\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let solarRadiationYAxisTicks =\n graphData.Data |> createSolarRadiationYAxisTicks |> AxisTicks.createYProperty\n\n let dataKey = (fun (p: SolarRadiationGraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let solarRadiationChart =\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.data graphData.Data\n lineChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n yAxis.number\n solarRadiationYAxisTicks\n yAxis.width 80\n yDomain\n yAxis.unit \"W/m²\"\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.line [\n line.dot false\n line.dataKey (fun p -> p.SolarRadiation)\n line.name \"Globalstrahlung [W/m²]\"\n line.stroke \"#cc9933\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> fullHeightGraphBox \"Verlauf der Globalstrahlung\"\n\n\n [ solarRadiationChart ]\n\nlet graphDataToSolarRadiationGraphData data =\n data\n |> List.map toSolarRadiationSensorGraphData\n |> (fun list -> { Data = list })","[]\nmodule Date.Local\n\nopen System\n\ntype Months =\n { January : string\n February : string\n March : string\n April : string\n May : string\n June : string\n July : string\n August : string\n September : string\n October : string\n November : string\n December : string }\n\ntype DaysOfWeek =\n { Monday : string\n Tuesday : string\n Wednesday : string\n Thursday : string\n Friday : string\n Saturday : string\n Sunday : string }\n\ntype Date =\n { Months : Months\n AbbreviatedMonths : Months\n Days : DaysOfWeek\n AbbreviatedDays : DaysOfWeek\n DefaultFormat : string\n FirstDayOfTheWeek : DayOfWeek }\n\ntype Time =\n { AM : string\n PM : string }\n\ntype Localization =\n { Date : Date\n Time : Time }\n\nlet englishUK =\n { Date =\n { Months =\n { January = \"January\"\n February = \"February\"\n March = \"March\"\n April = \"April\"\n May = \"May\"\n June = \"June\"\n July = \"July\"\n August = \"August\"\n September = \"September\"\n October = \"October\"\n November = \"November\"\n December = \"December\" }\n AbbreviatedMonths =\n { January = \"Jan\"\n February = \"Feb\"\n March = \"Mar\"\n April = \"Apr\"\n May = \"May\"\n June = \"Jun\"\n July = \"Jul\"\n August = \"Aug\"\n September = \"Sep\"\n October = \"Oct\"\n November = \"Nov\"\n December = \"Dec\" }\n Days =\n { Monday = \"Monday\"\n Tuesday = \"Tuesday\"\n Wednesday = \"Wednesday\"\n Thursday = \"Thursday\"\n Friday = \"Friday\"\n Saturday = \"Saturday\"\n Sunday = \"Sunday\" }\n AbbreviatedDays =\n { Monday = \"Mon\"\n Tuesday = \"Tue\"\n Wednesday = \"Wed\"\n Thursday = \"Thu\"\n Friday = \"Fri\"\n Saturday = \"Sat\"\n Sunday = \"Sun\" }\n DefaultFormat = \"d/M/yyyy\"\n FirstDayOfTheWeek = DayOfWeek.Monday }\n Time =\n { AM = \"AM\"\n PM = \"PM\" } }\n\nlet englishUS =\n { Date =\n { Months =\n { January = \"January\"\n February = \"February\"\n March = \"March\"\n April = \"April\"\n May = \"May\"\n June = \"June\"\n July = \"July\"\n August = \"August\"\n September = \"September\"\n October = \"October\"\n November = \"November\"\n December = \"December\" }\n AbbreviatedMonths =\n { January = \"Jan\"\n February = \"Feb\"\n March = \"Mar\"\n April = \"Apr\"\n May = \"May\"\n June = \"Jun\"\n July = \"Jul\"\n August = \"Aug\"\n September = \"Sep\"\n October = \"Oct\"\n November = \"Nov\"\n December = \"Dec\" }\n Days =\n { Monday = \"Monday\"\n Tuesday = \"Tuesday\"\n Wednesday = \"Wednesday\"\n Thursday = \"Thursday\"\n Friday = \"Friday\"\n Saturday = \"Saturday\"\n Sunday = \"Sunday\" }\n AbbreviatedDays =\n { Monday = \"Mon\"\n Tuesday = \"Tue\"\n Wednesday = \"Wed\"\n Thursday = \"Thu\"\n Friday = \"Fri\"\n Saturday = \"Sat\"\n Sunday = \"Sun\" }\n DefaultFormat = \"M/d/yyyy\"\n FirstDayOfTheWeek = DayOfWeek.Sunday }\n Time =\n { AM = \"AM\"\n PM = \"PM\" } }\n\nlet french =\n { Date =\n { Months =\n { January = \"Janvier\"\n February = \"Février\"\n March = \"Mars\"\n April = \"Avril\"\n May = \"Mai\"\n June = \"Juin\"\n July = \"Juillet\"\n August = \"Août\"\n September = \"Septembre\"\n October = \"Octobre\"\n November = \"Novembre\"\n December = \"Décembre\" }\n AbbreviatedMonths =\n { January = \"Jan\"\n February = \"Fév\"\n March = \"Mars\"\n April = \"Avr\"\n May = \"Mai\"\n June = \"Jui\"\n July = \"Juil\"\n August = \"Août\"\n September = \"Sep\"\n October = \"Oct\"\n November = \"Nov\"\n December = \"Dec\" }\n Days =\n { Monday = \"Lundi\"\n Tuesday = \"Mardi\"\n Wednesday = \"Mercredi\"\n Thursday = \"Jeudi\"\n Friday = \"Vendredi\"\n Saturday = \"Samedi\"\n Sunday = \"Dimanche\" }\n AbbreviatedDays =\n { Monday = \"Lun\"\n Tuesday = \"Mar\"\n Wednesday = \"Mer\"\n Thursday = \"Jeu\"\n Friday = \"Ven\"\n Saturday = \"Sam\"\n Sunday = \"Dim\" }\n DefaultFormat = \"d/M/yyyy\"\n FirstDayOfTheWeek = DayOfWeek.Monday }\n Time =\n { AM = \"\"\n PM = \"\" } }\n\nlet russian =\n { Date =\n { Months =\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 AbbreviatedMonths =\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 Days =\n { Monday = \"Понедельник\"\n Tuesday = \"Вторник\"\n Wednesday = \"Среда\"\n Thursday = \"Четверг\"\n Friday = \"Пятница\"\n Saturday = \"Суббота\"\n Sunday = \"Воскресенье\" }\n AbbreviatedDays =\n { Monday = \"Пон\"\n Tuesday = \"Втр\"\n Wednesday = \"Срд\"\n Thursday = \"Чтв\"\n Friday = \"Птн\"\n Saturday = \"Сбт\"\n Sunday = \"Вск\" }\n DefaultFormat = \"d.M.yyyy\"\n FirstDayOfTheWeek = DayOfWeek.Monday }\n Time =\n { AM = \"\"\n PM = \"\" } }\n\nlet hungarian =\n { Date =\n { Months =\n { January = \"Január\"\n February = \"Február\"\n March = \"Március\"\n April = \"Április\"\n May = \"Május\"\n June = \"Június\"\n July = \"Július\"\n August = \"Augusztus\"\n September = \"Szeptember\"\n October = \"Október\"\n November = \"November\"\n December = \"December\" }\n AbbreviatedMonths =\n { January = \"Jan\"\n February = \"Feb\"\n March = \"Márc\"\n April = \"Ápr\"\n May = \"Máj\"\n June = \"Jún\"\n July = \"Júl\"\n August = \"Aug\"\n September = \"Szept\"\n October = \"Okt\"\n November = \"Nov\"\n December = \"Dec\" }\n Days =\n { Monday = \"Hétfő\"\n Tuesday = \"Kedd\"\n Wednesday = \"Szerda\"\n Thursday = \"Csütörtök\"\n Friday = \"Péntek\"\n Saturday = \"Szombat\"\n Sunday = \"Vasárnap\" }\n AbbreviatedDays =\n { Monday = \"Hét\"\n Tuesday = \"Kedd\"\n Wednesday = \"Sze\"\n Thursday = \"Csüt\"\n Friday = \"Pén\"\n Saturday = \"Szo\"\n Sunday = \"Vas\" }\n DefaultFormat = \"yyyy.MM.dd.\"\n FirstDayOfTheWeek = DayOfWeek.Monday }\n Time =\n { AM = \"de\"\n PM = \"du\" } }\n\n\nlet german =\n { Date =\n { Months =\n { January = \"Januar\"\n February = \"Februar\"\n March = \"März\"\n April = \"April\"\n May = \"Mai\"\n June = \"Juni\"\n July = \"Juli\"\n August = \"August\"\n September = \"September\"\n October = \"Oktober\"\n November = \"November\"\n December = \"Dezember\" }\n AbbreviatedMonths =\n { January = \"Jan\"\n February = \"Feb\"\n March = \"März\"\n April = \"Apr\"\n May = \"Mai\"\n June = \"Juni\"\n July = \"Juli\"\n August = \"Aug\"\n September = \"Sept\"\n October = \"Okt\"\n November = \"Nov\"\n December = \"Dez\" }\n Days =\n { Monday = \"Montag\"\n Tuesday = \"Dienstag\"\n Wednesday = \"Mittwoch\"\n Thursday = \"Donnerstag\"\n Friday = \"Freitag\"\n Saturday = \"Samstag\"\n Sunday = \"Sonntag\" }\n AbbreviatedDays =\n { Monday = \"Mo\"\n Tuesday = \"Di\"\n Wednesday = \"Mi\"\n Thursday = \"Do\"\n Friday = \"Fr\"\n Saturday = \"Sa\"\n Sunday = \"So\" }\n DefaultFormat = \"dd.MM.yyyy\"\n FirstDayOfTheWeek = DayOfWeek.Monday }\n Time =\n { AM = \"\"\n PM = \"\" } }\n","namespace Fulma.Elmish.DatePicker\n\nopen System\nopen Fable.React.Props\n\nmodule Types =\n\n type State =\n { Today : DateTime option\n InputFocused : bool\n ReferenceDate : DateTime\n AutoClose : bool\n ForceClose : bool\n TitleFormat : string\n ShowDeleteButton : bool }\n\n let defaultState =\n { Today = None\n InputFocused = false\n ReferenceDate = DateTime.UtcNow\n AutoClose = false\n ForceClose = false\n TitleFormat = \"\"\n ShowDeleteButton = false }\n\n type Config<'Msg> =\n { OnChange : State * (DateTime option) -> 'Msg\n Local : Date.Local.Localization\n DatePickerStyle : CSSProp list }\n\n let defaultConfig onChangeMsg =\n { OnChange = onChangeMsg\n Local = Date.Local.englishUK\n DatePickerStyle = [ Position PositionOptions.Absolute\n MaxWidth \"450px\" ] }\n\n type Msg =\n | NoOp\n\n type Model =\n { CurrentDate : DateTime }\n","namespace Client.Components\n\nopen System\n\nmodule DateRangePicker =\n type Data = {\n DeltaLimit: TimeSpan option\n\n Start: DateTime option\n StartLimit: DateTime option\n\n End: DateTime option\n EndLimit: DateTime option\n FixedEndLimit: DateTime\n }\n\n let updateLimits (data: Data) =\n match (data.Start, data.DeltaLimit) with\n | Some start, Some delta ->\n let startLimit = start - delta\n\n let endLimit = min (start + delta) data.FixedEndLimit\n\n {\n data with\n StartLimit = Some startLimit\n EndLimit = Some endLimit\n }\n | _, _ -> {\n data with\n StartLimit = None\n EndLimit = Some data.FixedEndLimit\n }\n\n\n let updateData (dates: DateTime list) (data: Data) =\n let updateStartEnd =\n fun (data: Data) startDate endDate -> {\n data with\n Start = startDate\n End = endDate\n }\n\n let newData =\n match List.length dates with\n | 2 -> updateStartEnd data (Some dates.[0]) (Some dates.[1])\n | 1 -> updateStartEnd data (Some dates.[0]) None\n | 0 -> updateStartEnd data None None\n | _ -> raise <| Exception \"More than 2 dates selected\"\n\n updateLimits newData\n\n let view (placeHolder: string) callback (data: Data) =\n let selectedRange = [ data.Start; data.End ] |> List.choose id |> Array.ofList\n\n let flatpickrOptions = [\n Flatpickr.custom \"defaultDate\" selectedRange true\n Flatpickr.Placeholder placeHolder\n Flatpickr.Locale Flatpickr.Locales.german\n Flatpickr.DateFormat \"d.m.Y\"\n Flatpickr.SelectionMode Flatpickr.Mode.Range\n Flatpickr.OnManyChanged callback\n Flatpickr.ClassName \"input\"\n ]\n\n let flatpickrOptions =\n match data.StartLimit with\n | Some limit -> (Flatpickr.MinimumDate limit) :: flatpickrOptions\n | None -> flatpickrOptions\n\n let flatpickrOptions =\n match data.EndLimit with\n | Some limit -> Flatpickr.MaximumDate limit :: flatpickrOptions\n | None -> flatpickrOptions\n\n Flatpickr.flatpickr flatpickrOptions\n\n let initWithRange startDate endDate deltaLimit hasForecast =\n let endLimit =\n if hasForecast = true then\n (DateTime.Now.AddDays 2).Date\n else\n DateTime.Now.Date\n\n {\n DeltaLimit = Some deltaLimit\n\n Start = Some startDate\n StartLimit = None\n\n End = Some endDate\n EndLimit = Some endLimit\n FixedEndLimit = endLimit\n }\n\n let initWithOneWeek deltaLimit =\n let startDate = (DateTime.Now.Date.AddDays -7.)\n\n let endDate = DateTime.Now.Date\n\n initWithRange startDate endDate deltaLimit false\n\n let initWithTwoDays deltaLimit =\n let startDate = (DateTime.Now.Date.AddDays -1.)\n\n let endDate = DateTime.Now.Date\n\n initWithRange startDate endDate deltaLimit false\n\n let initWithTwoDaysAndForecast deltaLimit =\n let startDate = (DateTime.Now.Date.AddDays -1.)\n\n let endDate = (DateTime.Now.AddDays 1.).Date\n\n initWithRange startDate endDate deltaLimit true\n\n\n let init deltaLimit =\n let startDate = (DateTime.Now.Date - deltaLimit)\n\n let endDate = DateTime.Now.Date\n\n initWithRange startDate endDate deltaLimit false","module Feliz.Bulma.ElementBuilders\r\n\r\nopen Feliz\r\nopen Feliz.Bulma\r\n\r\nmodule Helpers =\r\n let [] private ClassName = \"className\"\r\n\r\n let inline internal getClasses (xs:IReactProperty list) =\r\n xs\r\n |> List.choose (unbox >> function\r\n | (k, v) when k = ClassName -> Some (string v)\r\n | _ -> None)\r\n\r\n let extractClasses (xs:IReactProperty list) =\r\n xs\r\n |> List.rev\r\n |> List.fold (fun (classes, props) x ->\r\n match unbox x with\r\n | (k, v) when k = ClassName -> string v :: classes, props\r\n | _ -> classes, x :: props) ([], [])\r\n\r\n let combineClasses cn (xs:IReactProperty list) =\r\n xs\r\n |> extractClasses\r\n |> fun (classes, props) -> (cn :: classes |> prop.classes) :: props\r\n\r\nmodule Div =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.div (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.div [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.div [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.div [ prop.className cn; prop.text value ]\r\n\r\nmodule Nav =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.nav (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.nav [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule Article =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.article (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.article [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule Section =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.section (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.section [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule Footer =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.footer (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.footer [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule Label =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.label (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.label [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.label [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.label [ prop.className cn; prop.text value ]\r\n\r\nmodule Input =\r\n let inline propsWithType (cn:string) (typ: IReactProperty) (xs:IReactProperty list) =\r\n Html.input (typ :: Helpers.combineClasses cn xs)\r\n\r\nmodule Textarea =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.textarea (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.textarea [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule Button =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.button (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.button [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.button [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.button [ prop.className cn; prop.text value ]\r\n\r\nmodule Span =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.span (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.span [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.span [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.span [ prop.className cn; prop.text value ]\r\n\r\nmodule Figure =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.figure (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.figure [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule Progress =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.progress (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.progress [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.progress [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.progress [ prop.className cn; prop.text value ]\r\n\r\nmodule Table =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.table (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.table [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule H1 =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.h1 (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.h1 [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.h1 [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.h1 [ prop.className cn; prop.text value ]\r\n\r\nmodule H2 =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.h2 (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.h2 [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.h2 [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.h2 [ prop.className cn; prop.text value ]\r\n\r\nmodule H3 =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.h3 (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.h3 [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.h3 [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.h3 [ prop.className cn; prop.text value ]\r\n\r\nmodule H4 =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.h4 (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.h4 [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.h4 [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.h4 [ prop.className cn; prop.text value ]\r\n\r\nmodule H5 =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.h5 (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.h5 [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.h5 [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.h5 [ prop.className cn; prop.text value ]\r\n\r\nmodule H6 =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.h6 (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.h6 [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.h6 [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.h6 [ prop.className cn; prop.text value ]\r\n\r\nmodule Hr =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.hr (Helpers.combineClasses cn xs)\r\n\r\nmodule Aside =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.aside (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.aside [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule P =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.p (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.p [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.p [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.p [ prop.className cn; prop.text value ]\r\n\r\nmodule Ul =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.ul (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.ul [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule Li =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.li (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.li [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule Header =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.header (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.header [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n\r\nmodule A =\r\n let inline props (cn:string) (xs:IReactProperty list) = Html.a (Helpers.combineClasses cn xs)\r\n let inline children (cn:string) (children:seq) = Html.a [ prop.className cn; prop.children children ]\r\n let inline valueElm (cn:string) (value:ReactElement) = value |> List.singleton |> children cn\r\n let inline valueStr (cn:string) (value:string) = Html.a [ prop.className cn; prop.text value ]\r\n let inline valueInt (cn:string) (value:int) = Html.a [ prop.className cn; prop.text value ]\r\n","module Client.Components.DateRangeSelect\n\nopen System\nopen Fable.React.Props\nopen Fable.React.Helpers\nopen Fable.React.Standard\nopen Fulma\nopen Fable.React\nopen Shared.DtoTypes.DateRangeDto\n\nlet getDateRange (currentTime: DateTime) (range: DateRangeOption) : DateTime * DateTime =\n range.StartTime currentTime, range.EndTime currentTime\n\n\nlet private toSelectOption (range: DateRangeOption) =\n option [ Value range.Id ] [ str range.Label ]\n\nlet private findRangeOption (availableRanges: DateRangeOption list) (id: string) =\n List.find (fun range -> range.Id = id) availableRanges\n\nlet view (selectedRange: DateRangeOption) (onChange: DateRangeOption -> unit) (availableRanges: DateRangeOption list) =\n let options = List.map toSelectOption availableRanges\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue selectedRange.Id\n OnChange(fun event -> event.Value |> findRangeOption availableRanges |> onChange)\n ]\n options\n ]","module Client.Page.User.MapSensorDataPage\n\nopen Client.Components.Graph.SoilPhSensor\nopen Client.Components.Graph.WeatherStation\nopen Client.Components.GraphCommon\nopen Client.Domain\nopen Client.DomainTypes\nopen Client.Infrastructure\nopen Client.InfrastructureTypes\nopen Fable.FontAwesome\nopen Fable.React.Props\nopen Fable.Remoting.Client\nopen Client\nopen Client.Components\nopen Fable.React\nopen Feliz.Bulma\nopen Microsoft.FSharp.Collections\nopen Shared\nopen System\nopen Client.Infrastructure.Api\nopen Elmish\nopen Client.DomainTypes.Msg\nopen Client.Components.Graph.AirSensor\nopen Client.Components.Graph.GroundSensor\nopen Client.Components.Graph.RainFallSensor\nopen Client.Components.Graph.LeafletMoistureSensor\nopen Client.Components.Graph.AverageWindSpeedSensor\nopen Client.Components.Graph.LiquidLevelSensor\nopen Client.Components.Graph.SolarRadiationSensor\nopen Client.Domain.PageSkeleton\nopen Fulma\nopen Fulma.Elmish\nopen Shared.Dto\nopen Shared.Dto.Dto\nopen Shared.Dto.MapSensorData\n\nopen Feliz\nopen Shared.Dto.SensorGraphData\nopen Shared.DtoTypes.DateRangeDto\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\nmodule R = Standard\nmodule P = Fable.React.Props\n\n\ntype SensorGraphDataList =\n | AirList of AirSensorGraphData\n | GroundList of GroundSensorGraphData\n | RainFallList of RainFallSensorGraphData\n | LeafletMoistureList of SimpleGraphData\n | SoilPhList of SimpleGraphData\n | AverageWindSpeedList of AverageWindSpeedGraphsData\n | WeatherStationList of WeatherStationGraphData\n | LiquidLevelList of SimpleGraphData\n | SolarRadiationList of SimpleGraphData\n\ntype DatePickerModel = {\n State: DatePicker.Types.State\n CurrentDate: DateTime option\n}\n\ntype HistoryGraphData =\n | NotLoaded\n | NoData\n | Data of SensorGraphDataList\n\ntype DataModel = {\n Session: UserSession\n Name: string\n Location: Location\n SensorId: int\n CurrentData: MapSensorData\n GraphRequestRunning: bool\n DownloadRequestRunning: bool\n DownloadRange: DateRangeOption\n AvailableDownloadRanges: DateRangeOption list\n GraphDateRange: SensorDetailPage.GraphVisualisation\n HistoryGraphData: HistoryGraphData\n}\n\ntype PageModel =\n | NotFound\n | NotActive\n | NotAllowed\n | NotAuthenticated\n | Data of DataModel\n\ntype Model = Loadable\n\nlet init id (session: UserSession) : Model * Cmd =\n let requestData = {\n SessionKey = session.SessionKey\n Data = id\n }\n\n let cmd =\n Cmd.OfAsync.perform api.getSensorDetailPageData requestData (MySensSensorMsg.PageDataReceived >> MapSensorData)\n\n Loadable.Loading session, cmd\n\nlet pageDataToDataModel (session: UserSession) (data: SensorDetailPage.Data) : DataModel =\n let graphDateRange =\n SensorDetailPage.mapGraphVisualisation DateRangePicker.initWithTwoDays data.Visualisations\n (*match (SensorType.fromModel data.SensorModel) with\n | SensorType.Air\n | SensorType.RainFall\n | SensorType.WeatherStation ->\n SensorDetailPage.mapGraphVisualisation DateRangePicker.initWithTwoDaysAndForecast data.Visualisations\n | SensorType.Soil\n | SensorType.LeafletMoisture\n | SensorType.WindAverage\n | SensorType.PH -> SensorDetailPage.mapGraphVisualisation DateRangePicker.initWithTwoDays data.Visualisations*)\n\n let dateRanges = data.DownloadRangeIds |> List.choose getRangeFromId\n\n {\n Session = session\n Name = data.Name\n SensorId = data.Id\n CurrentData = data.CurrentData\n Location = data.Location\n GraphRequestRunning = false\n DownloadRequestRunning = false\n DownloadRange = List.head dateRanges\n AvailableDownloadRanges = dateRanges\n GraphDateRange = graphDateRange\n HistoryGraphData = NotLoaded\n }\n\nlet onDetailPageDataReceived session (response: SensorDetailPage.Response) : PageModel =\n match response with\n | SensorDetailPage.Response.NotFound -> PageModel.NotFound\n | SensorDetailPage.Response.Unauthenticated -> PageModel.NotAuthenticated\n | SensorDetailPage.Response.Unauthorized -> PageModel.NotAllowed\n | SensorDetailPage.Response.NotActive -> PageModel.NotActive\n | SensorDetailPage.Response.Data data -> PageModel.Data(pageDataToDataModel session data)\n\n\nlet createHistoricRequestData (sensor: int) (startDate: DateTime) (endDate: DateTime) = {\n Range = {\n Start = startDate\n End = endDate\n }\n\n SensorId = sensor\n}\n\nlet createRequestHistoricDataCmd data =\n Cmd.OfAsync.perform api.getHistoricMapSensorData data (MySensSensorMsg.HistoricDataReceived >> MapSensorData)\n\nlet toDatePickerModel (newState: DatePicker.Types.State) (date: DateTime option) = {\n State = newState\n CurrentDate = date\n}\n\n\nlet toGraphDataList (data: GraphDataDto) =\n if isGraphDataEmpty data then\n NoData\n else\n let graphData =\n match data with\n | Air airData -> airData |> graphDataDtoToAirGraphData |> AirList\n | Soil soilData -> soilData |> graphDataDtoToGroundGraphData |> GroundList\n | RainFall rainFallData -> rainFallData |> graphDataDtoToRainFallGraphData |> RainFallList\n | LeafletMoisture leafletMoistureData ->\n leafletMoistureData |> graphDataToLeafletMoistureData |> LeafletMoistureList\n | SoilPh soilPhData -> soilPhData |> graphDataToSoilPhGraphData |> SoilPhList\n | AverageWindSpeed averageWindSpeedData ->\n averageWindSpeedData\n |> graphDataToAverageWindSpeedGraphData\n |> AverageWindSpeedList\n | WeatherStation data -> data |> graphDataDtoToWeatherStationGraphData |> WeatherStationList\n | LiquidLevel liquidLevelData -> liquidLevelData |> graphDataToLiquidLevelGraphData |> LiquidLevelList\n | SolarRadiation data -> data |> graphDataToSolarRadiationGraphData |> SolarRadiationList\n\n HistoryGraphData.Data graphData\n\nlet private createExcelFileName (requestData: SensorDataRequest) (data: DataModel) =\n let startFileName = DateTime.toDateFileNameString requestData.Range.Start\n let endFileName = DateTime.toDateFileNameString requestData.Range.End\n\n let rangeFileNamePart =\n if startFileName = endFileName then\n startFileName\n else\n sprintf \"%s-%s\" startFileName endFileName\n\n sprintf \"%s_%s.xlsx\" data.Name rangeFileNamePart\n\n\nlet update (msg: MySensSensorMsg) (model: Model) : Model * Cmd =\n match msg, model with\n | PageDataReceived response, Loadable.Loading loadingModel ->\n let dataModel = onDetailPageDataReceived loadingModel response\n\n match dataModel with\n | Data data ->\n match data.GraphDateRange with\n | SensorDetailPage.Allowed _ ->\n let now = DateTime.Now\n\n let startDate = now |> DateTime.addDays -1 |> DateTime.startOfDay\n let endDate = now |> DateTime.addDays 1 |> DateTime.startOfDay\n\n let requestData = createHistoricRequestData data.SensorId startDate endDate\n\n Loadable.Data(Data { data with GraphRequestRunning = true }),\n Cmd.OfAsync.perform\n api.getHistoricMapSensorData\n requestData\n (MySensSensorMsg.HistoricDataReceived >> MapSensorData)\n | SensorDetailPage.NotAllowed -> Loadable.Data dataModel, Cmd.none\n | _ -> Loadable.Data dataModel, Cmd.none\n | HistoricDataReceived historicData, Loadable.Data(Data data) ->\n let newGraphData = toGraphDataList historicData\n\n let newData = {\n data with\n HistoryGraphData = newGraphData\n GraphRequestRunning = false\n }\n\n Loadable.Data(Data newData), Cmd.none\n | DownloadDateRangeChanged selectedRange, Loadable.Data(Data data) ->\n Loadable.Data(Data { data with DownloadRange = selectedRange }), Cmd.none\n | MySensSensorMsg.GraphDateRangeChanged dates, Loadable.Data(Data data) ->\n let newGraphDateRange =\n SensorDetailPage.mapGraphVisualisation (DateRangePicker.updateData dates) data.GraphDateRange\n\n Loadable.Data(Data { data with GraphDateRange = newGraphDateRange }), Cmd.none\n | MySensSensorMsg.RequestData requestData, Loadable.Data(Data data) ->\n Loadable.Data(Data { data with GraphRequestRunning = true }), createRequestHistoricDataCmd requestData\n | StartDownload requestData, Loadable.Data(Data data) ->\n let authenticatedRequest = {\n SessionKey = data.Session.SessionKey\n Data = requestData\n }\n\n let data = Loadable.Data(Data { data with DownloadRequestRunning = true })\n\n let cmd =\n Cmd.OfAsync.either\n api.downloadMapSensorData\n authenticatedRequest\n (fun response -> MySensSensorMsg.DownloadFinished(requestData, response) |> MapSensorData)\n (fun _ -> MySensSensorMsg.DownloadFailed |> MapSensorData)\n\n data, cmd\n | MySensSensorMsg.DownloadFinished(requestData, response: AuthenticatedResponse), Loadable.Data(Data data) ->\n let cmd =\n match response with\n | Result.Ok responseData ->\n let fileName = createExcelFileName requestData data\n\n responseData.SaveFileAs(fileName, \"application/vnd.ms-excel\")\n\n Cmd.none\n | Result.Error _ -> Toast.create \"Ein Fehler ist aufgetreten beim Herunterladen\" |> Toast.error\n\n Loadable.Data(Data { data with DownloadRequestRunning = false }), cmd\n | MySensSensorMsg.DownloadFailed, Loadable.Data(Data data) ->\n let cmd =\n Toast.create \"Ein Fehler ist aufgetreten beim Laden der Daten\" |> Toast.error\n\n Loadable.Data(Data { data with DownloadRequestRunning = false }), cmd\n | _ -> model, Cmd.none\n\nlet currentDataBox (data: MapSensorData) = [\n (Heading.h3 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Option.Centered)\n ]\n ] [ str \"Aktuelle Daten\" ])\n\n yield!\n match data with\n | NoDataAvailable\n | NoPublicData -> []\n | AirData air -> currentAirDataBox air\n | GroundData ground -> currentGroundDataBox ground\n | RainFallData rainFall -> currentRainfallDataBox rainFall\n | LeafletMoistureData leafletMoistureSensorData -> currentLeafletMoistureDataBox leafletMoistureSensorData\n | SoilPhData data -> currentSoilPhDataBox data\n | AverageWindSpeedData data -> currentAverageWindSpeedDataBox data\n | LiquidLevelData data -> currentLiquidLevelDataBox data\n | SolarRadiationData data -> currentSolarRadiationDataBox data\n | WeatherStationData data -> [] // TODO\n]\n\nlet downloadBox dispatch (sensorId: int) (model: DataModel) =\n let currentTime = DateTime.Now\n\n let requestData =\n createHistoricRequestData\n sensorId\n (model.DownloadRange.StartTime currentTime)\n (model.DownloadRange.EndTime currentTime)\n\n let buttonOptions = [\n color.isLink\n if model.DownloadRequestRunning then\n button.isLoading\n else\n ()\n\n prop.onClick (fun _ -> dispatch (MySensSensorMsg.StartDownload requestData |> MapSensorData))\n ]\n\n let content =\n Bulma.columns [\n columns.isVCentered\n prop.children [\n Bulma.column [\n column.isNarrow\n prop.children [ Html.p [ prop.text \"Datumsbereich:\" ] ]\n ]\n Bulma.column [\n DateRangeSelect.view\n model.DownloadRange\n ((MySensSensorMsg.DownloadDateRangeChanged >> MapSensorData) >> dispatch)\n model.AvailableDownloadRanges\n ]\n Bulma.column [\n column.isNarrow\n prop.children [\n Bulma.button.button [ yield! buttonOptions; prop.text \"Download\" ]\n ]\n ]\n ]\n ]\n\n Bulma.box [\n (Heading.h3 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Option.Centered)\n ]\n ] [ str \"Download der Daten\" ])\n content\n ]\n\n\nlet getGraphs (data: SensorGraphDataList) =\n match data with\n | AirList air -> airDataGraphs air\n | GroundList ground -> groundDataGraphs ground\n | RainFallList rainFall -> rainFallDataGraphs rainFall\n | LeafletMoistureList moisture -> leafletMoistureDataGraphs moisture\n | SoilPhList soilPh -> soilPhDataGraphs soilPh\n | AverageWindSpeedList averageWind -> averageWindSpeedDataGraphs averageWind\n | WeatherStationList weatherStation -> weatherStationDataGraphs weatherStation\n | LiquidLevelList liquidLevel -> liquidLevelGraphs liquidLevel\n | SolarRadiationList solarRadiation -> solarRadiationGraphs solarRadiation\n\nlet createEnabledButtonOptions dispatch (sensorId: int) (startDate: DateTime) (endDate: DateTime) =\n let requestData =\n createHistoricRequestData\n sensorId\n (DateTime.startOfDay startDate)\n (endDate |> DateTime.addDays 1 |> DateTime.startOfDay)\n\n [\n Button.Disabled false\n Button.OnClick(fun _ -> dispatch (MySensSensorMsg.RequestData requestData |> MapSensorData))\n ]\n\nlet createDatePicker (rangePicker: DateRangePicker.Data) (model: DataModel) dispatch =\n let buttonOptions =\n Option.map2 (createEnabledButtonOptions dispatch model.SensorId) rangePicker.Start rangePicker.End\n |> Option.defaultValue [ Button.Disabled true ]\n\n let buttonOptions =\n List.append buttonOptions [\n Button.IsLink\n Button.IsLoading model.GraphRequestRunning\n ]\n\n Column.column [ Column.Width(Screen.All, Column.IsFull) ] [\n Columns.columns [ Columns.IsVCentered ] [\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ p [] [ str \"Datumsbereich:\" ] ]\n Column.column [] [\n DateRangePicker.view\n \"Von/Bis Datumsbereich auswählen\"\n ((MySensSensorMsg.GraphDateRangeChanged >> MapSensorData) >> dispatch)\n rangePicker\n ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ Button.button buttonOptions [ str \"Laden\" ] ]\n ]\n ]\n\nlet graphsView (data: HistoryGraphData) =\n match data with\n | NotLoaded -> []\n | NoData -> [\n createFullColumn (boxStringSubtitle \"Es wurden keine Daten im ausgewählten Zeitraum gefunden\")\n ]\n | HistoryGraphData.Data data -> getGraphs data\n\nlet graphBoxContent dispatch (model: DataModel) =\n let heading =\n Heading.h3 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Option.Centered)\n ]\n ] [ str \"Visualisierung der Daten\" ]\n\n let graphsContent =\n match model.GraphDateRange with\n | SensorDetailPage.Allowed dateRange ->\n let datePicker = createDatePicker dateRange model dispatch\n\n Columns.columns [ Columns.IsMultiline ] [\n datePicker\n yield! graphsView model.HistoryGraphData\n ]\n | SensorDetailPage.NotAllowed ->\n boxStringSubtitle\n \"Für die Darstellung der Verlaufsgrafiken ist das Paket \\\"Historie und erweiterter Download\\\" notwendig\"\n\n Box.box' [] [ heading; graphsContent ]\n\nlet private createMapLink dispatch (location: Location) : ReactElement =\n a [\n location\n |> Some\n |> Route.SensorMap\n |> Clickable.onClickGoToRoute dispatch\n |> OnClick\n ] [\n Icon.icon [] [\n Fa.i [ Fa.Size Fa.FaLarge; Fa.Solid.MapMarkedAlt ] []\n ]\n ]\n\nlet dataView dispatch (model: DataModel) =\n let boxes = [\n Box.box' [] (currentDataBox model.CurrentData)\n graphBoxContent dispatch model\n downloadBox dispatch model.SensorId model\n ]\n\n let heading =\n Container.container [] [\n Columns.columns [\n Columns.IsCentered\n Columns.IsVCentered\n Columns.IsMultiline\n ] [\n Column.column [\n Column.Width(Screen.All, Column.IsNarrow)\n Column.CustomClass \"has-text-centered\"\n ] [ Heading.h3 [] [ str model.Name ] ]\n Column.column [\n Column.Width(Screen.All, Column.IsNarrow)\n Column.CustomClass \"has-text-centered\"\n ] [ createMapLink dispatch model.Location ]\n ]\n ]\n\n let content = [\n heading\n Columns.columns [ Columns.IsMultiline ] (List.map createFullColumn boxes)\n ]\n\n Container.container [ Container.isFullWidth ] content\n\nlet pageView dispatch (model: PageModel) =\n match model with\n | NotFound -> headingOnlyPageContent \"Der Sensor wurde nicht gefunden\"\n | NotActive -> headingOnlyPageContent \"Dieser Sensor ist nicht aktiv\"\n | NotAllowed -> headingOnlyPageContent \"Sie dürfen diese Seite nicht ansehen\"\n | NotAuthenticated -> headingOnlyPageContent \"Sie sind aktuell nicht eingeloggt, bitte laden Sie diese Seite neu\"\n | Data data -> dataView dispatch data\n\n\nlet view (model: Model) dispatch = Loadable.view (pageView dispatch) model","module Shared.Dto.SensorGraphData\n\nopen System\nopen Shared.DtoTypes.LeafletWetness\n\ntype GraphAirDataDto = {\n TimeStamp: DateTimeOffset\n AirTemperature: float\n AirHumidity: float\n HumidTemperature: float\n DewPoint: float\n LeafletWetness: LeafletWetness\n IsForecast: bool\n}\n\ntype GraphSoilDataNodeDto = {\n TimeStamp: DateTimeOffset\n SoilTemperature: float\n SoilHumidity: float\n SoilConductivity: float\n}\n\ntype GraphSoilDataDto = {\n WetLimit: float option\n DryLimit: float option\n Nodes: GraphSoilDataNodeDto list\n}\n\ntype GraphRainFallDataDto = {\n TimeStamp: DateTimeOffset\n CurrentRainFall: float\n RainFallSum: float\n IsForecast: bool\n}\n\ntype GraphLeafletMoistureDataDto = {\n TimeStamp: DateTimeOffset\n LeafletMoisture: float\n LeafletTemperature: float\n}\n\ntype GraphSoilPhDataDto = {\n TimeStamp: DateTimeOffset\n SoilPh: float\n SoilTemperature: float\n}\n\ntype GraphAverageWindSpeedDataDto = {\n TimeStamp: DateTimeOffset\n AverageWindSpeed: float\n}\n\ntype GraphWeatherStationDataDto = {\n TimeStamp: DateTimeOffset\n AirTemperature: float\n AirHumidity: float\n HumidTemperature: float\n DewPoint: float\n LeafletWetness: LeafletWetness\n MaxWindSpeed: float\n AverageWindSpeed: float\n IsForecast: bool\n}\n\ntype GraphLiquidLevelDataDto = {\n TimeStamp: DateTimeOffset\n LiquidLevel: float\n}\n\ntype GraphSolarRadiationDataDto = {\n TimeStamp: DateTimeOffset\n SolarRadiation: float\n}\n\ntype GraphDataDto =\n | Air of GraphAirDataDto list\n | Soil of GraphSoilDataDto\n | RainFall of GraphRainFallDataDto list\n | LeafletMoisture of GraphLeafletMoistureDataDto list\n | SoilPh of GraphSoilPhDataDto list\n | AverageWindSpeed of GraphAverageWindSpeedDataDto list\n | WeatherStation of GraphWeatherStationDataDto list\n | LiquidLevel of GraphLiquidLevelDataDto list\n | SolarRadiation of GraphSolarRadiationDataDto list\n\nlet isGraphDataEmpty (data: GraphDataDto) : bool =\n match data with\n | Air list -> List.isEmpty list\n | RainFall list -> List.isEmpty list\n | LeafletMoisture list -> List.isEmpty list\n | SoilPh list -> List.isEmpty list\n | AverageWindSpeed list -> List.isEmpty list\n | WeatherStation list -> List.isEmpty list\n | Soil soilData -> List.isEmpty soilData.Nodes\n | LiquidLevel list -> List.isEmpty list\n | SolarRadiation list -> List.isEmpty list","namespace Client.Infrastructure\n\nopen Fable.React\nopen Fable.React.Props\nopen Fulma.Extensions.Wikiki\n\n[]\nmodule Tooltip =\n let span (tooltip: string) (content: string) =\n span [\n Class Tooltip.ClassName\n Tooltip.dataTooltip tooltip\n ] [ str content ]","module Shared.Dto.AlertMessage\n\nopen Shared.DtoTypes\n\nlet stateToLabel (state: PersistedAlertMessage.State) =\n match state with\n | PersistedAlertMessage.Sending -> \"An WebSMS gesendet\"\n | PersistedAlertMessage.Delivering -> \"Benachrichtigung wird versendet\"\n | PersistedAlertMessage.Delivered -> \"Benachrichtigung angekommen\"\n\nlet typeToLabel (type_: PersistedAlertMessage.Type) =\n match type_ with\n | PersistedAlertMessage.Started -> \"Gestartet\"\n | PersistedAlertMessage.AutoStopped -> \"Automatisch gestoppt\"\n | PersistedAlertMessage.Outdated -> \"Keine aktuellen Daten\"\n | PersistedAlertMessage.Warning -> \"Bewarnung\"\n\nlet methodToLabel (method: PersistedAlertMessage.Method) =\n match method with\n | PersistedAlertMessage.SMS -> \"SMS\"\n | PersistedAlertMessage.Call -> \"Anruf\"","module Client.Page.Admin.AlertsList\n\nopen System\nopen Client\nopen Client.Domain\nopen Client.Infrastructure\nopen Client.DomainTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React.Props\nopen Fulma\nopen Microsoft.FSharp.Core\nopen Shared\nopen Shared.Dto\nopen Fable.React\nopen Shared.Dto.Dto\nopen Client.Infrastructure.Api\nopen Shared.Dto.User\nopen Shared.DtoTypes\nopen Shared.DtoTypes.PaginatedRequest\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\ntype DataModel = {\n ContactInfos: AlertDto.ContactInfo list\n Alerts: AlertDto.RunningAlert list\n Users: UserDto list\n Sensors: IdValue list\n LastAlertMessages: PersistedAlertMessage.Message list\n}\n\nlet private dataModelCon contactInfos alerts users (sensors: IdValue list) messages : DataModel =\n let sortedAlerts =\n alerts\n |> List.sortBy (fun (alert: AlertDto.RunningAlert) ->\n List.find (fun (sensor: IdValue) -> sensor.Id = alert.Alert.SensorId) sensors\n |> fun sensor -> (MapSensor.getBaseData sensor.Value).Name\n )\n\n {\n ContactInfos = contactInfos\n Alerts = sortedAlerts\n Sensors = sensors\n Users = users\n LastAlertMessages = messages\n }\n\ntype LoadingModel = {\n ContactInfos: AlertDto.ContactInfo list option\n Alerts: AlertDto.RunningAlert list option\n Users: UserDto list option\n Sensors: IdValue list option\n AlertMessages: PersistedAlertMessage.Message list option\n}\n\ntype Model = Loadable\n\nlet private createDataModel (loadingModel: LoadingModel) : Model option =\n dataModelCon\n |> Some\n |> Option.apply loadingModel.ContactInfos\n |> Option.apply loadingModel.Alerts\n |> Option.apply loadingModel.Users\n |> Option.apply loadingModel.Sensors\n |> Option.apply loadingModel.AlertMessages\n |> Option.map Loadable.Data\n\nlet update (msg: AlertListMsg) (model: Model) =\n match msg, model with\n | AlertListMsg.RunningAlertsReceived alertsResult, Loadable.Loading loading ->\n match alertsResult with\n | Ok alerts ->\n let newLoadingModel = { loading with Alerts = Some alerts }\n\n let model =\n createDataModel newLoadingModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n model, Cmd.none\n | Error _ ->\n let toastCmd =\n Toast.create \"Fehler beim Laden der aktiven Bewarnungen\" |> Toast.error\n\n model, toastCmd\n | AlertListMsg.ContactInfosReceived result, Loadable.Loading loadingModel ->\n match result with\n | Ok infos ->\n let newLoadingModel = { loadingModel with ContactInfos = Some infos }\n\n let model =\n createDataModel newLoadingModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n model, Cmd.none\n | Error error ->\n let toastCmd = Toast.create \"Fehler beim Laden der Kontakdaten\" |> Toast.error\n\n model, toastCmd\n | AlertListMsg.SensorsReceived response, Loadable.Loading loadingModel ->\n match response with\n | Ok sensors ->\n let newLoadingModel = { loadingModel with Sensors = Some sensors }\n\n let model =\n createDataModel newLoadingModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n model, Cmd.none\n | Error error ->\n let toastCmd = Toast.create \"Fehler beim Laden der Sensoren\" |> Toast.error\n\n model, toastCmd\n | AlertListMsg.UsersReceived response, Loadable.Loading loadingModel ->\n match response with\n | Ok users ->\n let newLoadingModel = { loadingModel with Users = Some users }\n\n let model =\n createDataModel newLoadingModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n model, Cmd.none\n | Error error ->\n let toastCmd = Toast.create \"Fehler beim Laden der Benutzer\" |> Toast.error\n\n model, toastCmd\n | AlertListMsg.AlertMessagesReceived response, Loadable.Loading loadingModel ->\n match response with\n | Ok messages ->\n let newLoadingModel = { loadingModel with AlertMessages = Some messages }\n\n let model =\n createDataModel newLoadingModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n model, Cmd.none\n | Error error ->\n let toastCmd =\n Toast.create \"Fehler beim Laden der letzten Bewarnungen\" |> Toast.error\n\n model, toastCmd\n | _ -> model, Cmd.none\n\nlet init (session: UserSession) =\n let requestData: AuthenticatedRequest = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n let messagesRequestData: AuthenticatedRequest = {\n SessionKey = session.SessionKey\n Data = {\n Offset = 0\n Limit = 50\n }\n }\n\n let cmds =\n Cmd.batch [\n Cmd.OfAsync.perform api.getAlerts requestData (AlertListMsg.RunningAlertsReceived >> Msg.AlertsList)\n Cmd.OfAsync.perform api.getContactInfos requestData (AlertListMsg.ContactInfosReceived >> Msg.AlertsList)\n Cmd.OfAsync.perform api.getAllMySensSensors requestData (AlertListMsg.SensorsReceived >> Msg.AlertsList)\n Cmd.OfAsync.perform api.getAllUsers requestData (AlertListMsg.UsersReceived >> AlertsList)\n Cmd.OfAsync.perform\n api.getAlertMessages\n messagesRequestData\n (AlertListMsg.AlertMessagesReceived >> AlertsList)\n ]\n\n let model =\n Loadable.Loading {\n ContactInfos = None\n Alerts = None\n Sensors = None\n AlertMessages = None\n Users = None\n }\n\n model, cmds\n\nlet temperatureToString = sprintf \"%.2f °C\"\n\nlet private createSensorLink dispatch (sensor: IdValue) =\n a [\n OnClick(fun _ -> dispatch (Route.MySensSensor sensor.Id |> GoToRoute |> Global))\n ] [ str (MapSensor.getBaseData sensor.Value).Name ]\n\nlet private statusSinceCell (dateTime: DateTimeOffset) : ReactElement =\n let localDateTime = dateTime.LocalDateTime\n\n let timeElapsed = (DateTime.Now - localDateTime) |> TimeSpan.toHumanReadable\n\n let timeElapsedToolTip =\n sprintf \"%s (%s)\" (DateTime.toDayMonthString localDateTime) (DateTime.toTimeString localDateTime)\n\n td [] [ Tooltip.span timeElapsedToolTip timeElapsed ]\n\nlet private lastTemperatureCell (lastTemperature: DatedValue option) : ReactElement =\n match lastTemperature with\n | Some lastTemperature ->\n let localDateTime = lastTemperature.Date.LocalDateTime\n\n let timeElapsed = (DateTime.Now - localDateTime) |> TimeSpan.toHumanReadable\n\n let timeElapsedToolTip =\n sprintf \"%s (%s)\" (DateTime.toDayMonthString localDateTime) (DateTime.toTimeString localDateTime)\n\n let content =\n sprintf \"%s (vor %s)\" (temperatureToString lastTemperature.Value) timeElapsed\n\n td [] [ Tooltip.span timeElapsedToolTip content ]\n | None -> td [] [ str \"Warte auf neue Daten\" ]\n\nlet alertToRow\n dispatch\n (sensors: IdValue list)\n (contactInfos: AlertDto.ContactInfo list)\n (index: int)\n (alert: AlertDto.RunningAlert)\n =\n let sensorName =\n sensors\n |> List.tryFind (fun sensor -> sensor.Id = alert.Alert.SensorId)\n |> Option.map (createSensorLink dispatch)\n |> Option.defaultValue (str \"Unbekannter Sensor?\")\n\n let stateClass =\n match alert.State with\n | AlertDto.Ready _ -> \"alert_ready\"\n | AlertDto.Alerted _ -> \"alert_alerted\"\n | AlertDto.Outdated _ -> \"alert_outdated\"\n\n let contactInfo =\n contactInfos\n |> List.tryFind (fun contactInfo -> contactInfo.Id = alert.Alert.ContactInfoId)\n |> Option.map (fun contactInfo ->\n sprintf \"%s (%s)\" contactInfo.Name (AlertDto.contactInfoToString contactInfo.Data)\n )\n |> Option.defaultValue \"Unbekannte Kontakdaten?\"\n\n tr [] [\n td [] [ Table.rowIndexString index ]\n td [] [ sensorName ]\n td [] [ str contactInfo ]\n td [] [\n str (AlertDto.thresholdTypeToString alert.Alert.TemperatureType)\n ]\n td [] [\n str (AlertDto.phoneAlertTypeToString alert.Alert.PhoneAlertType)\n ]\n td [] [ str (sprintf \"%.1f ˚C\" alert.Alert.Threshold) ]\n lastTemperatureCell alert.LastTemperature\n td [ Class stateClass ] [ str (AlertDto.stateToString alert.State) ]\n td [] [\n str (\n AlertDto.stateToCount alert.State\n |> Option.map (sprintf \"%d\")\n |> Option.defaultValue \"-\"\n )\n ]\n alert.State |> AlertDto.stateToSince |> statusSinceCell\n ]\n\nlet private alertMessageToRow dispatch (users: UserDto list) (message: PersistedAlertMessage.Message) =\n let user =\n users\n |> List.tryFind (fun user -> user.Id = message.UserId)\n |> Option.map getFullName\n |> Option.defaultValue \"Unbekannter Benutzer\"\n\n tr [] [\n td [] [\n DateTime.toShortString message.CreatedAt |> str\n ]\n td [] [ str user ]\n td [] [\n AlertMessage.methodToLabel message.Method |> str\n ]\n td [] [ str message.PhoneNumber ]\n td [] [ AlertMessage.typeToLabel message.Type |> str ]\n td [] [ str message.Content ]\n td [] [ AlertMessage.stateToLabel message.State |> str ]\n td [] [\n DateTime.toShortString message.Timestamp |> str\n ]\n ]\n\nlet private alertMessagesTable dispatch (model: DataModel) =\n let headline =\n tr [] [\n th [] [ str \"Erstellt am\" ]\n th [] [ str \"Benutzer\" ]\n th [] [ str \"Methode\" ]\n th [] [ str \"Telefonnummer\" ]\n th [] [ str \"Typ\" ]\n th [] [ str \"Inhalt\" ]\n th [] [ str \"Status\" ]\n th [] [ str \"Status-Zeit\" ]\n ]\n\n if List.isEmpty model.LastAlertMessages then\n p [] [ str \"Keine Bewarnungs-Meldungen gefunden\" ]\n else\n let rows = List.map (alertMessageToRow dispatch model.Users) model.LastAlertMessages\n\n Table.table [\n Table.IsBordered\n Table.IsFullWidth\n Table.IsStriped\n ] [\n thead [] [ headline ]\n\n tbody [] rows\n ]\n\nlet alertsTable dispatch (model: DataModel) =\n let headline =\n tr [] [\n th [] [ str \"#\" ]\n th [] [ str \"Sensor\" ]\n th [] [ str \"Kontakt-Infos\" ]\n th [] [ str \"Verwendete Temperatur\" ]\n th [] [ str \"Bewarnungsart\" ]\n th [] [ str \"Temperatur-Grenze\" ]\n th [] [ str \"Aktuelle Temperatur\" ]\n th [] [ str \"Status der Alarmierung\" ]\n th [] [ str \"Anzahl Sensordaten über/unter Grenze\" ]\n th [] [ str \"Aktueller Status seit\" ]\n ]\n\n if List.isEmpty model.Alerts then\n p [] [ str \"Keine aktiven Bewarnungen gefunden\" ]\n else\n let rows =\n List.mapi (alertToRow dispatch model.Sensors model.ContactInfos) model.Alerts\n\n Table.table [\n Table.IsBordered\n Table.IsFullWidth\n Table.IsStriped\n ] [\n thead [] [ headline ]\n\n tbody [] rows\n ]\n\nlet private dataView dispatch (data: DataModel) =\n Container.container [ Container.IsFluid ] [\n Heading.h1 [] [ str \"Aktive Bewarnungen\" ]\n Table.scrollableTable (alertsTable dispatch data)\n Heading.h1 [] [ str \"Letzte Benachrichtigungen\" ]\n Table.scrollableTable (alertMessagesTable dispatch data)\n ]\n\nlet view (model: Model) dispatch = Loadable.view (dataView dispatch) model","import * as Unicode from \"./Unicode.13.0.0.js\";\nfunction getCategoryFunc() {\n // unpack Unicode codepoint ranges (delta encoded) and general categories\n const offset = 35; // offsets unprintable characters\n const a1 = [...Unicode.rangeDeltas].map((ch) => { var _a; return ((_a = ch.codePointAt(0)) !== null && _a !== void 0 ? _a : 0) - offset; });\n const a2 = [...Unicode.categories].map((ch) => { var _a; return ((_a = ch.codePointAt(0)) !== null && _a !== void 0 ? _a : 0) - offset; });\n const codepoints = new Uint32Array(a1);\n const categories = new Uint8Array(a2);\n for (let i = 1; i < codepoints.length; ++i) {\n codepoints[i] += codepoints[i - 1];\n }\n // binary search in unicode ranges\n return (cp) => {\n let hi = codepoints.length;\n let lo = 0;\n while (hi - lo > 1) {\n const mid = Math.floor((hi + lo) / 2);\n const test = codepoints[mid];\n if (cp < test) {\n hi = mid;\n }\n else if (cp === test) {\n hi = lo = mid;\n break;\n }\n else if (test < cp) {\n lo = mid;\n }\n }\n return categories[lo];\n };\n}\nconst isControlMask = 1 << 14 /* Control */;\nconst isDigitMask = 1 << 8 /* DecimalDigitNumber */;\nconst isLetterMask = 0\n | 1 << 0 /* UppercaseLetter */\n | 1 << 1 /* LowercaseLetter */\n | 1 << 2 /* TitlecaseLetter */\n | 1 << 3 /* ModifierLetter */\n | 1 << 4 /* OtherLetter */;\nconst isLetterOrDigitMask = isLetterMask | isDigitMask;\nconst isUpperMask = 1 << 0 /* UppercaseLetter */;\nconst isLowerMask = 1 << 1 /* LowercaseLetter */;\nconst isNumberMask = 0\n | 1 << 8 /* DecimalDigitNumber */\n | 1 << 9 /* LetterNumber */\n | 1 << 10 /* OtherNumber */;\nconst isPunctuationMask = 0\n | 1 << 18 /* ConnectorPunctuation */\n | 1 << 19 /* DashPunctuation */\n | 1 << 20 /* OpenPunctuation */\n | 1 << 21 /* ClosePunctuation */\n | 1 << 22 /* InitialQuotePunctuation */\n | 1 << 23 /* FinalQuotePunctuation */\n | 1 << 24 /* OtherPunctuation */;\nconst isSeparatorMask = 0\n | 1 << 11 /* SpaceSeparator */\n | 1 << 12 /* LineSeparator */\n | 1 << 13 /* ParagraphSeparator */;\nconst isSymbolMask = 0\n | 1 << 25 /* MathSymbol */\n | 1 << 26 /* CurrencySymbol */\n | 1 << 27 /* ModifierSymbol */\n | 1 << 28 /* OtherSymbol */;\nconst isWhiteSpaceMask = 0\n | 1 << 11 /* SpaceSeparator */\n | 1 << 12 /* LineSeparator */\n | 1 << 13 /* ParagraphSeparator */;\nconst unicodeCategoryFunc = getCategoryFunc();\nfunction charCodeAt(s, index) {\n if (index >= 0 && index < s.length) {\n return s.charCodeAt(index);\n }\n else {\n throw new Error(\"Index out of range.\");\n }\n}\nexport const getUnicodeCategory = (s) => getUnicodeCategory2(s, 0);\nexport const isControl = (s) => isControl2(s, 0);\nexport const isDigit = (s) => isDigit2(s, 0);\nexport const isLetter = (s) => isLetter2(s, 0);\nexport const isLetterOrDigit = (s) => isLetterOrDigit2(s, 0);\nexport const isUpper = (s) => isUpper2(s, 0);\nexport const isLower = (s) => isLower2(s, 0);\nexport const isNumber = (s) => isNumber2(s, 0);\nexport const isPunctuation = (s) => isPunctuation2(s, 0);\nexport const isSeparator = (s) => isSeparator2(s, 0);\nexport const isSymbol = (s) => isSymbol2(s, 0);\nexport const isWhiteSpace = (s) => isWhiteSpace2(s, 0);\nexport const isHighSurrogate = (s) => isHighSurrogate2(s, 0);\nexport const isLowSurrogate = (s) => isLowSurrogate2(s, 0);\nexport const isSurrogate = (s) => isSurrogate2(s, 0);\nexport function getUnicodeCategory2(s, index) {\n const cp = charCodeAt(s, index);\n return unicodeCategoryFunc(cp);\n}\nexport function isControl2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isControlMask) !== 0;\n}\nexport function isDigit2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isDigitMask) !== 0;\n}\nexport function isLetter2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isLetterMask) !== 0;\n}\nexport function isLetterOrDigit2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isLetterOrDigitMask) !== 0;\n}\nexport function isUpper2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isUpperMask) !== 0;\n}\nexport function isLower2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isLowerMask) !== 0;\n}\nexport function isNumber2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isNumberMask) !== 0;\n}\nexport function isPunctuation2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isPunctuationMask) !== 0;\n}\nexport function isSeparator2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isSeparatorMask) !== 0;\n}\nexport function isSymbol2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n return (test & isSymbolMask) !== 0;\n}\nexport function isWhiteSpace2(s, index) {\n const test = 1 << getUnicodeCategory2(s, index);\n if ((test & isWhiteSpaceMask) !== 0) {\n return true;\n }\n const cp = charCodeAt(s, index);\n return (0x09 <= cp && cp <= 0x0D) || cp === 0x85 || cp === 0xA0;\n}\nexport function isHighSurrogate2(s, index) {\n const cp = charCodeAt(s, index);\n return (0xD800 <= cp && cp <= 0xDBFF);\n}\nexport function isLowSurrogate2(s, index) {\n const cp = charCodeAt(s, index);\n return (0xDC00 <= cp && cp <= 0xDFFF);\n}\nexport function isSurrogate2(s, index) {\n const cp = charCodeAt(s, index);\n return (0xD800 <= cp && cp <= 0xDFFF);\n}\nexport function isSurrogatePair(s, index) {\n return typeof index === \"number\"\n ? isHighSurrogate2(s, index) && isLowSurrogate2(s, index + 1)\n : isHighSurrogate(s) && isLowSurrogate(index);\n}\nexport function parse(input) {\n if (input.length === 1) {\n return input[0];\n }\n else {\n throw new Error(\"String must be exactly one character long.\");\n }\n}\n","// Unicode 13.0.0 codepoint ranges (delta encoded) and general categories.\n// Integer delta values are offset by 35 and stored as Unicode characters.\nexport const rangeDeltas = \"#C$&$&$$$$$$%-%&%=$$$$$$=$$$$D$$'$$$$$$$$$$$$%$$%$$$$&$:$*;$+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$$$$%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$$$$&%$$$%$&%'$%$&&%$%$$$$$%$$%$$%$&$$$%%$$&'$$$$$$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$$$$$$%$$$$$&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*%$%%$$'$$$$$$$$h$>5'/1(*$$$4“$$$$$$$$%$&$$'%$$&$$$%$4$,F$%&&$$$$$$$$$$$$$$$$$$$$$$$($$$$$%%VS$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$(%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%$$$$$$$$$$$$%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$I%$)L$$%%$$P$$$%$%$$+>''%.)&%$%%.$$$%C$-8-'%$†$$*$$)%%$'%-&%$1$$$$A>%|.$1-D,%$&$%$%9'$,$&$(%2$<&%$$.X8$5.2$C$Y$$$$&+'$%$*-%%-$$2$%$+%%%9$*$$&'%$$&'%%%%$$+$'%$&%%-%%)$$$$$%%$$)'%%9$*$%$%$%%$$&%'%%&&$*'$$*-%&$$-%$$,$&$9$*$%$(%$$&($%$$%$%$2%%%-$$*$)$$%$+%%%9$*$%$(%$$$$$'%%%%$*%$'%$&%%-$$)-$$$)&&$'&%$$$%&%&&&/'%$%&&$&$%$)$1-&)$$($&$+$&$:$3&$&'$&$'*%$&(%%%-*$*$$$%$+$&$:$-$(%$$$$($$%$%%*%*$$%%%-$%0%%,$&$L%$&'$&$&$$$'&$*&%%-,$)$$%$5&;$,$$%*&$'&&$$$+)-%%$/S$%*'$)$+$-%H%$$$($;$$$-$%,$%($$$)%-%'C$&2$$&%)--$$$$$$$$$$%+$G'1$($%(.$G$+$)$%('%HN%'$)$%%%$-))%%'&$&%*&'0$%%)$$$-&$%I$$($%N$$&Ŭ$'%*$$$'%L$'%D$'%*$$$'%2$\\\\$'%f%&,7&3-)y%)%$ʏ$$4$=$$&n&&+*0$'&.5&%,5%/0$&$%/W%$*+$%.&$&$$$%-)-))$'&$$-)F$X*(%E$$(i-B$&'%&'%$)&'$&%-A%(.O'=)-$&E:%%$%%X$$$*$$$$%+)-%$-)-)*$)%1$%b'$R$$($$($%*'-*-,,&%$A$'%%$&%-O$$%&$$&%+'G++%%&(-&&-A)%,*N%&++&$0$*'$)$%$%$(Ob0$EH]$($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,+)%)%++++)%)%+$$$$$$$$++1%++++++($%'$$$&&$%'$&'%%'$&+(&%&$%'$%$.()%$$$%$$$+$$($,$$'%&$$$.$$$-$($-$$%)&$$$-&$$$0&C30'$&/2%$'$%$&%&$$$%$()$$$$$$'$$'$'$%%%($'$$%$$3F$$'$%'((%'$%$%$*$B%%$$$Bį+$$$$7%*$$t$A'C',7$+$(I((A$$G'+$(MKKq%-)G'G'K+W.$³Ś,9-+»)%$$O$%&$%:$$+:%*B+,S6$%((9)&$=($c['%%3%Q$&$%(''$&$@%&'$,*,*@%$@&C+$?%'(*,Y&*9%+6(+5*'/*slZV0V*)G'+-ʼnB$M$%$%%q@-$+9.'(y8*7:,$$$X2*'7-2&$P&'%%%$'.$%<*-)&G($+$-'$%$+F$%$,%$S&,%'''$$$-$$$&$7.5$<&&%$$%)$d*$$$'$2$-$)R$&+(-)%%$+%%%9$*$%$($%$%$'%%%&%$)$((%%*&(®X&+%&$$'(-%$$$&AS&)$$'%$%%$$+-ÉR&'%'%$%:'%ES&+%$$%&$.-)06N$$$%)$$$*-Y>%&%'$('-%&$ãO&,$%$‡CC-,/+%$%+$%$;)$%%%$$$$$$$&,-i+%J&'%%'$$$$$>$-K)$$'+$+$)%&Q0$%&$(@\\\\Ī,$H$*$)$$$(--6&%A%9$$*$%$%l*$%$I)&$$%$*$$+-))$%$C($%$%$$$$*-ř6%%%Ú$28+'40$ν‰’$(.ç૟ђ$,࿪ɪ⇜ɜ*B$-'%ƒA%($-S*(''$$--$*$8(6˓CC:'ˆn'$$Z*'0c%$$$.%1᠛+ӹM,⌚łT&4'+ƯधŽ(0&,*-%$%$'፿ę-J%_%&&)++%*A'^:e&$½7/z,<ª===*$5==$$%%$%%%'$+'$$$*$.==%$'%+$*$=%$'$($$&*$============?%<$<$)<$<$)<$<$)<$<$)<$<$)$$%UȣZ'U+$1$%(2($2ճ*$4%*$%$(øP&**%-'$$ƓO'-($ԣè%,*LEE*$'-'%̴^$&$'oP$2å'$>$%$$%$$-$'$$$$)$'$$$$$$&$%$$%$$$$$$$$$$%$$%'$*$'$'$$$-$4(&$($4W%ıO'‡/2%2$2$H-0Ä[@0O',*%1)½Ğ(˻+0&0&—/|*/7/'[+-)K+A%%qœ$u$ª/1%(&&(*,<**,&0*L¶$ZH-Щ꜁Eၘ.ā%ᚥ1ᵔూɁ؅፮򮳙$Aƒ£ē︳𐀡%𐀡\";\nexport const categories = \"1.;=;78;<;6;+;<;#7;8>5>$7<8<1.;=?;>?'9<2?>?<->$;>-':-;#<#$<$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$'#$'#%$#%$#%$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#%$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$'$&>&>&>&>&>(#$#$&>#$@&$;#@>#;#@#@#$#@#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$<#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$?(*#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$@#@&;$;6@?=@(6(;(;(;(@'@';@2<;=;?(;2@;'&'(+;'(';'(2?(&(?('+'?';@2'('(@'('@+'(&?;&@(='(&(&(&(@;@'(@;@'@'@'@(2()'()(')()()'('(;+;&'()@'@'@'@'@'@'@(')(@)@)('@)@'@'(@+'=-?=';(@()@'@'@'@'@'@'@'@(@)(@(@(@(@'@'@+('(;@()@'@'@'@'@'@'@(')(@()@)(@'@'(@+;=@'(@()@'@'@'@'@'@'@(')()(@)@)(@()@'@'(@+?'-@('@'@'@'@'@'@'@'@'@'@)()@)@)(@'@)@+-?=?@()('@'@'@'@'()@(@(@(@'@'(@+@;-?'();'@'@'@'@'@(')()@()@)(@)@'@'(@+@'@()'@'@'(')(@)@)('?@')-'(@+-?'@()@'@'@'@'@'@(@)(@(@)@+@);@'('(@='&(;+;@'@'@'@'@'@'('('@'@&@(@+@'@'?;?;?(?+-?(?(?(7878)'@'@()(;('(@(@?(?@?;?;@')()()()('+;')('(')')'('()()(')+)(?#@#@#@$;&$'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@'@(;-@'?@#@$@6'?;'.'78@';,'@'@'(@'(;@'(@'@'@(@'()()()(;&;='(@+@-@;6;(2@+@'&'@'('('@'@'@()()@)()(@?@;+'@'@'@'@+-@?'()(@;')()(@()()()(@(+@+@;&;@(*(@()'()()()()'@+;?(?@()')()()('+'()()()()@;')()(@;+@'+'&;$@#@#;@(;()('('(')('@$&$&$&(@(#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$@#@$#$#$@#@$@#@#@#@#$#$@$%$%$%$@$#%>$>$@$#%>$@$#@>$#>@$@$#%>@.26;9:79:79;/02.;9:;5;<78;<;5;.2@2-&@-<78&-<78@&@=@(*(*(@?#?#?$#$#$?#?<#?#?#?#?#?$#$'$?$#<#$?&'6';&'@'@'@?-?'?@'?@-?-?-?-?-?'?'@'&'@?@'&;'&;'+'@#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$'(*;(;&#$#$#$#$#$#$#$#$#$#$#$#$#$#$&(',(;@>&>#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$&$#$#$#$#$#$#$#$&>#$#$'#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$@#$#$#$@#$'&$'('('(')()?(@-?=?@';@)')(@;+@(';';'(+'(;'()@;'@()'()()();@&+@;'(&'+'@'()()(@'('()@+@;'&'?')()'('('('('('@'&;')();'&)(@'@'@'@'@'@$>&$&>@$')()();)(@+@'@'@'@34'@'@$@$@'('<'@'@'@'@'@'>@'87@'@'@'=?@(;78;@(;657878787878787878;78;5;@;6787878;<6<@;=;@'@'@2@;=;78;<;6;+;<;#7;8>5>$7<8<78;78;'&'&'@'@'@'@'@=<>?=@??@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@+@'@'@'@'@'@'@'@2@2@(@4@4@\";\n","namespace Fulma\r\n\r\nopen Fulma\r\nopen Fable.React\r\nopen Fable.React.Props\r\n\r\n[]\r\nmodule Help =\r\n\r\n type Option =\r\n | CustomClass of string\r\n | Props of IHTMLProp list\r\n | Color of IColor\r\n | Modifiers of Modifier.IModifier list\r\n\r\n /// Generate

      \r\n let help (options : Option list) children =\r\n let parseOptions (result : GenericOptions) option =\r\n match option with\r\n | Color color -> ofColor color |> result.AddClass\r\n | Props props -> result.AddProps props\r\n | CustomClass customClass -> result.AddClass customClass\r\n | Modifiers modifiers -> result.AddModifiers modifiers\r\n\r\n GenericOptions.Parse(options, parseOptions, \"help\").ToReactElement(p, children)\r\n","namespace Client.Forms\n\nopen System\nopen Client.Infrastructure.Api\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React\nopen Fulma\nopen Microsoft.FSharp.Core\nopen Shared.Dto.Dto\nopen Shared\nopen Shared.DtoTypes\nopen Shared.Infrastructure\nopen Client\nopen Thoth.Elmish\n\n\n[]\nmodule ContactInfo =\n type Model = {\n Session: UserSession\n Name: string option\n Phone: string option\n RequestRunning: bool\n }\n\n type FormResult =\n | Noop\n | CloseModal\n | CloseAndRefresh\n\n let private createNewModel session : Model = {\n Session = session\n Name = None\n Phone = None\n RequestRunning = false\n }\n\n let init session = createNewModel session\n\n let private createContactInfo userId name phone : AlertDto.NewContactInfo = {\n Name = name\n UserId = userId\n Data = AlertDto.Phone phone\n }\n\n let private characterValidForPhoneNumber character =\n Char.IsDigit character || character = '+'\n\n let createContactInfoMsg userId maybeName (maybePhone: string option) =\n let validatedPhone =\n maybePhone\n |> Option.map Seq.toList\n |> Option.bind (fun phone ->\n if List.forall characterValidForPhoneNumber phone then\n Some phone\n else\n None\n )\n |> Option.map String.Concat\n\n Some createContactInfo\n |> Option.apply (Some userId)\n |> Option.apply maybeName\n |> Option.apply validatedPhone\n |> Option.map ContactInfoFormMsg.CreateContactInfo\n\n let form dispatch (model: Model) =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Name\" ]\n Control.div [] [\n Input.text [\n model.Name |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value |> String.toOption |> ContactInfoFormMsg.NameChanged |> dispatch\n )\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Telefonnummer\" ]\n Control.div [] [\n Input.text [\n Input.Placeholder \"00431234567890\"\n model.Phone |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value |> String.toOption |> ContactInfoFormMsg.PhoneChanged |> dispatch\n )\n ]\n Help.help [] [\n str \"Bitte gib die Telefonnummer mit der Ländervorwahl ein. Beispiel: 0043664123456789\"\n ]\n ]\n ]\n ]\n\n let saveButton dispatch (model: Model) =\n let maybeOnClick =\n createContactInfoMsg model.Session.User.Id model.Name model.Phone\n |> Option.map (fun msg -> Button.OnClick(fun _ -> dispatch msg))\n\n let buttonOptions = [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n Button.Disabled(Option.isNone maybeOnClick)\n ]\n\n Button.button (List.addToListIfSome buttonOptions maybeOnClick) [ str \"Speichern\" ]\n\n\n let view (dispatch: ContactInfoFormMsg -> unit) (model: Model) =\n let closeModal = (fun _ -> dispatch ContactInfoFormMsg.CloseModal)\n\n let headline = \"Neue Kontaktdaten anlegen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ form dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]\n\n let update (msg: ContactInfoFormMsg) (model: Model) =\n match msg with\n | ContactInfoFormMsg.NameChanged name -> { model with Name = name }, Cmd.none, FormResult.Noop\n | PhoneChanged phone -> { model with Phone = phone }, Cmd.none, FormResult.Noop\n | CreateContactInfo contactInfo ->\n let request = {\n SessionKey = model.Session.SessionKey\n Data = contactInfo\n }\n\n { model with RequestRunning = true },\n Cmd.OfAsync.perform api.createContactInfo request ContactInfoCreated,\n FormResult.Noop\n | ContactInfoCreated response ->\n match response with\n | Ok _ ->\n let toastCmd = Toast.create \"Speichern erfolgreich\" |> Toast.success\n\n model, toastCmd, FormResult.CloseAndRefresh\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Speichern\" |> Toast.error\n\n model, toastCmd, FormResult.Noop\n | ContactInfoFormMsg.CloseModal -> model, Cmd.none, FormResult.CloseModal","namespace Client.Forms\n\nopen Client.Infrastructure.Api\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Microsoft.FSharp.Core\nopen Shared.Dto\nopen Shared.DtoTypes\nopen Shared.Infrastructure\nopen Shared.Dto.Dto\nopen Shared\nopen Client\nopen Thoth.Elmish\n\n\n[]\nmodule AlertForm =\n type Model = {\n Session: UserSession\n AvailableSensors: IdValue list\n AvailableContactInfos: AlertDto.ContactInfo list\n Sensor: IdValue option\n ContactInfo: AlertDto.ContactInfo option\n TemperatureThresholdType: AlertDto.TemperatureType\n PhoneAlertType: AlertDto.PhoneAlertType\n Threshold: string option\n RequestRunning: bool\n }\n\n type FormResult =\n | Noop\n | CloseModal\n | CloseAndRefresh\n\n let private thresholdTypeFromString typeString =\n match typeString with\n | \"Feuchttemperatur\" -> AlertDto.Wet\n | \"Trockentemperatur\" -> AlertDto.Dry\n | _ -> failwith \"Unbekannter ThresholdTyp\"\n\n let private phoneAlertTypeFromString alertType =\n match alertType with\n | \"Anruf\" -> AlertDto.Call\n | \"SMS\" -> AlertDto.SMS\n | _ -> failwith \"That shouldn't happen\"\n\n let init session sensors contactInfos = {\n Session = session\n AvailableSensors = sensors\n AvailableContactInfos = contactInfos\n Sensor = List.tryHead sensors\n ContactInfo = List.tryHead contactInfos\n TemperatureThresholdType = AlertDto.Dry\n PhoneAlertType = AlertDto.SMS\n Threshold = Some \"2.0\"\n RequestRunning = false\n }\n\n let private createAlert\n userId\n (sensor: IdValue)\n (contactInfo: AlertDto.ContactInfo)\n thresholdType\n phoneAlertType\n threshold\n : AlertDto.NewAlert =\n\n {\n SensorId = sensor.Id\n ContactInfoId = contactInfo.Id\n TemperatureType = thresholdType\n UserId = userId\n PhoneAlertType = phoneAlertType\n Threshold = threshold\n }\n\n let private checkThresholdLimits (threshold: float) =\n if threshold >= -10.0 && threshold <= 4.0 then\n Some threshold\n else\n None\n\n let createAlertMsg userId maybeSensor maybeContactInfo thresholdType phoneAlertType maybeThreshold =\n Some createAlert\n |> Option.apply (Some userId)\n |> Option.apply maybeSensor\n |> Option.apply maybeContactInfo\n |> Option.apply (Some thresholdType)\n |> Option.apply (Some phoneAlertType)\n |> Option.apply (Option.bind checkThresholdLimits maybeThreshold)\n |> Option.map AlertFormMsg.CreateAlert\n\n let typeToOption (thresholdType: AlertDto.TemperatureType) =\n let string = AlertDto.thresholdTypeToString thresholdType\n\n option [ Value string ] [ str string ]\n\n let private thresholdTypeSelect (selected: AlertDto.TemperatureType) dispatch =\n let types = [ AlertDto.Wet; AlertDto.Dry ]\n let options = List.map typeToOption types\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(AlertDto.thresholdTypeToString selected)\n OnChange(fun event -> dispatch (event.Value |> thresholdTypeFromString |> ThresholdTypeChanged))\n ]\n options\n ]\n\n let private sensorToOption (sensor: IdValue) =\n let baseData = MapSensor.getBaseData sensor.Value\n let string = baseData.Name\n\n option [ Value baseData.Name ] [ str string ]\n\n let private sensorSelect\n (selected: IdValue option)\n (availableSensors: IdValue list)\n dispatch\n =\n let options = List.map sensorToOption availableSensors\n\n let findSensor name =\n availableSensors\n |> List.tryFind (fun sensor -> (MapSensor.getBaseData sensor.Value).Name = name)\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(\n selected\n |> Option.map (fun sensor -> (MapSensor.getBaseData sensor.Value).Name)\n |> Option.defaultValue \"\"\n )\n OnChange(fun event -> dispatch (event.Value |> findSensor |> SensorChanged))\n ]\n options\n ]\n\n\n let private contactInfoToOption (info: AlertDto.ContactInfo) =\n let string = info.Name\n\n option [ Value string ] [ str string ]\n\n let private contactInfoSelect\n (selected: AlertDto.ContactInfo option)\n (availableContactInfos: AlertDto.ContactInfo list)\n dispatch\n =\n let options = List.map contactInfoToOption availableContactInfos\n\n let findContactInfo name =\n availableContactInfos\n |> List.tryFind (fun contactInfo -> contactInfo.Name = name)\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(\n selected\n |> Option.map (fun contactInfo -> contactInfo.Name)\n |> Option.defaultValue \"\"\n )\n OnChange(fun event -> dispatch (event.Value |> findContactInfo |> ContactInfoChanged))\n ]\n options\n ]\n\n let alertTypeToOption (alertType: AlertDto.PhoneAlertType) =\n let string = AlertDto.phoneAlertTypeToString alertType\n\n option [ Value string ] [ str string ]\n\n let private alertTypeSelect (selected: AlertDto.PhoneAlertType) dispatch =\n let types = [ AlertDto.Call; AlertDto.SMS ]\n let options = List.map alertTypeToOption types\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(AlertDto.phoneAlertTypeToString selected)\n OnChange(fun event -> dispatch (event.Value |> phoneAlertTypeFromString |> PhoneAlertTypeChanged))\n ]\n options\n ]\n\n let form dispatch (model: Model) =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Sensor\" ]\n Control.div [ Control.IsExpanded ] [\n sensorSelect model.Sensor model.AvailableSensors dispatch\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Kontaktdaten\" ]\n Control.div [ Control.IsExpanded ] [\n contactInfoSelect model.ContactInfo model.AvailableContactInfos dispatch\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Bewarnungsart\" ]\n Control.div [ Control.IsExpanded ] [ alertTypeSelect model.PhoneAlertType dispatch ]\n ]\n Field.div [] [\n Label.label [] [ str \"Verwendete Temperatur\" ]\n Control.div [ Control.IsExpanded ] [\n thresholdTypeSelect model.TemperatureThresholdType dispatch\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Temperatur Grenzwert\" ]\n Control.div [] [\n Input.text [\n model.Threshold |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value |> String.toOption |> AlertFormMsg.ThresholdChanged |> dispatch\n )\n ]\n Help.help [] [\n str \"Der Grenzwert muss zwischen +4˚C und -10˚C liegen\"\n ]\n ]\n ]\n ]\n\n let saveButton dispatch (model: Model) =\n let maybeOnClick =\n createAlertMsg\n model.Session.User.Id\n model.Sensor\n model.ContactInfo\n model.TemperatureThresholdType\n model.PhoneAlertType\n (Option.bind Inputs.toFloatOption model.Threshold)\n |> Option.map (fun msg -> Button.OnClick(fun _ -> dispatch msg))\n\n let buttonOptions = [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n Button.Disabled(Option.isNone maybeOnClick)\n ]\n\n Button.button (List.addToListIfSome buttonOptions maybeOnClick) [ str \"Erstellen\" ]\n\n\n let view (dispatch: AlertFormMsg -> unit) (model: Model) =\n let closeModal = (fun _ -> dispatch AlertFormMsg.CloseModal)\n\n let headline = \"Neue Bewarnung anlegen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ form dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]\n\n let update (msg: AlertFormMsg) (model: Model) =\n match msg with\n | SensorChanged sensor -> { model with Sensor = sensor }, Cmd.none, FormResult.Noop\n | ThresholdTypeChanged thresholdType ->\n { model with TemperatureThresholdType = thresholdType }, Cmd.none, FormResult.Noop\n | PhoneAlertTypeChanged alertType -> { model with PhoneAlertType = alertType }, Cmd.none, FormResult.Noop\n | ContactInfoChanged contactInfo -> { model with ContactInfo = contactInfo }, Cmd.none, FormResult.Noop\n | ThresholdChanged threshold -> { model with Threshold = threshold }, Cmd.none, FormResult.Noop\n | CreateAlert alert ->\n let request = {\n SessionKey = model.Session.SessionKey\n Data = alert\n }\n\n { model with RequestRunning = true },\n Cmd.OfAsync.perform api.createAlert request AlertCreated,\n FormResult.Noop\n | AlertCreated response ->\n match response with\n | Ok _ ->\n let toastCmd = Toast.create \"Speichern erfolgreich\" |> Toast.success\n\n model, toastCmd, FormResult.CloseAndRefresh\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Speichern\" |> Toast.error\n\n model, toastCmd, FormResult.Noop\n | AlertFormMsg.CloseModal -> model, Cmd.none, FormResult.CloseModal","namespace Client.Forms\n\nopen Client\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Client.Infrastructure.Api\nopen Elmish\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Shared.Dto.Dto\nopen Thoth.Elmish\n\n[]\nmodule BuyAlertPackagesForm =\n type Model = {\n SessionKey: SessionKey\n Count: int\n DisclaimerApproved: bool\n RequestRunning: bool\n }\n\n let init sessionKey = {\n SessionKey = sessionKey\n Count = 1\n DisclaimerApproved = false\n RequestRunning = false\n }\n\n let update (msg: BuyAlertPackageFormMsg) (model: Model) =\n match msg with\n | BuyAlertPackageFormMsg.CloseModal -> model, Cmd.none, Form.Close\n | CountChanged count -> { model with Count = count }, Cmd.none, Form.Noop\n | DisclaimerApproved approved -> { model with DisclaimerApproved = approved }, Cmd.none, Form.Noop\n | BuyPackages count ->\n let requestData = {\n SessionKey = model.SessionKey\n Data = count\n }\n\n { model with RequestRunning = true },\n Cmd.OfAsync.perform api.buyAlertPackages requestData (PackagesBought >> BuyPackagesForm),\n Form.Noop\n | PackagesBought response ->\n match response with\n | Ok _ ->\n let toastCmd = Toast.create \"Paket(e) wurden erfolgreich bestellt\" |> Toast.success\n\n model, toastCmd, Form.CloseAndRefresh\n | Error _ ->\n let toastCmd =\n Toast.create \"Ein Fehler ist im Bestellvorgang aufgetreten\" |> Toast.error\n\n model, toastCmd, Form.Noop\n\n let private countToOption (count: int) =\n let string = string count\n\n option [ HTMLAttr.Value string ] [ str string ]\n\n let private countSelect dispatch (count: int) =\n let options = [ 1; 2; 3; 4; 5 ] |> List.map countToOption\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(string count)\n OnChange(fun event -> dispatch (event.Value |> int |> CountChanged))\n ]\n options\n ]\n\n let private formView dispatch (model: Model) =\n let price = 30 * model.Count\n\n form [] [\n Field.div [] [\n Control.div [] [\n p [] [\n str \"Frostwarnpaket für die Bewarnung von 3 Sensoren (SMS und Anrufe inklusive)\"\n ]\n ]\n ]\n Field.div [] [\n Control.div [] [\n a [\n Href \"http://mysens.eu/pakete#2\"\n Target \"_blank\"\n ] [ str \"Weitere Informationen\" ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Anzahl Frostbewarnungs Pakete\" ]\n Control.div [ Control.IsExpanded ] [ countSelect dispatch model.Count ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Preis\" ]\n Control.div [] [\n p [] [\n str (sprintf \"%i € inklusive Umsatzsteuer\" price)\n ]\n ]\n ]\n\n Field.div [] [\n Control.div [] [\n Label.label [] [ str \"AGB und Haftungsausschluss\" ]\n Checkbox.checkbox [] [\n Checkbox.input [\n Props [\n HTMLAttr.Checked model.DisclaimerApproved\n OnChange(fun _ -> not model.DisclaimerApproved |> DisclaimerApproved |> dispatch)\n ]\n ]\n\n str \" Ich erkläre mich mit der \"\n a [\n Href \"https://mysens.eu/nutzungsbedingungen-mysens-network/\"\n Target \"_blank\"\n ] [ str \"AGB\" ]\n str \" und \"\n a [\n Href \"https://mysens.eu/nutzungsbedingungen-mysens-network/\"\n Target \"_blank\"\n ] [ str \"Haftungsausschluss\" ]\n str \" von mysens.eu und mysens.network einverstanden\"\n ]\n ]\n ]\n ]\n\n let buyButton dispatch (model: Model) =\n let buttonOptions = [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n Button.Disabled(not model.DisclaimerApproved)\n Button.OnClick(fun _ -> dispatch (BuyPackages model.Count))\n ]\n\n Button.button buttonOptions [ str \"Kostenpflichtig bestellen\" ]\n\n let view (dispatch: BuyAlertPackageFormMsg -> unit) (model: Model) =\n let closeModal = (fun _ -> dispatch BuyAlertPackageFormMsg.CloseModal)\n\n let headline = \"Frostbewarnungs Pakete bestellen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ formView dispatch model ] ]\n Modal.Card.foot [] [ buyButton dispatch model ]\n ]\n ]","namespace Client.InfrastructureTypes\n\nopen Fulma\n\n[]\nmodule Columns =\n let bottomBorder = Columns.CustomClass \"bottom-border\"","namespace Client.InfrastructureTypes\n\nopen Fable.React.Props\n\n[]\nmodule Html =\n let bold = Class \"has-text-weight-bold\"\n\n let label = Class \"mysens-label\"","namespace Client.Components\n\nopen Browser.Types\nopen Fable.FontAwesome\nopen Fulma\nopen Fable.React\n\n[]\nmodule ConfirmationModal =\n type Configuration = {\n Headline: string\n Text: string\n OnClose: MouseEvent -> unit\n OnYes: MouseEvent -> unit\n OnNo: MouseEvent -> unit\n }\n\n let private createButton isLoading text icon color onClick =\n Button.button [\n Button.Color color\n Button.OnClick onClick\n Button.IsLoading isLoading\n ] [\n Icon.icon [] [ Fa.i [ icon ] [] ]\n span [] [ str text ]\n ]\n\n let private createModalFooter (isLoading: bool) (configuration: Configuration) = [\n Level.level [] [\n Level.left [] []\n Level.right [] [\n Level.item [] [\n Control.p [] [\n createButton isLoading \"Ja\" Fa.Solid.Check IsGrey configuration.OnYes\n ]\n ]\n Level.item [] [\n Control.p [] [\n createButton false \"Nein\" Fa.Solid.Times IsGrey configuration.OnNo\n ]\n ]\n ]\n ]\n ]\n\n let view isLoading configuration =\n let body = [ str configuration.Text ]\n\n let footer = createModalFooter isLoading configuration\n\n let props: Modal.ModalProps = {\n OnClose = configuration.OnClose\n Headline = configuration.Headline\n Body = body\n Footer = footer\n }\n\n Modal.view props","module Client.Page.User.MyAlerts\n\nopen Client\nopen Client.Components\nopen Client.Domain\nopen Client.Forms\nopen Client.DomainTypes\n\nopen Client.InfrastructureTypes\nopen Client.InfrastructureTypes.Form\nopen Client.DomainTypes.Msg\nopen Client.Infrastructure.Api\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React.Props\nopen Fulma\nopen Fulma.Extensions.Wikiki\nopen Microsoft.FSharp.Core\nopen Shared\nopen Shared.Dto\nopen Shared.Infrastructure\nopen Fable.React\nopen Shared.Dto.Dto\nopen Shared.DtoTypes\nopen Thoth.Elmish\n\ntype DataModel = {\n Session: UserSession\n ContactInfos: AlertDto.ContactInfo list\n Alerts: AlertDto.RunningAlert list\n Sensors: IdValue list\n ContactInfoForm: ContactInfo.Model option\n AlertForm: AlertForm.Model option\n ContactInfoDeleteModal: AlertDto.ContactInfo option\n AlertDeleteModal: AlertDto.RunningAlert option\n BuyAlertsFormModal: BuyAlertPackagesForm.Model option\n AlertStartedModal: unit option\n PurchasedAlertsCount: AlertDto.PurchasedAlertCount\n}\n\ntype LoadingModel = {\n Session: UserSession\n ContactInfos: AlertDto.ContactInfo list option\n Alerts: AlertDto.RunningAlert list option\n Sensors: IdValue list option\n PurchasedAlertCounts: AlertDto.PurchasedAlertCount option\n}\n\ntype Model = Loadable\n\nlet init (session: UserSession) =\n let requestData = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n let cmd =\n Cmd.batch [\n Cmd.OfAsync.perform api.getMyAlerts requestData (AlertsReceived >> MyAlerts)\n Cmd.OfAsync.perform api.getMyContactInfos requestData (ContactInfosReceived >> MyAlerts)\n Cmd.OfAsync.perform api.getMyAirTemperatureMapSensors requestData (SensorsReceived >> MyAlerts)\n Cmd.OfAsync.perform api.getPurchasedAlertCounts requestData (PurchasedAlertCountsReceived >> MyAlerts)\n ]\n\n Loadable.Loading {\n Session = session\n ContactInfos = None\n Alerts = None\n Sensors = None\n PurchasedAlertCounts = None\n },\n cmd\n(*Loadable.Error \"Die Frostbewarnung ist aktuell deaktiviert und wird Anfang nächsten Jahres wieder aktiviert\",\n Cmd.none*)\n\nlet private createDataModel (loadingModel: LoadingModel) : Model option =\n (fun contactInfos alerts sensors purchasedCounts ->\n Loadable.Data {\n Session = loadingModel.Session\n ContactInfos = contactInfos\n Alerts = alerts\n Sensors = sensors\n ContactInfoForm = None\n AlertForm = None\n ContactInfoDeleteModal = None\n AlertDeleteModal = None\n BuyAlertsFormModal = None\n AlertStartedModal = None\n PurchasedAlertsCount = purchasedCounts\n }\n )\n |> Some\n |> Option.apply loadingModel.ContactInfos\n |> Option.apply loadingModel.Alerts\n |> Option.apply loadingModel.Sensors\n |> Option.apply loadingModel.PurchasedAlertCounts\n\nlet tryDataModel (loadingModel: LoadingModel) =\n let newModel =\n createDataModel loadingModel\n |> Option.defaultValue (Loadable.Loading loadingModel)\n\n newModel, Cmd.none\n\nlet update (msg: MyAlertsMsg) (model: Model) =\n match msg, model with\n | SensorsReceived sensorsResult, Loadable.Loading loadingModel ->\n match sensorsResult with\n | Ok sensors ->\n let newLoadingModel = { loadingModel with Sensors = Some sensors }\n\n tryDataModel newLoadingModel\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Bewarnungen\" |> Toast.error\n\n model, toastCmd\n | AlertsReceived alertsResult, Loadable.Loading loadingModel ->\n match alertsResult with\n | Ok alerts ->\n let newLoadingModel = { loadingModel with Alerts = Some alerts }\n\n tryDataModel newLoadingModel\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Bewarnungen\" |> Toast.error\n\n model, toastCmd\n | ContactInfosReceived contactInfosResult, Loadable.Loading loadingModel ->\n match contactInfosResult with\n | Ok contactInfos ->\n let newLoadingModel = { loadingModel with ContactInfos = Some contactInfos }\n\n tryDataModel newLoadingModel\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Bewarnungen\" |> Toast.error\n\n model, toastCmd\n | ContactInfosReceived contactInfosResult, Loadable.Data dataModel ->\n match contactInfosResult with\n | Ok contactInfos ->\n let newModel = { dataModel with ContactInfos = contactInfos }\n\n Loadable.Data newModel, Cmd.none\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Kontaktdaten\" |> Toast.error\n\n model, toastCmd\n | PurchasedAlertCountsReceived countsResult, Loadable.Loading loadingModel ->\n match countsResult with\n | Ok counts ->\n let newLoadingModel = { loadingModel with PurchasedAlertCounts = Some counts }\n\n tryDataModel newLoadingModel\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Bewarnungen\" |> Toast.error\n\n model, toastCmd\n | PurchasedAlertCountsReceived countsResult, Loadable.Data dataModel ->\n match countsResult with\n | Ok counts ->\n let newModel = { dataModel with PurchasedAlertsCount = counts }\n\n Loadable.Data newModel, Cmd.none\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Bewarnungen\" |> Toast.error\n\n Loadable.Error \"Fehler beim Laden der Daten\", toastCmd\n | ContactInfoForm formMsg, Loadable.Data dataModel ->\n match dataModel.ContactInfoForm with\n | Some formModel ->\n let formModel, cmd, formResult = ContactInfo.update formMsg formModel\n\n match formResult with\n | ContactInfo.Noop ->\n Loadable.Data { dataModel with ContactInfoForm = Some formModel },\n Cmd.map (ContactInfoForm >> MyAlerts) cmd\n | ContactInfo.CloseModal ->\n Loadable.Data { dataModel with ContactInfoForm = None }, Cmd.map (ContactInfoForm >> MyAlerts) cmd\n | ContactInfo.CloseAndRefresh ->\n let requestData = {\n SessionKey = dataModel.Session.SessionKey\n Data = ()\n }\n\n let cmds =\n Cmd.batch [\n Cmd.map (ContactInfoForm >> MyAlerts) cmd\n Cmd.OfAsync.perform api.getMyContactInfos requestData (ContactInfosReceived >> MyAlerts)\n ]\n\n Loadable.Data { dataModel with ContactInfoForm = None }, cmds\n | None -> model, Cmd.none\n | OpenContactInfoForm, Loadable.Data dataModel ->\n let formModel = ContactInfo.init dataModel.Session\n\n Loadable.Data { dataModel with ContactInfoForm = Some formModel }, Cmd.none\n | OpenContactInfoDeleteModal contactInfo, Loadable.Data dataModel ->\n Loadable.Data { dataModel with ContactInfoDeleteModal = Some contactInfo }, Cmd.none\n | CloseContactInfoDeleteModal, Loadable.Data dataModel ->\n Loadable.Data { dataModel with ContactInfoDeleteModal = None }, Cmd.none\n | DeleteContactInfo id, Loadable.Data dataModel ->\n let request = {\n SessionKey = dataModel.Session.SessionKey\n Data = id\n }\n\n Loadable.Data { dataModel with ContactInfoDeleteModal = None },\n Cmd.OfAsync.perform api.deleteContactInfo request (ContactInfoDeleted >> MyAlerts)\n | ContactInfoDeleted result, Loadable.Data dataModel ->\n match result with\n | Ok _ ->\n let toastCmd = Toast.create \"Löschen war erfolgreich\" |> Toast.success\n\n let request = {\n SessionKey = dataModel.Session.SessionKey\n Data = ()\n }\n\n let reloadCmd =\n Cmd.OfAsync.perform api.getMyContactInfos request (ContactInfosReceived >> MyAlerts)\n\n let commands = Cmd.batch [ toastCmd; reloadCmd ]\n\n model, commands\n | Error _ ->\n let toastCmd = Toast.create \"Beim Löschen ist ein Fehler aufgetreten\" |> Toast.error\n\n model, toastCmd\n | OpenAlertDeleteModal runningAlert, Loadable.Data dataModel ->\n Loadable.Data { dataModel with AlertDeleteModal = Some runningAlert }, Cmd.none\n | CloseAlertDeleteModal, Loadable.Data dataModel ->\n Loadable.Data { dataModel with AlertDeleteModal = None }, Cmd.none\n | DeleteAlert id, Loadable.Data dataModel ->\n let request = {\n SessionKey = dataModel.Session.SessionKey\n Data = id\n }\n\n Loadable.Data { dataModel with AlertDeleteModal = None },\n Cmd.OfAsync.perform api.deleteAlert request (AlertDeleted >> MyAlerts)\n | AlertDeleted result, Loadable.Data dataModel ->\n match result with\n | Ok _ ->\n let toastCmd = Toast.create \"Löschen war erfolgreich\" |> Toast.success\n\n let request = {\n SessionKey = dataModel.Session.SessionKey\n Data = ()\n }\n\n let reloadCmd =\n Cmd.OfAsync.perform api.getMyAlerts request (AlertsReceived >> MyAlerts)\n\n let commands = Cmd.batch [ toastCmd; reloadCmd ]\n\n model, commands\n | Error _ ->\n let toastCmd = Toast.create \"Beim Löschen ist ein Fehler aufgetreten\" |> Toast.error\n\n model, toastCmd\n | AlertsReceived alertsResult, Loadable.Data dataModel ->\n match alertsResult with\n | Ok alerts ->\n let newModel = { dataModel with Alerts = alerts }\n\n Loadable.Data newModel, Cmd.none\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Bewarnungen\" |> Toast.error\n\n model, toastCmd\n | AlertForm formMsg, Loadable.Data dataModel ->\n match dataModel.AlertForm with\n | Some formModel ->\n let formModel, cmd, formResult = AlertForm.update formMsg formModel\n\n match formResult with\n | AlertForm.Noop ->\n Loadable.Data { dataModel with AlertForm = Some formModel }, Cmd.map (AlertForm >> MyAlerts) cmd\n | AlertForm.CloseModal ->\n Loadable.Data { dataModel with AlertForm = None }, Cmd.map (AlertForm >> MyAlerts) cmd\n | AlertForm.CloseAndRefresh ->\n Loadable.Data {\n dataModel with\n AlertForm = None\n AlertStartedModal = Some()\n },\n Cmd.map (AlertForm >> MyAlerts) cmd\n | None -> model, Cmd.none\n | CloseAlertStartedModal, Loadable.Data dataModel ->\n let requestData = {\n SessionKey = dataModel.Session.SessionKey\n Data = ()\n }\n\n Loadable.Data { dataModel with AlertStartedModal = None },\n Cmd.OfAsync.perform api.getMyAlerts requestData (AlertsReceived >> MyAlerts)\n\n | OpenAlertForm, Loadable.Data dataModel ->\n Loadable.Data {\n dataModel with\n AlertForm =\n Some\n <| AlertForm.init dataModel.Session dataModel.Sensors dataModel.ContactInfos\n },\n Cmd.none\n | OpenBuyForm, Loadable.Data dataModel ->\n let formModel = BuyAlertPackagesForm.init dataModel.Session.SessionKey\n\n Loadable.Data { dataModel with BuyAlertsFormModal = Some formModel }, Cmd.none\n | BuyPackagesForm msg, Loadable.Data dataModel ->\n match dataModel.BuyAlertsFormModal with\n | Some modal ->\n let newFormModel, cmd, formResult = BuyAlertPackagesForm.update msg modal\n\n match formResult with\n | Close -> Loadable.Data { dataModel with BuyAlertsFormModal = None }, Cmd.none\n | CloseAndRefresh -> init dataModel.Session\n | FormResult.Noop ->\n Loadable.Data { dataModel with BuyAlertsFormModal = Some newFormModel }, Cmd.map MyAlerts cmd\n | None -> model, Cmd.none\n | _ -> model, Cmd.none\n\nlet contactInfoInUse (alerts: AlertDto.RunningAlert list) (contactInfo: int) =\n alerts |> List.exists (fun alert -> alert.Alert.ContactInfoId = contactInfo)\n\nlet private createDeleteContactInfoButton contactInfo inUse dispatch =\n let dynamicButtonOptions =\n if inUse then\n [\n Button.Disabled true\n Button.CustomClass Tooltip.ClassName\n Button.Props [ Tooltip.dataTooltip \"Ist gerade in Verwendung\" ]\n ]\n else\n []\n\n let staticButtonOptions = [\n Button.Color IsDanger\n Button.OnClick(fun _ -> OpenContactInfoDeleteModal contactInfo |> dispatch)\n ]\n\n let buttonOptions = List.concat [ dynamicButtonOptions; staticButtonOptions ]\n\n Button.button buttonOptions [\n Icon.icon [] [ Fa.i [ Fa.Solid.Trash ] [] ]\n span [] [ str \"Löschen\" ]\n ]\n\n\nlet private createContactInfoRow dispatch inUse (contactInfo: AlertDto.ContactInfo) =\n Columns.columns [ Columns.IsVCentered; Columns.bottomBorder ] [\n Column.column [] [\n span [ Html.label ] [ str \"Name:\" ]\n span [ Html.bold ] [ str contactInfo.Name ]\n ]\n Column.column [] [\n span [ Html.label ] [\n str (AlertDto.contactInfoTypeToString contactInfo.Data)\n ]\n span [ Html.bold ] [\n str (AlertDto.contactInfoToString contactInfo.Data)\n ]\n ]\n Column.column [\n Column.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Right)\n ]\n ] [\n createDeleteContactInfoButton contactInfo inUse dispatch\n ]\n ]\n\nlet private createAddButton onAddClick =\n Button.button [ Button.Color IsLink; Button.OnClick onAddClick ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Plus ] [] ]\n span [] [ str \"Hinzufügen\" ]\n ]\n\n\nlet private createAddButtonRow currentCount maybeMaxCount onAddClick =\n let isAllowed =\n match maybeMaxCount with\n | Some maxCount -> maxCount - currentCount > 0\n | None -> true\n\n let content =\n if isAllowed then\n let buttonOptions = [ Button.Color IsLink; Button.OnClick onAddClick ]\n\n\n Level.item [] [\n Button.button buttonOptions [\n Icon.icon [] [ Fa.i [ Fa.Solid.Plus ] [] ]\n span [] [ str \"Hinzufügen\" ]\n ]\n ]\n else\n Level.item [] [\n p [] [ str \"Keine weiteren Einträge verfügbar\" ]\n ]\n\n Level.level [] [ Level.left [] []; Level.right [] [ content ] ]\n\n\nlet boxHeadlineWithCount headline usedCount maxCount =\n let usedText = sprintf \"%d von %s in Verwendung\" usedCount maxCount\n\n Level.level [] [\n Level.left [] [\n Level.item [] [ Heading.p [ Heading.Is3 ] [ str headline ] ]\n ]\n Level.right [] [ Level.item [] [ span [] [ str usedText ] ] ]\n ]\n\nlet private contactInfoBox dispatch (model: DataModel) =\n let rows =\n model.ContactInfos\n |> List.map (fun contactInfo -> contactInfo, contactInfoInUse model.Alerts contactInfo.Id)\n |> List.map (fun (contactInfo, inUse) -> createContactInfoRow dispatch inUse contactInfo)\n\n let buttonRow =\n createAddButton (fun _ -> dispatch OpenContactInfoForm)\n |> (fun button ->\n Level.level [] [\n Level.left [] []\n Level.right [] [ Level.item [] [ button ] ]\n ]\n )\n\n let headingContent = str \"2. Kontakt Daten hinzufügen\"\n\n let content = [ yield! rows; buttonRow ]\n\n Box.wrapWithHeading headingContent content\n\nlet private createDeleteAlertButton alert dispatch =\n Button.button [\n Button.Color IsDanger\n Button.OnClick(fun _ -> OpenAlertDeleteModal alert |> dispatch)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Trash ] [] ]\n span [] [ str \"Löschen\" ]\n ]\n\nlet private createSensorLink dispatch (sensor: IdValue) =\n a [\n OnClick(fun _ -> dispatch (Route.MySensSensor sensor.Id |> GoToRoute |> Global))\n ] [ str (MapSensor.getBaseData sensor.Value).Name ]\n\nlet private createAlertsRowIcon (alert: AlertDto.RunningAlert) =\n match alert.Alert.PhoneAlertType with\n | AlertDto.Call ->\n Icon.icon [\n Icon.CustomClass Tooltip.ClassName\n Icon.Props [ Tooltip.dataTooltip \"Anruf\" ]\n ] [ Fa.i [ Fa.Solid.Phone ] [] ]\n | AlertDto.SMS ->\n Icon.icon [\n Icon.CustomClass Tooltip.ClassName\n Icon.Props [ Tooltip.dataTooltip \"SMS\" ]\n ] [ Fa.i [ Fa.Solid.Sms ] [] ]\n\nlet private createAlertsRow\n dispatch\n (sensors: IdValue list)\n (contactInfos: AlertDto.ContactInfo list)\n (alert: AlertDto.RunningAlert)\n =\n let sensorName =\n sensors\n |> List.tryFind (fun sensor -> sensor.Id = alert.Alert.SensorId)\n |> Option.map (createSensorLink dispatch)\n |> Option.defaultValue (str \"Unbekannter Sensor?\")\n\n let contactInfoName =\n contactInfos\n |> List.tryFind (fun info -> info.Id = alert.Alert.ContactInfoId)\n |> Option.map (fun info -> info.Name)\n |> Option.defaultValue \"Unbekannte Kontakt Daten\"\n\n let stateClass =\n match alert.State with\n | AlertDto.Ready _ -> \"alert_ready\"\n | AlertDto.Alerted _ -> \"alert_alerted\"\n | AlertDto.Outdated _ -> \"alert_outdated\"\n\n let stateText = sprintf \"%s\" (AlertDto.stateToString alert.State)\n\n let temperatureString =\n sprintf\n \"Grenze: %.1f ˚C (Aktuell: %s)\"\n alert.Alert.Threshold\n (alert.LastTemperature\n |> Option.map (fun value -> sprintf \"%.1f ˚C\" value.Value)\n |> Option.defaultValue \"Warte auf neue Daten\")\n\n Columns.columns [ Columns.IsVCentered; Columns.bottomBorder ] [\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ sensorName ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [\n createAlertsRowIcon alert\n span [] [ str contactInfoName ]\n ]\n Column.column [ Column.Width(Screen.All, Column.Is2) ] [\n str (AlertDto.thresholdTypeToString alert.Alert.TemperatureType)\n ]\n Column.column [] [ str temperatureString ]\n Column.column [\n Column.CustomClass stateClass\n Column.Width(Screen.All, Column.IsNarrow)\n ] [ str stateText ]\n Column.column [\n Column.Width(Screen.All, Column.IsNarrow)\n Column.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Right)\n ]\n ] [\n createDeleteAlertButton alert (MyAlerts >> dispatch)\n ]\n ]\n\nlet private alertsBox dispatch (model: DataModel) =\n let rows =\n model.Alerts\n |> List.map (createAlertsRow dispatch model.Sensors model.ContactInfos)\n\n let alertsCount = List.length model.Alerts\n\n let maxCount =\n model.PurchasedAlertsCount.PurchasedAlertPackagesCount\n |> Option.map (fun count -> count * 3)\n\n let maxCountText = maxCount |> Option.map string |> Option.defaultValue \"unendlich\"\n\n let addButtonRow =\n createAddButtonRow alertsCount maxCount (fun _ -> dispatch (MyAlerts OpenAlertForm))\n\n let headline =\n boxHeadlineWithCount \"3. Frostbewarnungen einrichten\" alertsCount maxCountText\n\n let boxContent = [\n headline\n if not (List.isEmpty model.ContactInfos) then\n yield! rows\n addButtonRow\n else\n ()\n ]\n\n Box.box' [] boxContent\n\nlet deleteContactInfoModalConfig dispatch (contactInfo: AlertDto.ContactInfo) : ConfirmationModal.Configuration =\n let text =\n sprintf \"Sollen die Kontaktdaten '%s' wirklich gelöscht werden?\" contactInfo.Name\n\n {\n Headline = \"Kontaktdaten löschen\"\n Text = text\n OnClose = (fun _ -> dispatch CloseContactInfoDeleteModal)\n OnYes = (fun _ -> dispatch (DeleteContactInfo contactInfo.Id))\n OnNo = (fun _ -> dispatch CloseContactInfoDeleteModal)\n }\n\nlet deleteAlertModalConfig\n dispatch\n (sensors: IdValue list)\n (alert: AlertDto.RunningAlert)\n : ConfirmationModal.Configuration =\n let sensorName =\n sensors\n |> List.tryFind (fun sensor -> sensor.Id = alert.Alert.SensorId)\n |> Option.map (fun sensor -> (MapSensor.getBaseData sensor.Value).Name)\n |> Option.defaultValue \"Unbekannter Sensor\"\n\n let text =\n sprintf \"Sollen die Bewarnung für den Sensor '%s' wirklich gelöscht werden?\" sensorName\n\n {\n Headline = \"Bewarnung löschen\"\n Text = text\n OnClose = (fun _ -> dispatch CloseAlertDeleteModal)\n OnYes = (fun _ -> dispatch (DeleteAlert alert.Alert.Id))\n OnNo = (fun _ -> dispatch CloseAlertDeleteModal)\n }\n\n\nlet private packagesText (packagesCount: int option) =\n match packagesCount with\n | None -> \"Du hast unendlich viele Pakete zur Verfügung\"\n | Some 0 -> \"Du hast noch kein Frostbewarnungs-Paket gebucht\"\n | Some 1 -> \"Du hast ein Frostbewarnungs-Paket gebucht\"\n | Some cnt -> sprintf \"Du hast %d Frostbewarnungs Pakete gebucht\" cnt\n\ntype BuyButtonState =\n | NotAllowed of string\n | Allowed\n\nlet private createBuyButton dispatch (state: BuyButtonState) =\n Button.button [\n Button.Color IsLink\n Button.OnClick(fun _ -> dispatch OpenBuyForm)\n Button.CustomClass Tooltip.ClassName\n match state with\n | NotAllowed reason ->\n Button.Props [ Tooltip.dataTooltip reason ]\n Button.Disabled true\n | Allowed -> ()\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Plus ] [] ]\n span [] [ str \"Weitere Pakete bestellen\" ]\n ]\n\n\nlet private packagesInfoBox dispatch (model: DataModel) =\n let allAlertsUsed =\n match model.PurchasedAlertsCount.PurchasedAlertPackagesCount with\n | None -> false\n | Some x -> x * 3 <= List.length model.Alerts\n\n let buyButtonState =\n match model.PurchasedAlertsCount.PurchasedAlertPackagesCount, allAlertsUsed with\n | None, _ -> NotAllowed \"Du brauchst kein Bewarnungspaket\"\n | _, true -> Allowed\n | _, false -> NotAllowed \"Du hast noch freie Bewarnungen\"\n\n let packagesText =\n packagesText model.PurchasedAlertsCount.PurchasedAlertPackagesCount\n\n let headingContent = str \"1. Frostbewarnungs Pakete bestellen\"\n\n let content =\n Level.level [] [\n Level.left [] [ Level.item [] [ str packagesText ] ]\n Level.right [] [\n Level.item [] [ createBuyButton dispatch buyButtonState ]\n ]\n ]\n\n Box.wrapWithHeading headingContent [ content ]\n\nlet private alertStartedModal dispatch =\n let closeModal = (fun _ -> dispatch MyAlertsMsg.CloseAlertStartedModal)\n\n let headline = \"Frostbewarnung gestartet\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [\n Content.content [] [\n p [] [\n str\n \"\"\"\nDie Bewarnung wurde gestartet. Du solltest in den nächsten Minuten eine SMS oder einen Anruf\nauf die ausgewählte Telefonnummer erhalten.\n\"\"\"\n ]\n p [] [\n str\n \"\"\"\nWenn dem nicht so ist, dann kontrolliere die Telefonnummer und erstelle die Bewarnung neu!\n\"\"\"\n\n ]\n ]\n ]\n Modal.Card.foot [] [\n Button.button [ Button.OnClick closeModal ] [ str \"Ok\" ]\n ]\n ]\n ]\n\n\nlet dataView dispatch (model: DataModel) =\n let myAlertsDispatch = (MyAlerts >> dispatch)\n\n let contactForm =\n model.ContactInfoForm\n |> Option.map (ContactInfo.view (ContactInfoForm >> myAlertsDispatch))\n\n let alertForm =\n model.AlertForm |> Option.map (AlertForm.view (AlertForm >> myAlertsDispatch))\n\n let deleteContactInfoModal =\n model.ContactInfoDeleteModal\n |> Option.map (deleteContactInfoModalConfig myAlertsDispatch >> ConfirmationModal.view false)\n\n let deleteAlertModal =\n model.AlertDeleteModal\n |> Option.map (\n deleteAlertModalConfig myAlertsDispatch model.Sensors\n >> ConfirmationModal.view false\n )\n\n let buyPackagesModal =\n model.BuyAlertsFormModal\n |> Option.map (BuyAlertPackagesForm.view (BuyPackagesForm >> myAlertsDispatch))\n\n let alertStartedModal =\n model.AlertStartedModal\n |> Option.map (fun _ -> alertStartedModal myAlertsDispatch)\n\n let containerContent = [\n packagesInfoBox myAlertsDispatch model\n match model.PurchasedAlertsCount.PurchasedAlertPackagesCount with\n | None -> contactInfoBox myAlertsDispatch model\n | Some x when x > 0 -> contactInfoBox myAlertsDispatch model\n | _ -> ()\n\n if not (List.isEmpty model.ContactInfos) then\n alertsBox dispatch model\n else\n ()\n ]\n\n [\n Some(Container.container [ Container.isFullWidth ] containerContent)\n\n contactForm\n alertForm\n deleteContactInfoModal\n deleteAlertModal\n buyPackagesModal\n alertStartedModal\n ]\n |> List.choose id\n\nlet view (model: Model) dispatch =\n Loadable.listView (dataView dispatch) model","module Client.Page.User.MySensorsData\n\nopen Client\nopen Client.Infrastructure.Api\nopen Client.Domain\nopen Client.Infrastructure\nopen Client.Domain.MeasuredValueString\nopen Client.DomainTypes\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Client.Map.SensorPopup\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Microsoft.FSharp.Core\nopen Shared\nopen Shared.Dto.Dto\nopen Shared.Dto.MapSensorData\nopen Shared.DtoTypes.MapSensorData\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\ntype DataModel = {\n Sensors: MapSensorDataResponse\n Session: UserSession\n}\n\ntype Model = Loadable\n\nlet private refreshCmd sessionKey =\n let request = {\n SessionKey = sessionKey\n Data = ()\n }\n\n Cmd.OfAsync.perform api.getMyMapSensorsData request (MySensorDataMsg.DataReceived >> MySensorsData)\n\nlet init (session: UserSession) =\n Loadable.Loading session, refreshCmd session.SessionKey\n\nlet private getSession (model: Model) =\n match model with\n | Loadable.Loading session -> session\n | Loadable.Data dataModel -> dataModel.Session\n | _ -> failwith \"That should never happend\"\n\nlet private getSessionKey (model: Model) =\n getSession model |> fun session -> session.SessionKey\n\nlet update (msg: MySensorDataMsg) (model: Model) =\n match msg, model with\n | MySensorDataMsg.DataReceived result, Loadable.Loading session ->\n match result with\n | Ok data ->\n Loadable.Data {\n Sensors = data\n Session = session\n },\n Cmd.none\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Sensordaten\" |> Toast.error\n\n model, toastCmd\n | MySensorDataMsg.DataReceived result, Loadable.Data dataModel ->\n match result with\n | Ok data -> Loadable.Data { dataModel with Sensors = data }, Cmd.none\n | Error _ ->\n let toastCmd = Toast.create \"Fehler beim Laden der Sensordaten\" |> Toast.error\n\n model, toastCmd\n | RefreshData, _ -> Loadable.Loading(getSession model), refreshCmd (getSessionKey model)\n | _ -> model, Cmd.none\n\nlet currentDataLevelItem label value =\n Level.item [ Level.Item.HasTextCentered ] [\n div [] [\n Level.heading [] [ str label ]\n Level.title [] [ str value ]\n ]\n ]\n\nlet currentAirDataBox (data: AirSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Aktuelle Temperatur\" (temperatureToString data.AirTemperature)\n currentDataLevelItem \"Aktuelle Luftfeuchtigkeit\" (percentageToString data.AirHumidity)\n currentDataLevelItem \"Feuchttemperatur\" (temperatureToString data.HumidTemperature)\n ]\n]\n\nlet currentGroundDataBox (data: GroundSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Aktuelle Bodenfeuchtigkeit\" (percentageToString data.GroundHumidity)\n currentDataLevelItem \"Aktuelle Temperatur\" (temperatureToString data.GroundTemperature)\n ]\n]\n\nlet currentRainfallDataBox (data: RainFallSensorData) =\n let maybeRainFallToString = Option.map rainFallToString >> Option.defaultValue \"-\"\n\n [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Regen aktuell\" (rainFallToString data.CurrentRainFall)\n currentDataLevelItem \"Regen letzte Stunde\" (maybeRainFallToString data.RainFallLastHour)\n currentDataLevelItem \"Regen letzte 24 Stunden\" (maybeRainFallToString data.RainFallLast24h)\n ]\n ]\n\nlet currentSoilPhDataBox (data: SoilPhSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"PH-Wert\" (sprintf \"%.2f\" data.SoilPh)\n currentDataLevelItem \"Bodentemperatur\" (temperatureToString data.SoilTemperature)\n ]\n]\n\nlet currentAverageWindSpeedDataBox (data: AverageWindSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Ø Windgeschwindigkeit\" (windSpeedToString data.AverageWindSpeed)\n ]\n]\n\nlet currentLeafletMoistureDataBox (data: LeafletMoistureSensorData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Blattnässe\" (percentageToString data.LeafletMoisture)\n currentDataLevelItem \"Blatttemperatur\" (temperatureToString data.LeafletTemperature)\n ]\n]\n\nlet currentWeatherStationDataBox (data: WeatherStationSensorData) = [\n let (windSpeed, windDirection) =\n match data.CurrentWind with\n | Wind wind -> (windSpeedToString wind.WindSpeed, windDirectionToString wind.WindDirection)\n | NoWind -> (\"-\", \"-\")\n\n\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toShortString data.Date.LocalDateTime)\n currentDataLevelItem \"Aktuelle Temperatur\" (temperatureToString data.AirTemperature)\n currentDataLevelItem \"Aktuelle Luftfeuchtigkeit\" (percentageToString data.AirHumidity)\n currentDataLevelItem \"Aktuelle Windgeschwindigkeit\" windSpeed\n currentDataLevelItem \"Aktuelle Windrichtung\" windDirection\n ]\n]\n\nlet currentLiquidLevelDataBox (data: LiquidLevelData) = [\n Level.level [] [\n currentDataLevelItem \"Wann?\" (DateTime.toString data.Date.LocalDateTime)\n currentDataLevelItem \"Füllstand\" (liquidLevelToString data.LiquidLevel)\n ]\n]\n\nlet private createDetailsSensorNameLink props (id: int) (name: string) dispatch =\n let customProps = [\n id |> Route.MySensSensor |> Clickable.onClickGoToRoute dispatch |> OnClick :> IHTMLProp\n ]\n\n a (List.append customProps props) [ str name ]\n\nlet private createActiveBoxTitleLink dispatch (sensor: ActiveMapSensorDataDto) : ReactElement =\n let sensorLinkStyle =\n Style [\n Color(getSensorNameLinkColor sensor.Data)\n TextDecoration \"underline\"\n ]\n :> IHTMLProp\n\n createDetailsSensorNameLink [ sensorLinkStyle ] sensor.Id sensor.Name dispatch\n\nlet private createDefectiveBoxTitleLink dispatch (sensor: DefectiveMyMapSensorDataDto) : ReactElement =\n let sensorLinkStyle =\n Style [ Color \"black\"; TextDecoration \"underline\" ] :> IHTMLProp\n\n createDetailsSensorNameLink [ sensorLinkStyle ] sensor.Id sensor.Name dispatch\n\nlet private createBoxSubTitle (maybeSecondName: string option) =\n match maybeSecondName with\n | Some secondName -> Some(Heading.h5 [ Heading.IsSubtitle ] [ str secondName ])\n | None -> None\n\nlet private wrapBoxTitles (title: ReactElement) (maybeSubtitle: ReactElement option) =\n div [ Class \"mb-5\" ] [\n Heading.h3 [] [ title ]\n match maybeSubtitle with\n | Some subtitle -> subtitle\n | None -> ()\n ]\n\nlet private wrapBoxHeading (headingContent: ReactElement list) : ReactElement =\n div\n [\n Style [\n TextAlign TextAlignOptions.Center\n Display DisplayOptions.Flex\n AlignItems AlignItemsOptions.Center\n JustifyContent \"center\"\n ]\n ]\n headingContent\n\nlet private createMapLink dispatch (sensor: ActiveMapSensorDataDto) : ReactElement =\n a [\n sensor.Location\n |> Some\n |> Route.SensorMap\n |> Clickable.onClickGoToRoute dispatch\n |> OnClick\n ] [\n Icon.icon [\n Icon.CustomClass \"mb-5\"\n Icon.CustomClass \"ml-2\"\n ] [\n Fa.i [ Fa.Size Fa.FaLarge; Fa.Solid.MapMarkedAlt ] []\n ]\n ]\n\nlet private dataTextContent (text: string) (icon: Fa.IconOption) = [\n div [\n Style [\n Display DisplayOptions.Flex\n FlexDirection FlexDirection.Column\n JustifyContent \"center\"\n AlignItems AlignItemsOptions.Center\n ]\n ] [\n Fa.span [ icon ] []\n p [ Class \"ml-2\" ] [ str text ]\n ]\n]\n\nlet private activeSensorDataContent (sensor: ActiveMapSensorDataDto) : ReactElement list =\n match sensor.Data with\n | AirData air -> currentAirDataBox air\n | GroundData ground -> currentGroundDataBox ground\n | RainFallData rainFall -> currentRainfallDataBox rainFall\n | SoilPhData data -> currentSoilPhDataBox data\n | AverageWindSpeedData data -> currentAverageWindSpeedDataBox data\n | LeafletMoistureData data -> currentLeafletMoistureDataBox data\n | WeatherStationData data -> currentWeatherStationDataBox data\n | LiquidLevelData data -> currentLiquidLevelDataBox data\n | NoDataAvailable -> dataTextContent \"Keine aktuellen Daten gefunden\" Fa.Solid.Hourglass\n | _ -> []\n\nlet defectiveSensorDataContent (sensor: DefectiveMyMapSensorDataDto) : ReactElement list =\n dataTextContent \"Der Sensor ist defekt\" Fa.Solid.ExclamationCircle\n\nlet private defectiveSensorBoxContent dispatch (sensor: DefectiveMyMapSensorDataDto) : ReactElement list =\n let title = createDefectiveBoxTitleLink dispatch sensor\n let subtitle = createBoxSubTitle sensor.SecondName\n let titles = wrapBoxTitles title subtitle\n let boxHeading = wrapBoxHeading [ titles ]\n\n let boxData = defectiveSensorDataContent sensor\n\n boxHeading :: boxData\n\nlet private activeSensorBoxContent dispatch (sensor: ActiveMapSensorDataDto) : ReactElement list =\n let title = createActiveBoxTitleLink dispatch sensor\n let subtitle = createBoxSubTitle sensor.SecondName\n let titles = wrapBoxTitles title subtitle\n\n let boxHeading = wrapBoxHeading [ titles ]\n\n let mapLink = createMapLink dispatch sensor\n\n let boxHeading = wrapBoxHeading [ boxHeading; mapLink ]\n\n let boxData = activeSensorDataContent sensor\n\n boxHeading :: boxData\n\nlet private surroundingBox (content: ReactElement list) =\n Box.box' [] [\n Columns.columns [] [\n Column.column [ Column.Width(Screen.All, Column.IsFull) ] content\n ]\n ]\n\nlet private activeSensorBox dispatch (sensor: ActiveMapSensorDataDto) =\n activeSensorBoxContent dispatch sensor |> surroundingBox\n\nlet sensorBoxContent dispatch (sensor: MyMapSensorDataDto) : ReactElement list =\n match sensor with\n | Active active -> activeSensorBoxContent dispatch active\n | Defective defective -> defectiveSensorBoxContent dispatch defective\n\nlet private groupView dispatch (group: UserGroupMapSensorsDto) =\n let sensorBoxes =\n group.Senors\n |> List.sortBy (fun sensor -> sensor.Name)\n |> List.map (activeSensorBox dispatch)\n\n let heading = sprintf \"Gruppe: %s\" group.Name\n\n [\n PageSkeleton.centeredHeading heading\n yield! sensorBoxes\n ]\n\nlet dataView dispatch (model: DataModel) =\n let mySensorBoxes =\n model.Sensors.MySensors\n |> List.sortBy getMyMapSensorName\n |> List.map (sensorBoxContent dispatch >> surroundingBox)\n\n let groupSensorBoxes =\n model.Sensors.Groups\n |> List.sortBy (fun group -> group.Name)\n |> List.collect (groupView dispatch)\n\n let button =\n Button.button [\n Button.Color Color.IsLink\n Button.OnClick(fun _ -> dispatch (MySensorsData MySensorDataMsg.RefreshData))\n ] [\n Icon.icon [ Icon.Size IsSmall ] [ Fa.i [ Fa.Solid.Sync ] [] ]\n span [] [ str \"Aktualisieren\" ]\n ]\n\n let buttonRow =\n Level.level [\n Level.Level.Modifiers [\n Modifier.Spacing(Spacing.MarginBottom, Spacing.Is3)\n ]\n ] [\n Level.left [] []\n Level.right [] [ Level.item [] [ button ] ]\n ]\n\n let content = [\n buttonRow\n yield! mySensorBoxes\n yield! groupSensorBoxes\n ]\n\n Container.container [ Container.isFullWidth ] content\n\nlet view (model: Model) dispatch = Loadable.view (dataView dispatch) model","module Client.Page.User.UserDefinedMapSensorProperties\n\nopen Browser.Types\nopen Browser.Navigator\nopen Client.Infrastructure.Api\nopen Client.Domain\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Client\nopen Thoth.Elmish\nopen Fable.React.Props\nopen Fable.React.Standard\nopen Fable.React\nopen Elmish\nopen Feliz\nopen Fulma\nopen Shared\nopen Shared.Dto\nopen Shared.Dto.Dto\nopen Shared.Dto.MapSensorSettings\nopen Shared.Infrastructure\n\ntype BaseSettings = {\n TtnSensor: string option\n Name: string option\n Latitude: float option\n Longitude: float option\n Altitude: float option\n}\n\ntype SoilSensorSettings = {\n WetLimit: double option\n DryLimit: double option\n BaseSettings: BaseSettings\n}\n\ntype SensorSettings =\n | Base of BaseSettings\n | Soil of SoilSensorSettings\n\nlet private baseDtoToSettings (dto: BaseMapSensorSettingsDto) = {\n TtnSensor = dto.TtnSensor\n Name = dto.Name\n Latitude = Option.map (fun (location: Location) -> location.Latitude) dto.Location\n Longitude = Option.map (fun (location: Location) -> location.Longitude) dto.Location\n Altitude = dto.Altitude\n}\n\nlet private updateBaseData (f: BaseSettings -> BaseSettings) (settings: SensorSettings) : SensorSettings =\n match settings with\n | Base baseSettings -> f baseSettings |> SensorSettings.Base\n | Soil soilSettings ->\n f soilSettings.BaseSettings\n |> (fun baseSettings -> SensorSettings.Soil { soilSettings with BaseSettings = baseSettings })\n\nlet private getBaseSettings (settings: SensorSettings) =\n match settings with\n | Base baseSettings -> baseSettings\n | Soil soilSettings -> soilSettings.BaseSettings\n\nlet private dtoToSensorSettings (dto: MapSensorSettingsDto) =\n match dto with\n | MapSensorSettingsDto.Base settings -> SensorSettings.Base(baseDtoToSettings settings)\n | MapSensorSettingsDto.Soil settings ->\n SensorSettings.Soil {\n WetLimit = settings.WetLimit\n DryLimit = settings.DryLimit\n BaseSettings = baseDtoToSettings settings.BaseSettings\n }\n\ntype DataModel = {\n SessionKey: SessionKey\n Id: int\n SensorSettings: SensorSettings\n DeviceLocationUpdateRunning: bool\n UpdateRequestRunning: bool\n}\n\ntype Model = Loadable\n\nlet init id (session: UserSession) : Model * Cmd =\n let requestData = {\n SessionKey = session.SessionKey\n Data = id\n }\n\n let cmd =\n Cmd.OfAsync.perform api.getMapSensorSettings requestData (DataReceived >> UserDefinedMapSensorProperties)\n\n Loadable.Loading session.SessionKey, cmd\n\nlet private createDataModel sessionKey (properties: MapSensorSettingsDto) : DataModel =\n let sensorSettings = dtoToSensorSettings properties\n\n let id =\n match properties with\n | MapSensorSettingsDto.Base baseSettings -> baseSettings.Id\n | MapSensorSettingsDto.Soil soilSettings -> soilSettings.BaseSettings.Id\n\n {\n SessionKey = sessionKey\n Id = id\n SensorSettings = sensorSettings\n DeviceLocationUpdateRunning = false\n UpdateRequestRunning = false\n }\n\nlet update (msg: UserDefinedMapSensorPropertiesMsg) (model: Model) =\n match (msg, model) with\n | DeviceLocationRequested, Loadable.Data data ->\n Loadable.Data { data with DeviceLocationUpdateRunning = true }, Cmd.none\n | DeviceLocationReceived position, Loadable.Data data ->\n let toastCmd =\n Toast.create \"GPS Koordinaten des Sensors erfolgreich übernommen\"\n |> Toast.success\n\n let newSensorSettings =\n updateBaseData\n (fun settings -> {\n settings with\n Latitude = Some position.coords.latitude\n Longitude = Some position.coords.longitude\n Altitude = position.coords.altitude |> Option.map (Math.round 0)\n })\n data.SensorSettings\n\n Loadable.Data {\n data with\n SensorSettings = newSensorSettings\n DeviceLocationUpdateRunning = false\n },\n toastCmd\n | DeviceLocationFailed _, Loadable.Data data ->\n let toastCmd =\n Toast.create \"Beim Auslesen der GPS Koordinaten ist ein Fehler aufgetreten\"\n |> Toast.error\n\n Loadable.Data { data with DeviceLocationUpdateRunning = false }, toastCmd\n | DataReceived response, Loadable.Loading sessionKey ->\n match response with\n | Result.Ok data -> Loadable.Data(createDataModel sessionKey data), Cmd.none\n | Result.Error(AuthErr err) ->\n let message =\n match err with\n | Unauthenticated -> \"Du bist nicht eingeloggt, bitte lade Seite nochmal neu\"\n | Unauthorized -> \"Du darfst diesen Sensor nicht bearbeiten\"\n\n Loadable.Error message, Cmd.none\n | Result.Error(CustomErr err) -> Loadable.Error err, Cmd.none\n | UpdateMapSensorProperties newProperties, Loadable.Data data ->\n let requestData = {\n SessionKey = data.SessionKey\n Data = newProperties\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.updateMapSensorSettings\n requestData\n (MapSensorPropertiesUpdated >> UserDefinedMapSensorProperties)\n\n Loadable.Data { data with UpdateRequestRunning = true }, cmd\n | MapSensorPropertiesUpdated result, Loadable.Data dataModel ->\n match result with\n | Result.Ok result ->\n let toastCmd =\n Toast.create \"Die Daten des Sensors wurden erfolgreich aktualisiert\"\n |> Toast.success\n\n Loadable.Data { dataModel with UpdateRequestRunning = false }, toastCmd\n | Result.Error _ ->\n Loadable.Error \"Beim Speichern ist ein Fehler aufgetreten. Versuche es bitte erneut\", Cmd.none\n | UpdateName name, Loadable.Data dataModel ->\n let newSensorSettings =\n updateBaseData (fun settings -> { settings with Name = name }) dataModel.SensorSettings\n\n Loadable.Data { dataModel with SensorSettings = newSensorSettings }, Cmd.none\n | UpdateLatitude latitude, Loadable.Data dataModel ->\n let newSensorSettings =\n updateBaseData (fun settings -> { settings with Latitude = latitude }) dataModel.SensorSettings\n\n Loadable.Data { dataModel with SensorSettings = newSensorSettings }, Cmd.none\n | UpdateLongitude longitude, Loadable.Data dataModel ->\n let newSensorSettings =\n updateBaseData (fun settings -> { settings with Longitude = longitude }) dataModel.SensorSettings\n\n Loadable.Data { dataModel with SensorSettings = newSensorSettings }, Cmd.none\n | UpdateAltitude altitude, Loadable.Data dataModel ->\n let newSensorSettings =\n updateBaseData (fun settings -> { settings with Altitude = altitude }) dataModel.SensorSettings\n\n Loadable.Data { dataModel with SensorSettings = newSensorSettings }, Cmd.none\n | UpdateWetLimit limit, Loadable.Data dataModel ->\n let newSettings =\n match dataModel.SensorSettings with\n | SensorSettings.Soil soilSettings -> SensorSettings.Soil { soilSettings with WetLimit = limit }\n | _ -> dataModel.SensorSettings\n\n Loadable.Data { dataModel with SensorSettings = newSettings }, Cmd.none\n | UpdateDryLimit limit, Loadable.Data dataModel ->\n let newSettings =\n match dataModel.SensorSettings with\n | SensorSettings.Soil soilSettings -> SensorSettings.Soil { soilSettings with DryLimit = limit }\n | _ -> dataModel.SensorSettings\n\n Loadable.Data { dataModel with SensorSettings = newSettings }, Cmd.none\n | _, _ -> model, Cmd.none\n\nlet private locationSuccessCallback dispatch (location: Position) =\n UserDefinedMapSensorPropertiesMsg.DeviceLocationReceived location\n |> UserDefinedMapSensorProperties\n |> dispatch\n\nlet private locationErrorCallback dispatch (error: PositionError) =\n UserDefinedMapSensorPropertiesMsg.DeviceLocationFailed error\n |> UserDefinedMapSensorProperties\n |> dispatch\n\nlet private createSaveRequestData\n (id: int)\n (settings: SensorSettings)\n (altitude: float option)\n (location: Location)\n : UpdatedMapSensorSettingsDto =\n match settings with\n | SensorSettings.Base baseSettings ->\n UpdatedMapSensorSettingsDto.Base {\n Id = id\n Name = baseSettings.Name\n Location = location\n Altitude = altitude\n }\n | SensorSettings.Soil soilSettings ->\n let baseSettings = {\n Id = id\n Name = soilSettings.BaseSettings.Name\n Location = location\n Altitude = altitude\n }\n\n UpdatedMapSensorSettingsDto.Soil {\n WetLimit = soilSettings.WetLimit\n DryLimit = soilSettings.DryLimit\n BaseSettings = baseSettings\n }\n\n\nlet private createSaveButton dispatch (model: DataModel) : ReactElement =\n let baseSettings = getBaseSettings model.SensorSettings\n\n let maybeRequestData =\n Option.map2 Location.create baseSettings.Longitude baseSettings.Latitude\n |> Option.flatten\n |> Option.map (createSaveRequestData model.Id model.SensorSettings baseSettings.Altitude)\n\n let buttonOptions = [\n Button.Color Color.IsSuccess\n Button.IsLoading model.UpdateRequestRunning\n\n match maybeRequestData with\n | Some requestData ->\n Button.OnClick(fun event ->\n event.preventDefault ()\n\n UpdateMapSensorProperties requestData\n |> UserDefinedMapSensorProperties\n |> dispatch\n )\n | None -> Button.Disabled true\n ]\n\n\n Button.button buttonOptions [ str \"Einstellungen speichern\" ]\n\nlet private createNameField dispatch name =\n Field.div [] [\n Label.label [] [ str \"Name\" ]\n Control.div [] [\n Input.text [\n Input.Placeholder \"MS-TL0815\"\n name |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> UpdateName\n |> UserDefinedMapSensorProperties\n |> dispatch\n )\n ]\n ]\n ]\n\nlet private createLatitudeField dispatch latitude =\n Field.div [] [\n Label.label [] [ str \"Breitengrad\" ]\n Control.div [] [\n Input.number [\n Input.Placeholder \"47.155999194351715\"\n latitude |> Inputs.optionalDoubleToString |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> Inputs.toDoubleOption\n |> UpdateLatitude\n |> UserDefinedMapSensorProperties\n |> dispatch\n )\n ]\n ]\n ]\n\nlet private createLongitudeField dispatch longitude =\n Field.div [] [\n Label.label [] [ str \"Längengrad\" ]\n Control.div [] [\n Input.number [\n Input.Placeholder \"15.649259567260742\"\n longitude |> Inputs.optionalDoubleToString |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> Inputs.toDoubleOption\n |> UpdateLongitude\n |> UserDefinedMapSensorProperties\n |> dispatch\n )\n ]\n ]\n ]\n\nlet private createAltitudeField dispatch altitude =\n Field.div [] [\n Label.label [] [ str \"Höhe über Meeresspiegel [m]\" ]\n Control.div [] [\n Input.number [\n Input.Placeholder \"400\"\n altitude |> Inputs.optionalDoubleToString |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> Inputs.toDoubleOption\n |> UpdateAltitude\n |> UserDefinedMapSensorProperties\n |> dispatch\n )\n ]\n ]\n ]\n\nlet private createDeviceLocationButton dispatch locationUpdateRunning =\n Field.div [\n Field.Props [\n Style [ BorderBottom \"1px solid black\"; Padding \"5px\" ]\n ]\n ] [\n Control.div [] [\n Button.button [\n Button.IsLoading locationUpdateRunning\n Button.Color Color.IsLink\n match navigator.geolocation with\n | Some geolocation ->\n Button.OnClick(fun event ->\n event.preventDefault ()\n dispatch (UserDefinedMapSensorProperties DeviceLocationRequested)\n\n DeviceLocation.request\n (locationSuccessCallback dispatch)\n (locationErrorCallback dispatch)\n geolocation\n )\n | None -> Button.Disabled true\n ] [ str \"Aktuellen Standort übernehmen\" ]\n ]\n ]\n\nlet private createBaseSettingFields dispatch locationUpdateRunning (settings: BaseSettings) : ReactElement list = [\n createNameField dispatch settings.Name\n Field.div [ Field.IsHorizontal ] [\n Field.body [] [\n createLatitudeField dispatch settings.Latitude\n createLongitudeField dispatch settings.Longitude\n ]\n ]\n\n createAltitudeField dispatch settings.Altitude\n\n createDeviceLocationButton dispatch locationUpdateRunning\n]\n\nlet private createLimitField (model: DataModel) (limit: double option) (label: string) onClick =\n Field.div [] [\n Label.label [] [ str label ]\n Control.div [] [\n Input.number [\n limit |> Inputs.optionalDoubleToString |> Input.Value\n Input.OnChange(fun event -> event.Value |> Inputs.toDoubleOption |> onClick)\n ]\n ]\n ]\n\nlet private soilFormView dispatch (model: DataModel) (soilSettings: SoilSensorSettings) =\n form [] [\n yield! createBaseSettingFields dispatch model.DeviceLocationUpdateRunning soilSettings.BaseSettings\n\n Field.div [ Field.IsHorizontal ] [\n Field.body [] [\n createLimitField\n model\n soilSettings.DryLimit\n \"Grenze Trocken (in Prozent)\"\n (UpdateDryLimit >> UserDefinedMapSensorProperties >> dispatch)\n createLimitField\n model\n soilSettings.WetLimit\n \"Grenze Nass (in Prozent)\"\n (UpdateWetLimit >> UserDefinedMapSensorProperties >> dispatch)\n ]\n ]\n\n Field.div [] [\n Control.div [] [ createSaveButton dispatch model ]\n ]\n ]\n\nlet private baseFormView dispatch (model: DataModel) (baseSettings: BaseSettings) =\n form [] [\n yield! createBaseSettingFields dispatch model.DeviceLocationUpdateRunning baseSettings\n\n Field.div [] [\n Control.div [] [ createSaveButton dispatch model ]\n ]\n ]\n\nlet formView dispatch (model: DataModel) =\n match model.SensorSettings with\n | SensorSettings.Base baseSettings -> baseFormView dispatch model baseSettings\n | SensorSettings.Soil soilSettings -> soilFormView dispatch model soilSettings\n\nlet dataView dispatch (data: DataModel) =\n let formContent = formView dispatch data\n\n Container.container [ Container.isFullWidth ] [\n Heading.h1 [] [ str \"Sensor-Einstellungen\" ]\n formContent\n ]\n\nlet view (model: Model) dispatch = Loadable.view (dataView dispatch) model","module Client.Page.User.MyMapSensors\n\nopen Client\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Domain\nopen Client.DomainTypes\nopen Client.Infrastructure\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React.Props\nopen Fulma\nopen Fable.React\nopen Shared.Dto\nopen Shared.Dto.Dto\nopen Shared.Dto.MyMapSensors\nopen Thoth.Elmish\n\n\ntype DataModel = {\n Sensors: MyMapSensorDto list\n Session: UserSession\n}\n\ntype Model = Loadable\n\nlet private changeStatus (state: MapSensorStateDto) (sensorId: int) (list: MyMapSensorDto list) =\n list\n |> List.map (fun sensor ->\n if sensor.Id = sensorId then\n { sensor with State = state }\n else\n sensor\n )\n\nlet init (session: UserSession) =\n let requestData = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n let cmd =\n Cmd.OfAsync.perform api.getMyMapSensors requestData (MySensorsLoaded >> MyMapSensors)\n\n Loadable.Loading session, cmd\n\nlet update (msg: MyMapSensorsMsg) (model: Model) =\n match (msg, model) with\n | MySensorsLoaded(Ok sensors), Loadable.Loading session ->\n Loadable.Data {\n Sensors = sensors\n Session = session\n },\n Cmd.none\n | MySensorsLoaded(AuthenticatedResponse.Error _), Loadable.Loading _ ->\n Loadable.Error \"Fehler beim Laden deiner Sensoren\", Cmd.none\n | ActivateSensor id, Loadable.Data dataModel ->\n let requestData = {\n SessionKey = dataModel.Session.SessionKey\n Data = id\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.activateMapSensor\n requestData\n (fun successful -> SensorActivated(id, successful) |> MyMapSensors)\n\n model, cmd\n | SensorActivated(sensorId, response), Loadable.Data dataModel ->\n match response with\n | Ok true ->\n let toastCmd = Toast.create \"Sensor wurde erfolgreich aktiviert\" |> Toast.success\n\n Loadable.Data { dataModel with Sensors = changeStatus MapSensorStateDto.Active sensorId dataModel.Sensors },\n toastCmd\n | Ok false ->\n let toastCmd =\n Toast.create \"Beim Aktivieren des Sensors ist ein Fehler aufgetreten\"\n |> Toast.error\n\n model, toastCmd\n | AuthenticatedResponse.Error _ ->\n let toastCmd =\n Toast.create \"Beim Aktivieren des Sensors ist ein Fehler aufgetreten\"\n |> Toast.error\n\n model, toastCmd\n | DisableSensor id, Loadable.Data dataModel ->\n let requestData = {\n SessionKey = dataModel.Session.SessionKey\n Data = id\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.disableMapSensor\n requestData\n (fun successful -> SensorDisabled(id, successful) |> MyMapSensors)\n\n model, cmd\n | SensorDisabled(sensorId, response), Loadable.Data dataModel ->\n match response with\n | Ok true ->\n let toastCmd = Toast.create \"Sensor wurde erfolgreich deaktiviert\" |> Toast.success\n\n Loadable.Data {\n dataModel with\n Sensors = changeStatus MapSensorStateDto.Disabled sensorId dataModel.Sensors\n },\n toastCmd\n | Ok false ->\n let toastCmd =\n Toast.create \"Beim Deaktivieren des Sensors ist ein Fehler aufgetreten\"\n |> Toast.error\n\n model, toastCmd\n | AuthenticatedResponse.Error _ ->\n let toastCmd =\n Toast.create \"Beim Deaktivieren des Sensors ist ein Fehler aufgetreten\"\n |> Toast.error\n\n model, toastCmd\n | _, _ -> model, Cmd.none\n\n\nlet private createActivationButton (dispatch: Msg -> unit) (sensor: MyMapSensorDto) =\n let maybeButtonData =\n match sensor.State with\n | Disabled ->\n Some(\n [\n Button.Color Color.IsLink\n Button.OnClick(fun _ -> ActivateSensor sensor.Id |> MyMapSensors |> dispatch)\n ],\n [ str \"Aktiveren\" ]\n )\n | Active ->\n Some(\n [\n Button.Color Color.IsLink\n Button.OnClick(fun _ -> DisableSensor sensor.Id |> MyMapSensors |> dispatch)\n ],\n [ str \"Deaktivieren\" ]\n )\n | Defective -> None\n\n Option.map\n (fun (options, children) ->\n let buttonDisabled = sensor.ModificationAllowed |> not |> Button.Disabled\n\n Button.button (buttonDisabled :: options) children\n )\n maybeButtonData\n\nlet private createSettingsButton dispatch (sensor: MyMapSensorDto) =\n let route = sensor.Id |> Route.UserDefinedMapSensorProperties\n\n let onClick = route |> Clickable.onClickGoToRoute dispatch |> Button.OnClick\n\n let url = Routing.routeToUrl route\n\n Button.a [\n Button.Color Color.IsGreyDark\n sensor.ModificationAllowed |> not |> Button.Disabled\n onClick\n Button.Props [ Href url ]\n ] [ str \"Einstellungen\" ]\n\nlet private createSensorStatusItem (sensor: MyMapSensorDto) =\n let status, statusDot =\n match sensor.State with\n | Active -> \"Aktiv\", StatusDot.Green\n | Disabled -> \"Inaktiv\", StatusDot.Red\n | Defective -> \"Defekt\", StatusDot.Green\n\n let imgSrc = StatusDot.toImageUrl statusDot\n\n Level.left [] [\n Level.item [ Level.Item.CustomClass \"sensor-status\" ] [\n p [] [ str (\"Status: \" + status) ]\n img [ Src imgSrc ]\n ]\n ]\n\nlet private sensorToBox dispatch (sensor: MyMapSensorDto) =\n Box.box' [] [\n Heading.h1 [] [ str sensor.MapSensorName ]\n Heading.h3 [ Heading.IsSubtitle ] [ str sensor.PhysicalSensorName ]\n\n Level.level [] [\n Level.left [] [ createSensorStatusItem sensor ]\n Level.right [] [\n match createActivationButton dispatch sensor with\n | Some button -> Level.item [] [ button ]\n | None -> ()\n\n Level.item [] [ createSettingsButton dispatch sensor ]\n ]\n ]\n ]\n\nlet dataView dispatch (model: DataModel) =\n Container.container [ Container.isFullWidth ] (List.map (sensorToBox dispatch) model.Sensors)\n\nlet view dispatch (model: Model) = Loadable.view (dataView dispatch) model","module Client.Forms.RimPro\n\nopen Client.DomainTypes.Msg\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Shared\nopen Shared.Dto\nopen Shared.DtoTypes.RimPro\nopen Shared.Infrastructure\nopen Fable.Core.JsInterop\n\ntype Model = {\n Name: string option\n AirSensor: IdValue option\n RainSensor: IdValue option\n FirstWetnessSensor: IdValue option\n SecondWetnessSensor: IdValue option\n AvailableAirSensors: IdValue list\n AvailableRainSensors: IdValue list\n AvailableLeafletWetnessSensors: IdValue list\n RequestRunning: bool\n}\n\nlet tryCreateDto (model: Model) : NewRimProStationDto option =\n let factory =\n fun\n (name: string)\n (airSensor: IdValue)\n (rainSensor: IdValue)\n (firstWetnessSensor: IdValue) -> {\n NewRimProStationDto.Name = name\n AirSensorId = airSensor.Id\n RainSensorId = rainSensor.Id\n FirstWetnessSensorId = firstWetnessSensor.Id\n SecondWetnessSensorId = model.SecondWetnessSensor |> Option.map (fun sensor -> sensor.Id)\n }\n\n factory\n |> Some\n |> Option.apply model.Name\n |> Option.apply model.AirSensor\n |> Option.apply model.RainSensor\n |> Option.apply model.FirstWetnessSensor\n\ntype FormResult =\n | Noop\n | Create of NewRimProStationDto\n | CloseModal\n\nlet init airSensors rainSensors (leafletWetnessSensors: IdValue list) = {\n Name = None\n AirSensor = List.tryHead airSensors\n RainSensor = List.tryHead rainSensors\n FirstWetnessSensor = List.tryHead leafletWetnessSensors |> Option.orElse (List.tryHead airSensors)\n SecondWetnessSensor = None\n AvailableAirSensors = airSensors\n AvailableRainSensors = rainSensors\n AvailableLeafletWetnessSensors = leafletWetnessSensors\n RequestRunning = false\n}\n\nlet update (msg: RimProFormMsg) (model: Model) =\n match msg with\n | RimProFormMsg.NameUpdated name -> { model with Name = name }, Noop\n | AirSensorUpdated sensor -> { model with AirSensor = sensor }, Noop\n | RainSensorUpdated sensor -> { model with RainSensor = sensor }, Noop\n | FirstWetnessSensorUpdated sensor -> { model with FirstWetnessSensor = sensor }, Noop\n | SecondWetnessSensorUpdated sensor -> { model with SecondWetnessSensor = sensor }, Noop\n | RimProFormMsg.CloseModal -> model, FormResult.CloseModal\n | RimProFormMsg.Create newStation -> { model with RequestRunning = true }, FormResult.Create newStation\n | RimProFormMsg.CreationFinished -> { model with RequestRunning = false }, FormResult.Noop\n\nlet private sensorSelect\n onChange\n (selectedSensor: IdValue option)\n (availableSensors: IdValue list)\n (withNoneOption: bool)\n =\n let sensorToOption (sensor: IdValue) =\n option [ Value sensor.Id ] [ str (MapSensor.getBaseData sensor.Value).Name ]\n\n let findSensor (id: string) =\n availableSensors |> List.tryFind (fun sensor -> sensor.Id = int id)\n\n let mutable options = (List.map sensorToOption availableSensors)\n\n if withNoneOption then\n options <- (option [ Value \"\" ] [ str \"Ohne\" ]) :: options\n else\n ()\n\n Select.select [ Select.IsFullWidth ] [\n select\n [\n DefaultValue(\n selectedSensor\n |> Option.map (fun selected -> selected.Id.ToString())\n |> Option.defaultValue \"\"\n )\n OnChange(fun event -> event.target?value |> String.toOption |> Option.bind findSensor |> onChange)\n ]\n options\n ]\n\nlet private formView dispatch (model: Model) =\n let wetnessSensors =\n List.append model.AvailableLeafletWetnessSensors model.AvailableAirSensors\n\n form [] [\n Field.div [] [\n Label.label [] [ str \"Name\" ]\n Control.div [] [\n Input.text [\n model.Name |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event -> event.Value |> String.toOption |> RimProFormMsg.NameUpdated |> dispatch)\n ]\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Temperatur Sensor\" ]\n Control.div [] [\n sensorSelect\n (RimProFormMsg.AirSensorUpdated >> dispatch)\n model.AirSensor\n model.AvailableAirSensors\n false\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Regen Sensor\" ]\n Control.div [] [\n sensorSelect\n (RimProFormMsg.RainSensorUpdated >> dispatch)\n model.RainSensor\n model.AvailableRainSensors\n false\n ]\n ]\n Field.div [] [\n Label.label [] [ str \"Blattnässe Sensor 1\" ]\n Control.div [] [\n sensorSelect\n (RimProFormMsg.FirstWetnessSensorUpdated >> dispatch)\n model.FirstWetnessSensor\n wetnessSensors\n false\n ]\n ]\n\n Field.div [] [\n Label.label [] [ str \"Blattnässe Sensor 2 (optional)\" ]\n Control.div [] [\n sensorSelect\n (RimProFormMsg.SecondWetnessSensorUpdated >> dispatch)\n model.SecondWetnessSensor\n wetnessSensors\n true\n ]\n ]\n ]\n\nlet private saveButton dispatch (model: Model) =\n let maybeNewStation = tryCreateDto model\n\n let buttonOptions = [\n Button.IsLoading model.RequestRunning\n Button.Color IsSuccess\n\n match maybeNewStation with\n | Some newStation -> Button.OnClick(fun _ -> dispatch (RimProFormMsg.Create newStation))\n | None -> Button.Disabled true\n ]\n\n Button.button buttonOptions [ str \"Erstellen\" ]\n\nlet view (dispatch: RimProFormMsg -> unit) (model: Model) =\n let closeModal = (fun _ -> dispatch RimProFormMsg.CloseModal)\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str \"Neues RimPro Station erstellen\" ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ formView dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]","namespace Shared\n\n[]\nmodule Tuple =\n let mapFirst f (tuple: 'a * 'b) = fst tuple |> f, snd tuple\n\n let mapSecond f (tuple: 'a * 'b) = fst tuple, snd tuple |> f\n\n let map f g (tuple: 'a * 'b) = fst tuple |> f, snd tuple |> g","import { toList, toArray, map, filter, delay } from \"./Seq.js\";\nimport { HashSet } from \"./MutableSet.js\";\nimport { addToDict, getItemFromDict, tryGetValue, addToSet } from \"./MapUtil.js\";\nimport { Dictionary } from \"./MutableMap.js\";\nimport { disposeSafe, getEnumerator } from \"./Util.js\";\nimport { FSharpRef } from \"./Types.js\";\n\nexport function distinct(xs, comparer) {\n return delay(() => {\n const hashSet = new HashSet([], comparer);\n return filter((x) => addToSet(x, hashSet), xs);\n });\n}\n\nexport function distinctBy(projection, xs, comparer) {\n return delay(() => {\n const hashSet = new HashSet([], comparer);\n return filter((x) => addToSet(projection(x), hashSet), xs);\n });\n}\n\nexport function except(itemsToExclude, xs, comparer) {\n return delay(() => {\n const hashSet = new HashSet(itemsToExclude, comparer);\n return filter((x) => addToSet(x, hashSet), xs);\n });\n}\n\nexport function countBy(projection, xs, comparer) {\n return delay(() => {\n const dict = new Dictionary([], comparer);\n const keys = [];\n const enumerator = getEnumerator(xs);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const key = projection(enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]());\n let matchValue;\n let outArg = 0;\n matchValue = [tryGetValue(dict, key, new FSharpRef(() => outArg, (v) => {\n outArg = (v | 0);\n })), outArg];\n if (matchValue[0]) {\n dict.set(key, matchValue[1] + 1);\n }\n else {\n dict.set(key, 1);\n void (keys.push(key));\n }\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n return map((key_1) => [key_1, getItemFromDict(dict, key_1)], keys);\n });\n}\n\nexport function groupBy(projection, xs, comparer) {\n return delay(() => {\n const dict = new Dictionary([], comparer);\n const keys = [];\n const enumerator = getEnumerator(xs);\n try {\n while (enumerator[\"System.Collections.IEnumerator.MoveNext\"]()) {\n const x = enumerator[\"System.Collections.Generic.IEnumerator`1.get_Current\"]();\n const key = projection(x);\n let matchValue;\n let outArg = null;\n matchValue = [tryGetValue(dict, key, new FSharpRef(() => outArg, (v) => {\n outArg = v;\n })), outArg];\n if (matchValue[0]) {\n void (matchValue[1].push(x));\n }\n else {\n addToDict(dict, key, [x]);\n void (keys.push(key));\n }\n }\n }\n finally {\n disposeSafe(enumerator);\n }\n return map((key_1) => [key_1, getItemFromDict(dict, key_1)], keys);\n });\n}\n\nexport function Array_distinct(xs, comparer) {\n return toArray(distinct(xs, comparer));\n}\n\nexport function Array_distinctBy(projection, xs, comparer) {\n return toArray(distinctBy(projection, xs, comparer));\n}\n\nexport function Array_except(itemsToExclude, xs, comparer) {\n return toArray(except(itemsToExclude, xs, comparer));\n}\n\nexport function Array_countBy(projection, xs, comparer) {\n return toArray(countBy(projection, xs, comparer));\n}\n\nexport function Array_groupBy(projection, xs, comparer) {\n return toArray(map((tupledArg) => [tupledArg[0], toArray(tupledArg[1])], groupBy(projection, xs, comparer)));\n}\n\nexport function List_distinct(xs, comparer) {\n return toList(distinct(xs, comparer));\n}\n\nexport function List_distinctBy(projection, xs, comparer) {\n return toList(distinctBy(projection, xs, comparer));\n}\n\nexport function List_except(itemsToExclude, xs, comparer) {\n return toList(except(itemsToExclude, xs, comparer));\n}\n\nexport function List_countBy(projection, xs, comparer) {\n return toList(countBy(projection, xs, comparer));\n}\n\nexport function List_groupBy(projection, xs, comparer) {\n return toList(map((tupledArg) => [tupledArg[0], toList(tupledArg[1])], groupBy(projection, xs, comparer)));\n}\n\n","module Client.Page.User.RimPro\n\nopen Client\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Domain\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.FontAwesome\nopen Fulma\nopen Fable.React\nopen Shared\nopen Shared.Dto\nopen Shared.Dto.Dto\nopen Shared.DtoTypes.RimPro\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\n\ntype DataModel = {\n Session: UserSession\n AvailableAirSensors: IdValue list\n AvailableRainSensors: IdValue list\n AvailableLeafletWetnessSensors: IdValue list\n Stations: RimProStationDto list\n DeleteModal: RimProStationDto option\n CreationModal: Forms.RimPro.Model option\n}\n\ntype LoadingModel = {\n Session: UserSession\n AvailableAirSensors: IdValue list option\n AvailableRainSensors: IdValue list option\n AvailableLeafletWetnessSensors: IdValue list option\n Stations: RimProStationDto list option\n}\n\ntype Model = Loadable\n\nlet init (session: UserSession) =\n let requestData = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n let cmds = [\n Cmd.OfAsync.perform api.getMyAirTemperatureMapSensors requestData (RimProMsg.AirSensorsReceived >> Msg.RimPro)\n Cmd.OfAsync.perform api.getMyRainFallMapSensors requestData (RimProMsg.RainSensorsReceived >> Msg.RimPro)\n Cmd.OfAsync.perform\n api.getMyLeafletWetnessMapSensors\n requestData\n (RimProMsg.LeafletWetnessSensorsReceived >> Msg.RimPro)\n Cmd.OfAsync.perform api.getMyRimProStations requestData (RimProMsg.StationsReceived >> Msg.RimPro)\n ]\n\n Loadable.Loading {\n LoadingModel.Session = session\n AvailableAirSensors = None\n AvailableRainSensors = None\n AvailableLeafletWetnessSensors = None\n Stations = None\n },\n Cmd.batch cmds\n\nlet private tryCreateDataModel (loadingModel: LoadingModel) : Loadable option =\n let factory =\n fun air rain leafletWetness stations ->\n Loadable.Data {\n DataModel.Session = loadingModel.Session\n AvailableAirSensors = air\n AvailableRainSensors = rain\n AvailableLeafletWetnessSensors = leafletWetness\n Stations = stations\n DeleteModal = None\n CreationModal = None\n }\n\n factory\n |> Some\n |> Option.apply loadingModel.AvailableAirSensors\n |> Option.apply loadingModel.AvailableRainSensors\n |> Option.apply loadingModel.AvailableLeafletWetnessSensors\n |> Option.apply loadingModel.Stations\n\nlet private updateForm (msg: RimProFormMsg) (dataModel: DataModel) =\n match dataModel.CreationModal with\n | Some model ->\n let (newModel, result) = Forms.RimPro.update msg model\n\n match result with\n | Forms.RimPro.Noop -> { dataModel with CreationModal = Some newModel }, Cmd.none\n | Forms.RimPro.FormResult.CloseModal -> { dataModel with CreationModal = None }, Cmd.none\n | Forms.RimPro.FormResult.Create newStation ->\n let requestData = {\n SessionKey = dataModel.Session.SessionKey\n Data = newStation\n }\n\n { dataModel with CreationModal = Some newModel },\n Cmd.OfAsync.perform api.createRimProStation requestData RimProMsg.StationCreated\n | None -> dataModel, Cmd.none\n\nlet private updateDataModel (msg: RimProMsg) (dataModel: DataModel) =\n match msg with\n | RimProMsg.OpenDeleteModal station -> Loadable.Data { dataModel with DeleteModal = Some station }, Cmd.none\n | RimProMsg.CloseDeleteModal -> Loadable.Data { dataModel with DeleteModal = None }, Cmd.none\n | RimProMsg.DeleteStation station ->\n let requestData = {\n SessionKey = dataModel.Session.SessionKey\n Data = station.Id\n }\n\n Loadable.Data { dataModel with DeleteModal = None },\n Cmd.OfAsync.perform api.deleteRimProStation requestData (RimProMsg.StationDeleted >> RimPro)\n | OpenCreationModal ->\n Loadable.Data {\n dataModel with\n CreationModal =\n Forms.RimPro.init\n dataModel.AvailableAirSensors\n dataModel.AvailableRainSensors\n dataModel.AvailableLeafletWetnessSensors\n |> Some\n },\n Cmd.none\n | RimProMsg.FormMsg formMsg -> updateForm formMsg dataModel |> Tuple.map Loadable.Data (Cmd.map RimPro)\n | RimProMsg.StationCreated result ->\n match result with\n | Ok true ->\n let toastCmd =\n Toast.create \"RimPro Station wurde erfolgreich erstellt\" |> Toast.success\n\n init dataModel.Session\n |> Tuple.mapSecond (fun cmd -> Cmd.batch [ toastCmd; cmd ])\n | Ok false\n | AuthenticatedResponse.Error _ ->\n let toastCmd =\n Toast.create \"Ein Fehler beim Erstellen ist aufgetreten\" |> Toast.error\n\n updateForm (RimProFormMsg.CreationFinished) dataModel\n |> Tuple.map Loadable.Data (Cmd.map RimPro >> fun fc -> Cmd.batch [ fc; toastCmd ])\n | _ -> Loadable.Data dataModel, Cmd.none\n\nlet private updateLoadingModel (msg: RimProMsg) (model: LoadingModel) =\n match msg with\n | AirSensorsReceived response ->\n match response with\n | Ok airSensors ->\n let newLoadingModel = { model with AvailableAirSensors = Some airSensors }\n\n let newModel =\n newLoadingModel\n |> tryCreateDataModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n newModel, Cmd.none\n | Result.Error _ -> Loadable.Error \"Fehler beim Laden der Daten, bitte lade die Seite neu\", Cmd.none\n | RainSensorsReceived response ->\n match response with\n | Ok rainSensors ->\n let newLoadingModel = { model with AvailableRainSensors = Some rainSensors }\n\n let newModel =\n newLoadingModel\n |> tryCreateDataModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n newModel, Cmd.none\n | Result.Error _ -> Loadable.Error \"Fehler beim Laden der Daten, bitte lade die Seite neu\", Cmd.none\n | LeafletWetnessSensorsReceived response ->\n match response with\n | Ok wetnessSensors ->\n let newLoadingModel = { model with AvailableLeafletWetnessSensors = Some wetnessSensors }\n\n let newModel =\n newLoadingModel\n |> tryCreateDataModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n newModel, Cmd.none\n | Result.Error _ -> Loadable.Error \"Fehler beim Laden der Daten, bitte lade die Seite neu\", Cmd.none\n | RimProMsg.StationsReceived response ->\n match response with\n | Ok stations ->\n let newLoadingModel = { model with Stations = Some stations }\n\n let newModel =\n newLoadingModel\n |> tryCreateDataModel\n |> Option.defaultValue (Loadable.Loading newLoadingModel)\n\n newModel, Cmd.none\n | Result.Error _ -> Loadable.Error \"Fehler beim Laden der Daten, bitte lade die Seite neu\", Cmd.none\n | _ -> Loadable.Loading model, Cmd.none\n\nlet update (msg: RimProMsg) (model: Model) =\n match (msg, model) with\n | RimProMsg.StationDeleted response, Loadable.Data dataModel ->\n match response with\n | Ok result ->\n if result then\n init dataModel.Session\n else\n let toastCmd = Toast.create \"Fehler beim Löschen der Station\" |> Toast.error\n\n Loadable.Data dataModel, toastCmd\n | AuthenticatedResponse.Error _ ->\n let toastCmd = Toast.create \"Fehler beim Löschen der Station\" |> Toast.error\n\n Loadable.Data dataModel, toastCmd\n | _, Loadable.Data dataModel ->\n let newDataModel, cmd = updateDataModel msg dataModel\n\n newDataModel, cmd\n | _, Loadable.Loading loadingModel ->\n let newModel, cmd = updateLoadingModel msg loadingModel\n\n newModel, cmd\n | _, _ -> model, Cmd.none\n\nlet private addRowButton dispatch =\n let button =\n Button.button [\n Button.Color IsLink\n SubmitButton.onClick (fun _ -> dispatch OpenCreationModal)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Plus ] [] ]\n span [] [ str \"Hinzufügen\" ]\n ]\n\n Level.level [] [ Level.left [] []; Level.right [] [ button ] ]\n\nlet private deleteButton dispatch (station: RimProStationDto) : ReactElement =\n Button.button [\n Button.Color Color.IsDanger\n SubmitButton.onClick (fun _ -> RimProMsg.OpenDeleteModal station |> dispatch)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Trash ] [] ]\n span [] [ str \"Löschen\" ]\n ]\n\nlet private deleteStationModalConfig dispatch (station: RimProStationDto) : ConfirmationModal.Configuration = {\n Headline = \"RIMPro Station löschen\"\n Text = sprintf \"Soll die RIMProStation '%s' gelöscht werden?\" station.Name\n OnClose = (fun _ -> dispatch RimProMsg.CloseDeleteModal)\n OnNo = (fun _ -> dispatch RimProMsg.CloseDeleteModal)\n OnYes = (fun _ -> dispatch (RimProMsg.DeleteStation station))\n}\n\nlet private stationToRow dispatch (model: DataModel) (station: RimProStationDto) : ReactElement =\n let airSensorName =\n List.find (fun (sensor: IdValue) -> sensor.Id = station.AirSensorId) model.AvailableAirSensors\n |> fun sensor -> (MapSensor.getBaseData sensor.Value).Name\n\n let rainSensorName =\n List.find (fun (sensor: IdValue) -> sensor.Id = station.RainSensorId) model.AvailableRainSensors\n |> fun sensor -> (MapSensor.getBaseData sensor.Value).Name\n\n let wetnessSensors =\n List.append model.AvailableAirSensors model.AvailableLeafletWetnessSensors\n\n let firstWetnessSensorName =\n wetnessSensors\n |> List.find (fun (sensor: IdValue) -> sensor.Id = station.FirstLeafletWetnessSensorId)\n |> fun sensor -> (MapSensor.getBaseData sensor.Value).Name\n\n let secondWetnessSensorName =\n station.SecondLeafletWetnessSensorId\n |> Option.map (fun id -> List.find (fun (sensor: IdValue) -> sensor.Id = id) wetnessSensors)\n |> Option.map (fun sensor -> (MapSensor.getBaseData sensor.Value).Name)\n\n let names =\n [\n Some airSensorName\n Some rainSensorName\n Some firstWetnessSensorName\n secondWetnessSensorName\n ]\n |> List.choose id\n |> List.distinct\n |> List.sort\n |> String.join \", \"\n\n Columns.columns [ Columns.IsVCentered ] [\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [\n span [] [ str \"Station ID: \" ]\n Text.span [\n Modifiers [ Modifier.TextWeight TextWeight.Bold ]\n ] [ str (station.Id.ToString()) ]\n ]\n Column.column [] [ str station.Name ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ str names ]\n\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ deleteButton dispatch station ]\n ]\n\nlet rowsView dispatch (model: DataModel) =\n match model.Stations with\n | [] -> [\n Heading.p [ Heading.IsSubtitle ] [ str \"Es wurden noch keine Stationen erstellt\" ]\n ]\n | stations -> List.map (stationToRow dispatch model) stations\n\nlet content dispatch (model: DataModel) =\n let heading = Heading.p [ Heading.IsSpaced ] [ str \"RIMPro Schorf\" ]\n\n let rows = rowsView dispatch model\n\n Box.box' [] [\n heading\n\n yield! rows\n\n addRowButton dispatch\n ]\n\nlet dataView dispatch (model: DataModel) =\n let deleteModal =\n Option.map\n (fun station -> ConfirmationModal.view false (deleteStationModalConfig dispatch station))\n model.DeleteModal\n\n let creationModal =\n Option.map (fun modalModel -> Forms.RimPro.view (FormMsg >> dispatch) modalModel) model.CreationModal\n\n [\n Container.container [ Container.isFullWidth ] [ content dispatch model ]\n\n match deleteModal with\n | Some modal -> modal\n | None -> ()\n\n match creationModal with\n | Some modal -> modal\n | None -> ()\n ]\n\n\nlet view dispatch (model: Model) =\n Loadable.listView (dataView (RimPro >> dispatch)) model","module Client.Page.User.MyGateways\n\nopen Client\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Domain\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React.Props\nopen Fulma\nopen Fable.React\nopen Shared.Dto.Dto\nopen Shared.Dto.Gateways\nopen Shared.Infrastructure\nopen Thoth.Elmish\n\n\ntype DataModel = {\n Gateways: MyGatewaysResponse\n Session: UserSession\n}\n\ntype Model = Loadable\n\nlet init (session: UserSession) =\n let requestData = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n let cmd =\n Cmd.OfAsync.perform api.getMyGateways requestData (MyGatewaysLoaded >> MyGateways)\n\n Loadable.Loading session, cmd\n\nlet update (msg: MyGatewaysMsg) (model: Model) =\n match (msg, model) with\n | MyGatewaysLoaded(Ok gateways), Loadable.Loading session ->\n Loadable.Data {\n Gateways = gateways\n Session = session\n },\n Cmd.none\n | MyGatewaysLoaded(AuthenticatedResponse.Error _), Loadable.Loading session ->\n let toastCmd =\n Toast.create \"Beim Laden der Gateways ist ein Fehler aufgetreten\" |> Toast.error\n\n model, toastCmd\n | _, _ -> model, Cmd.none\n\nlet private createGatewayStatusItem (text: string) (dot: StatusDot) =\n let imgSrc = StatusDot.toImageUrl dot\n\n Level.item [ Level.Item.CustomClass \"sensor-status\" ] [\n p [] [ str (\"Status: \" + text) ]\n img [ Src imgSrc ]\n ]\n\nlet private createGatewayConnectedStatusItem (isConnected: bool) =\n let status, statusDot =\n if isConnected then\n \"Verbunden\", StatusDot.Green\n else\n \"Keine Verbindung\", StatusDot.Red\n\n createGatewayStatusItem status statusDot\n\nlet private gatewayStatusRow (gateway: MyGatewayResponseEntry) =\n Level.level [] [\n match gateway.Status with\n | Some(Connected connected) ->\n Level.left [] [ createGatewayConnectedStatusItem true ]\n\n Level.right [] [\n Level.item [] [\n sprintf \"Verbunden seit: %s\" (DateTime.toString connected.ConnectedAt.LocalDateTime)\n |> str\n ]\n ]\n | Some(Disconnected disconnected) ->\n Level.left [] [ createGatewayConnectedStatusItem false ]\n\n Level.right [] [\n Level.item [] [\n match disconnected.DisconnectedAt with\n | Some disconnectedAt ->\n sprintf \"Keine Verbindung seit: %s\" (DateTime.toString disconnectedAt.LocalDateTime)\n | None -> \"Schon seit längerem (noch nie?) gibt es keine Verbindung zum Gateway\"\n |> str\n ]\n ]\n | None ->\n Level.left [] [\n createGatewayStatusItem \"Unbekannt\" StatusDot.Grey\n ]\n\n Level.right [] [\n Level.item [] [ str \"Fehler beim Laden des Gateway Status\" ]\n ]\n ]\n\nlet private gatewayToBox (gateway: MyGatewayResponseEntry) =\n Box.box' [] [\n Heading.h1 [] [ str gateway.Name ]\n\n gatewayStatusRow gateway\n ]\n\nlet dataView (model: DataModel) =\n Container.container [ Container.isFullWidth ] (List.map gatewayToBox model.Gateways)\n\nlet view (model: Model) = Loadable.view dataView model","module Client.Components.Graph.Scab\n\nopen System\nopen Client.Components.Graph.Recharts\nopen Client.Components.GraphCommon\nopen Fable.React\nopen Feliz\nopen Feliz.Recharts\nopen Feliz.Recharts.yAxis\nopen Shared.Dto.Page\nopen Fable.Core.JsInterop\nopen Fable.React.Props\nopen Shared.Dto.Scab\n\n\ntype GraphNode = {\n Ticks: double\n DegreeHours: float option\n InfectionPercentage: float\n Temperature: float\n LeafletWetness: int\n RainFallAmount: float\n RainSum: float\n}\n\ntype ScabGraphData = {\n TemperatureAxisTicks: float list\n RainAxisTicks: float list\n RainSumAxisTicks: float list\n InfectionMaxPercentage: float\n Data: GraphNode list\n CurrentTimestamp: DateTimeOffset\n}\n\ntype ScabGraph =\n | NoData\n | Data of ScabGraphData\n\nlet createGraphNode (previous: GraphNode) (current: ScabData.GraphNodeDto) : GraphNode =\n let rainSum =\n if previous.InfectionPercentage > current.InfectionPercentage then\n 0.\n else\n previous.RainSum + current.RainFallAmount\n\n {\n Ticks = current.Ticks\n DegreeHours = current.DegreeHours\n InfectionPercentage = current.InfectionPercentage\n Temperature = current.Temperature\n LeafletWetness = current.LeafletWetness\n RainFallAmount = current.RainFallAmount\n RainSum = rainSum\n }\n\nlet createFirstGraphNode (current: ScabData.GraphNodeDto) : GraphNode = {\n Ticks = current.Ticks\n DegreeHours = current.DegreeHours\n InfectionPercentage = current.InfectionPercentage\n Temperature = current.Temperature\n LeafletWetness = current.LeafletWetness\n RainFallAmount = current.RainFallAmount\n RainSum = -current.RainFallAmount\n}\n\n\nlet createScabGraphData (dtos: ScabData.GraphNodeDto list) : ScabGraphData =\n let nodes =\n dtos |> List.scan createGraphNode (createFirstGraphNode dtos[0]) |> List.skip 1\n\n let temperatureAxisTicks =\n AxisTicks.generateFixedStartBy 0. 5. (fun (node: ScabData.GraphNodeDto) -> node.Temperature) dtos\n\n let rainFallAxisTicks =\n AxisTicks.generateBy true 1. (fun (node: ScabData.GraphNodeDto) -> node.RainFallAmount) dtos\n\n let rainFallSumAxisTicks =\n AxisTicks.generateBy true 1. (fun (node: GraphNode) -> node.RainSum) nodes\n\n let infectionMaxPercentage =\n dtos |> List.map (fun node -> node.InfectionPercentage) |> List.max\n\n {\n TemperatureAxisTicks = temperatureAxisTicks\n RainAxisTicks = rainFallAxisTicks\n RainSumAxisTicks = rainFallSumAxisTicks\n Data = nodes\n CurrentTimestamp = DateTimeOffset.Now\n InfectionMaxPercentage = infectionMaxPercentage\n }\n\nlet private createToolTipRow (color: obj) (text: string) =\n p [ Class \"tooltip-row\"; Style [ Color color ] ] [ str text ]\n\nlet private createDegreeHoursTooltipRow (degreeHours: float) : ReactElement =\n createToolTipRow \"#7030A0\" (sprintf \"%s: %.2f\" \"Gradstunden [°h]\" degreeHours)\n\nlet private infectionTooltipContent properties =\n let label = properties?label\n let values: obj[] = properties?payload\n\n let header =\n DateTimeOffset.FromUnixTimeSeconds(int64 label)\n |> fun dto -> dto.ToLocalTime().ToString(\"dd.MM HH:mm\")\n\n if Array.isEmpty values then\n div [] []\n else\n let originalData: GraphNode = values[0]?payload\n\n let lines =\n Array.map\n (fun item ->\n let text =\n if item?name = \"Mills\" then\n sprintf \"%s: %s\" item?name (scabInfectionPercentageToString item?value)\n else\n sprintf \"%s: %.2f\" item?name item?value\n\n createToolTipRow item?stroke text\n )\n values\n\n let lines = [\n match originalData.DegreeHours with\n | Some hours -> createDegreeHoursTooltipRow hours\n | None -> ()\n\n yield! lines\n ]\n\n div [ Class \"custom-tooltip\" ] [ h1 [] [ str header ]; yield! (List.rev lines) ]\n\nlet private createInfectionReferenceLine (value: int) (label: string) =\n let labelProps = [\n Interop.mkLabelAttr \"value\" label\n Interop.mkLabelAttr \"position\" \"insideTopRight\"\n ]\n\n let label =\n Interop.reactApi.createElement (import \"Label\" \"recharts\", createObj !!labelProps)\n\n [\n referenceLine.y value\n referenceLine.label label\n referenceLine.isFront true\n referenceLine.strokeWidth 1\n referenceLine.yAxisId \"infection-axis\"\n ]\n\nlet private createInfectionYDomain (graphData: ScabGraphData) : IYAxisProperty =\n let domainMax = Math.Max(graphData.InfectionMaxPercentage + 20., 220)\n\n printf \"%f\" domainMax\n\n yAxis.domain (domain.constant 0, domain.constant (int domainMax))\n\nlet private infectionGraph (graphData: ScabGraphData) : ReactElement =\n let xDomain = xAxis.domain (domain.min, domain.max)\n\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n let xAxisDataKey = (fun (p: GraphNode) -> p.Ticks) |> xAxis.dataKey\n\n let temperatureTicks = AxisTicks.createYProperty graphData.TemperatureAxisTicks\n\n let temperatureAxisDataKey = (fun (p: GraphNode) -> p.Temperature) |> yAxis.dataKey\n\n let forecastLine = [\n yield! forecastLineProps graphData.CurrentTimestamp\n referenceLine.yAxisId \"temperature-axis\"\n ]\n\n Recharts.areaChart [\n areaChart.syncId \"syncId1\"\n areaChart.data graphData.Data\n areaChart.children [\n Recharts.xAxis [\n xAxisDataKey\n xAxis.number\n xAxis.scale.time\n xAxis.tickFormatter formatTimeTick\n xDomain\n xAxisTickInterval\n ]\n\n Recharts.yAxis [\n yAxis.yAxisId \"temperature-axis\"\n temperatureTicks\n yAxis.unit \" °C\"\n temperatureAxisDataKey\n orientation.left\n yAxis.allowDataOverflow true\n ]\n\n Recharts.legend []\n Recharts.tooltip [ tooltip.content infectionTooltipContent ]\n Recharts.area [\n Interop.mkAreaAttr \"yAxisId\" \"temperature-axis\"\n area.dot false\n area.dataKey (fun (p: GraphNode) -> p.Temperature)\n area.name \"Temperatur [°C]\"\n area.fill \"#FFC000\"\n area.fillOpacity 0.2\n area.stroke \"#FFC000\"\n ]\n\n Recharts.yAxis [\n yAxis.hide true\n yAxis.number\n yAxis.yAxisId \"infection-axis\"\n createInfectionYDomain graphData\n orientation.left\n ]\n\n Recharts.area [\n Interop.mkAreaAttr \"yAxisId\" \"infection-axis\"\n area.dot false\n area.dataKey (fun (p: GraphNode) -> p.InfectionPercentage)\n area.name \"Mills\"\n area.fill \"#FF8800\"\n area.fillOpacity 0.2\n area.stroke \"#FF8800\"\n ]\n\n Recharts.referenceLine (createInfectionReferenceLine 100 \"Leicht\")\n Recharts.referenceLine (createInfectionReferenceLine 134 \"Mittel\")\n Recharts.referenceLine (createInfectionReferenceLine 202 \"Schwer\")\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> graphWrapper \"full-height-graph-box\"\n\nlet private leafletWetnessGraph (graphData: ScabGraphData) : ReactElement =\n let xDomain = xAxis.domain (domain.min, domain.max)\n\n let forecastLine = forecastLineProps graphData.CurrentTimestamp\n let wetnessTicks = AxisTicks.createYProperty [ 0; 1 ]\n let dataKey = (fun (p: GraphNode) -> p.Ticks) |> xAxis.dataKey\n\n Recharts.areaChart [\n areaChart.syncId \"syncId1\"\n areaChart.data graphData.Data\n areaChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxisTimeTickFormatter\n xDomain\n ]\n Recharts.yAxis [\n yAxis.dataKey (fun (p: GraphNode) -> p.LeafletWetness)\n yAxis.number\n wetnessTicks\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.area [\n area.fillOpacity 0.2\n area.dataKey (fun (p: GraphNode) -> p.LeafletWetness)\n area.name \"Blattnässe\"\n ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> graphWrapper \"half-height-graph-box\"\n\nlet private rainfallGraph (graphData: ScabGraphData) : ReactElement =\n let xDomain = xAxis.domain (domain.min, domain.max)\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let amountAxisTicks = AxisTicks.createYProperty graphData.RainAxisTicks\n let yDomain = yAxis.domain (domain.min, domain.max)\n let yAxisWidth = 70\n\n let forecastLine = forecastLineProps graphData.CurrentTimestamp\n let dataKey = (fun (p: GraphNode) -> p.Ticks) |> xAxis.dataKey\n\n Recharts.barChart [\n barChart.data graphData.Data\n barChart.syncId \"syncId1\"\n barChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxisTimeTickFormatter\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n amountAxisTicks\n yAxis.dataKey (fun (p: GraphNode) -> p.RainFallAmount)\n yAxis.unit \"mm\"\n yAxis.number\n yDomain\n yAxis.width yAxisWidth\n ]\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.legend []\n\n Recharts.bar [\n bar.dataKey (fun (p: GraphNode) -> p.RainFallAmount)\n bar.name \"Regenmenge [mm/15 Minuten]\"\n bar.fill \"#0033FF\"\n bar.stroke \"#0033FF\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n\n //Recharts.referenceLine forecastLine\n ]\n ]\n |> graphWrapper \"full-height-graph-box\"\n\nlet private rainSumGraph (graphData: ScabGraphData) : ReactElement =\n let xDomain = xAxis.domain (domain.min, domain.max)\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let axisTicks = AxisTicks.createYProperty graphData.RainSumAxisTicks\n let yDomain = yAxis.domain (domain.min, domain.max)\n let yAxisWidth = 70\n\n let dataKey = (fun (p: GraphNode) -> p.Ticks) |> xAxis.dataKey\n\n Recharts.areaChart [\n areaChart.data graphData.Data\n areaChart.syncId \"syncId1\"\n areaChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxisTimeTickFormatter\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n axisTicks\n yAxis.allowDecimals false\n yAxis.dataKey (fun p -> p.RainSum)\n yAxis.unit \"mm\"\n yAxis.number\n yDomain\n yAxis.width yAxisWidth\n ]\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n Recharts.legend []\n\n Recharts.area [\n area.dataKey (fun p -> p.RainSum)\n area.name \"Regensumme [mm]\"\n area.fill \"#0033FF\"\n area.fillOpacity 0.3\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> graphWrapper \"full-height-graph-box\"\n\nlet graphs (graphData: ScabGraphData) =\n [\n infectionGraph\n leafletWetnessGraph\n rainfallGraph\n rainSumGraph\n ]\n |> List.map (fun factory -> factory graphData)","module Shared.Dto.Scab\n\nlet scabInfectionPercentageToString (percentage: float) : string =\n if percentage < 100. then \"Keine Infektion\"\n else if percentage < 134. then \"Leichte Infektion\"\n else if percentage < 202. then \"Mittlere Infektion\"\n else \"Schwere Infektion\"","module Client.Page.User.ScabData\n\nopen System\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Components.Graph.Scab\nopen Client.Domain\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React\nopen Feliz\nopen Fulma\nopen Shared.Dto.Page\nopen Shared.Dto.Dto\nopen Shared.Infrastructure\nopen Client.Components.GraphCommon\n\ntype DataModel = {\n RequestRunning: bool\n DateRangePicker: DateRangePicker.Data\n Session: UserSession\n SensorId: int\n Station: ScabData.StationDto\n GraphData: Loadable\n}\n\ntype LoadingModel = {\n Session: UserSession\n SensorId: int\n}\n\ntype Model = Loadable\n\nlet init id (session: UserSession) : Model * Cmd =\n let requestData = {\n SessionKey = session.SessionKey\n Data = id\n }\n\n let cmd =\n Cmd.OfAsync.perform api.getScabStation requestData (ScabDataMsg.StationReceived >> Msg.ScabData)\n\n Loadable.Loading(\n {\n Session = session\n SensorId = id\n }\n ),\n cmd\n\nlet private createRequestDataCommand (request: AuthenticatedRequest) : Cmd =\n Cmd.OfAsync.perform api.getScabData request (ScabDataMsg.GraphDataReceived >> Msg.ScabData)\n\nlet private stationResponseToDataModel\n (loadingModel: LoadingModel)\n (response: AuthenticatedResponse)\n : Model * Cmd =\n match response with\n | Ok station ->\n match station with\n | ScabData.Data data ->\n let startTimestamp = DateTime.Now |> DateTime.addDays -1 |> DateTime.startOfDay\n let endTimestamp = DateTime.Now |> DateTime.startOfDay\n\n let requestData: AuthenticatedRequest = {\n SessionKey = loadingModel.Session.SessionKey\n Data = {\n StationId = loadingModel.SensorId\n StartTimestamp = startTimestamp\n EndTimestamp = endTimestamp |> DateTime.endOfDay\n }\n }\n\n Loadable.Data {\n RequestRunning = true\n DateRangePicker = DateRangePicker.initWithRange startTimestamp endTimestamp (TimeSpan.FromDays 31) false\n Session = loadingModel.Session\n SensorId = loadingModel.SensorId\n Station = data\n GraphData = Loadable.Loading()\n },\n createRequestDataCommand requestData\n | ScabData.NotFound -> Loadable.Error \"Schorf-Station nicht gefunden\", Cmd.none\n | AuthenticatedResponse.Error authError ->\n match authError with\n | AuthErr Unauthenticated -> Loadable.Error \"Sie sind nicht eingeloggt, bitte die Seite neu laden\", Cmd.none\n | AuthErr Unauthorized -> Loadable.Error \"Schorf-Station nicht gefunden\", Cmd.none\n | CustomErr err -> Loadable.Error \"Beim Laden der Schorf-Station ist ein Fehler aufgetreten\", Cmd.none\n\n\nlet update (msg: ScabDataMsg) (model: Model) : Model * Cmd =\n match msg, model with\n | ScabDataMsg.StationReceived stationResponse, Loadable.Loading loadingModel ->\n stationResponseToDataModel loadingModel stationResponse\n | ScabDataMsg.GraphDataReceived dataResponse, Loadable.Data dataModel ->\n match dataResponse with\n | Ok(ScabData.DataResponse.Data data) ->\n let graphData =\n if List.isEmpty data then\n ScabGraph.NoData\n else\n ScabGraph.Data(createScabGraphData data)\n\n Loadable.Data {\n dataModel with\n RequestRunning = false\n GraphData = Loadable.Data graphData\n },\n Cmd.none\n | Ok(ScabData.DataResponse.NotFound)\n | AuthenticatedResponse.Error _ ->\n Loadable.Data {\n dataModel with\n GraphData = Loadable.Error \"Ein Fehler ist beim Laden der Daten aufgetreten\"\n },\n Cmd.none\n | ScabDataMsg.GraphDateRangeChanged dates, Loadable.Data dataModel ->\n let newPickerModel = DateRangePicker.updateData dates dataModel.DateRangePicker\n\n Loadable.Data { dataModel with DateRangePicker = newPickerModel }, Cmd.none\n | ScabDataMsg.RequestData request, Loadable.Data dataModel ->\n let authenticatedRequest = {\n SessionKey = dataModel.Session.SessionKey\n Data = request\n }\n\n Loadable.Data { dataModel with RequestRunning = true }, createRequestDataCommand authenticatedRequest\n | _, _ -> model, Cmd.none\n\nlet private graphWrappingView (graphs: ReactElement list) = div [] [ yield! graphs ]\n\nlet private boxHeader: ReactElement =\n Heading.h3 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Option.Centered)\n ]\n ] [ str \"Visualisierung der Daten\" ]\n\nlet private createRequestData (stationId: int) (startDate: DateTime) (endDate: DateTime) : ScabData.DataRequest = {\n StationId = stationId\n StartTimestamp = startDate\n EndTimestamp = endDate\n}\n\nlet createEnabledButtonOptions dispatch (stationId: int) (startDate: DateTime) (endDate: DateTime) =\n let requestData = createRequestData stationId startDate (endDate.AddDays(1.))\n\n [\n Button.Disabled false\n Button.OnClick(fun _ -> dispatch (ScabDataMsg.RequestData requestData |> ScabData))\n ]\n\nlet private dateRangePicker dispatch (model: DataModel) =\n let buttonOptions =\n Option.map2\n (createEnabledButtonOptions dispatch model.SensorId)\n model.DateRangePicker.Start\n model.DateRangePicker.End\n |> Option.defaultValue [ Button.Disabled true ]\n\n let buttonOptions =\n List.append buttonOptions [\n Button.IsLink\n Button.IsLoading model.RequestRunning\n ]\n\n Column.column [ Column.Width(Screen.All, Column.IsFull) ] [\n Columns.columns [ Columns.IsVCentered ] [\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ p [] [ str \"Datumsbereich:\" ] ]\n Column.column [] [\n DateRangePicker.view\n \"Von/Bis Datumsbereich auswählen\"\n ((ScabDataMsg.GraphDateRangeChanged >> ScabData) >> dispatch)\n model.DateRangePicker\n ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ Button.button buttonOptions [ str \"Laden\" ] ]\n ]\n ]\n\nlet private pageHeader (stationName: string) : ReactElement =\n Heading.h1 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ] [ str stationName ]\n\nlet private pageLayout stationName content =\n Container.container [ Container.isFullWidth ] [\n pageHeader stationName\n Columns.columns [ Columns.IsMultiline ] [\n Column.column [ Column.Width(Screen.All, Column.IsFull) ] [ Box.box' [] content ]\n ]\n ]\n\nlet private graphsView (graphData: ScabGraph) =\n match graphData with\n | NoData -> [\n createFullColumn (boxStringSubtitle \"Es wurden keine Daten im ausgewählten Zeitraum gefunden\")\n ]\n | ScabGraph.Data data -> graphs data\n\n\nlet pageView dispatch (model: DataModel) =\n let boxContent = [\n boxHeader\n dateRangePicker dispatch model\n yield! (Loadable.listView graphsView model.GraphData)\n ]\n\n pageLayout model.Station.Name boxContent\n\n\nlet view dispatch (model: Model) = Loadable.view (pageView dispatch) model","module Client.Forms.RenameScabStation\n\nopen Client.Components\nopen Client.DomainTypes.Msg\nopen Fable.React\nopen Fulma\nopen Shared.DtoTypes.Page\nopen Shared.Infrastructure\n\ntype Model = {\n StationId: int\n Name: string option\n RequestRunning: bool\n}\n\ntype FormResult =\n | Noop\n | CloseModal\n | Rename of MyScabStations.RenameRequest\n\nlet init (station: MyScabStations.ListingDto) = {\n StationId = station.Id\n Name = Some station.Name\n RequestRunning = false\n}\n\nlet private form dispatch (model: Model) =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Name\" ]\n Control.div [] [\n Input.text [\n model.Name |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value |> String.toOption |> RenameMyScabStationMsg.NameChanged |> dispatch\n )\n ]\n ]\n ]\n ]\n\nlet private tryCreateRenameRequest (model: Model) : MyScabStations.RenameRequest option =\n model.Name\n |> Option.map (fun name -> {\n StationId = model.StationId\n Name = name\n })\n\nlet private saveButton dispatch (model: Model) =\n let request = tryCreateRenameRequest model\n\n Button.button [\n Button.IsLoading model.RequestRunning\n Button.Color Color.IsLink\n\n match request with\n | Some request -> SubmitButton.onClick (fun _ -> dispatch (RenameMyScabStationMsg.RenameStation request))\n | None -> Button.Disabled true\n ] [ str \"Speichern\" ]\n\nlet view (dispatch: RenameMyScabStationMsg -> unit) (model: Model) =\n let closeModal = (fun _ -> dispatch RenameMyScabStationMsg.CloseModal)\n\n let headline = \"Schorf-Station umbenennen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ form dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]\n\nlet update (msg: RenameMyScabStationMsg) (model: Model) =\n match msg with\n | RenameMyScabStationMsg.NameChanged name -> { model with Name = name }, FormResult.Noop\n | RenameMyScabStationMsg.CloseModal -> model, FormResult.CloseModal\n | RenameMyScabStationMsg.RenameStation request -> { model with RequestRunning = true }, FormResult.Rename request","module Client.Page.User.MyScabStations\n\nopen Client\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Domain\nopen Client.DomainTypes\nopen Client.Forms\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Shared.Dto.Dto\nopen Shared.DtoTypes.Page\nopen Thoth.Elmish\n\ntype DataModel = {\n Session: UserSession\n Stations: MyScabStations.ListingDto list\n DeleteModal: MyScabStations.ListingDto option\n RenameModal: RenameScabStation.Model option\n DeletionRunning: bool\n}\n\ntype Model = Loadable\n\nlet init (session: UserSession) : Model * Cmd =\n let request = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n Loadable.Loading session,\n Cmd.OfAsync.perform api.getMyScabStations request (MyScabStationsMsg.StationsReceived >> MyScabStations)\n\nlet update (msg: MyScabStationsMsg) (model: Model) : Model * Cmd =\n match msg, model with\n | MyScabStationsMsg.StationsReceived(Ok stations), Loadable.Loading loadingModel ->\n Loadable.Data {\n Session = loadingModel\n Stations = stations\n DeleteModal = None\n RenameModal = None\n DeletionRunning = false\n },\n Cmd.none\n | MyScabStationsMsg.StationsReceived(AuthenticatedResponse.Error _), _ ->\n Loadable.Error \"Fehler beim Laden der Schorf Stationen, bitten laden Sie die Seite neu\", Cmd.none\n | MyScabStationsMsg.OpenDeleteModal station, Loadable.Data data ->\n Loadable.Data {\n data with\n DeleteModal = Some station\n DeletionRunning = false\n },\n Cmd.none\n | MyScabStationsMsg.CloseDeleteModal, Loadable.Data data ->\n Loadable.Data {\n data with\n DeleteModal = None\n DeletionRunning = false\n },\n Cmd.none\n | MyScabStationsMsg.DeleteStation id, Loadable.Data data ->\n let requestData: AuthenticatedRequest = {\n SessionKey = data.Session.SessionKey\n Data = id\n }\n\n let cmd =\n Cmd.OfAsync.perform api.deleteScabStation requestData (MyScabStationsMsg.StationDeleted >> MyScabStations)\n\n Loadable.Data { data with DeletionRunning = true }, cmd\n | MyScabStationsMsg.StationDeleted response, Loadable.Data data ->\n match response with\n | Ok(MyScabStations.DeletionResponse.Successful id) ->\n let toastCmd =\n Toast.create \"Die Schorf-Station wurde erfolgreich gelöscht\" |> Toast.success\n\n Loadable.Data {\n data with\n Stations = List.filter (fun station -> station.Id <> id) data.Stations\n DeleteModal = None\n },\n toastCmd\n | Ok MyScabStations.DeletionResponse.NotFound ->\n let toastCmd = Toast.create \"Die Schorf-Station wurde nicht gefunden\" |> Toast.error\n\n Loadable.Data { data with DeleteModal = None }, toastCmd\n | AuthenticatedResponse.Error _ ->\n let toastCmd =\n Toast.create \"Beim Löschen der Schorf-Station ist ein Fehler aufgetreten\"\n |> Toast.error\n\n Loadable.Data data, toastCmd\n | MyScabStationsMsg.OpenRenameModal station, Loadable.Data dataModel ->\n Loadable.Data { dataModel with RenameModal = Some(RenameScabStation.init station) }, Cmd.none\n | MyScabStationsMsg.RenameModal subMsg, Loadable.Data dataModel ->\n match dataModel.RenameModal with\n | Some modal ->\n let newModel, result = RenameScabStation.update subMsg modal\n\n match result with\n | RenameScabStation.Noop -> Loadable.Data { dataModel with RenameModal = Some newModel }, Cmd.none\n | RenameScabStation.CloseModal -> Loadable.Data { dataModel with RenameModal = None }, Cmd.none\n | RenameScabStation.Rename requestData ->\n let request = {\n SessionKey = dataModel.Session.SessionKey\n Data = requestData\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.renameScabStation\n request\n (MyScabStationsMsg.StationRenamed >> MyScabStations)\n\n Loadable.Data { dataModel with RenameModal = Some newModel }, cmd\n | None -> Loadable.Data dataModel, Cmd.none\n | MyScabStationsMsg.StationRenamed response, Loadable.Data dataModel ->\n match response with\n | Ok _ ->\n let toastCmd =\n Toast.create \"Die Schorf-Station wurde erfolgreich umbenannt\" |> Toast.success\n\n init dataModel.Session |> fun (model, cmd) -> model, Cmd.batch [ toastCmd; cmd ]\n | AuthenticatedResponse.Error _ ->\n let toastCmd =\n Toast.create \"Ein Fehler ist beim Umbenennen der Schorf-Station aufgetreten\"\n |> Toast.error\n\n Loadable.Data { dataModel with RenameModal = None }, toastCmd\n | _, _ -> model, Cmd.none\n\nlet private createDeleteModalConfig dispatch (station: MyScabStations.ListingDto) : ConfirmationModal.Configuration = {\n Headline = \"Schorf-Station löschen\"\n Text = sprintf \"Willst du wirklich die Schorf-Station '%s' löschen?\" station.Name\n OnClose = (fun _ -> dispatch MyScabStationsMsg.CloseDeleteModal)\n OnNo = (fun _ -> dispatch MyScabStationsMsg.CloseDeleteModal)\n OnYes = (fun _ -> dispatch (MyScabStationsMsg.DeleteStation station.Id))\n}\n\nlet private detailsButton dispatch (stationId: int) =\n Button.button [\n Button.Color Color.IsLink\n SubmitButton.onClick (fun _ -> dispatch (GlobalMsg.GoToRoute(Route.ScabData stationId) |> Global))\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.ChartLine ] [] ]\n span [] [ str \"Details\" ]\n ]\n\nlet private addButton =\n let button =\n Button.button [ Button.Color IsLink; Button.Disabled true ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Plus ] [] ]\n span [] [ str \"Hinzufügen\" ]\n ]\n\n let text =\n p [] [\n str \"Während der Testphase können Schorf-Stationen nur von einem Administrator angelegt werden\"\n ]\n\n Level.level [] [\n Level.left [] []\n Level.right [] [\n Level.item [] [ text ]\n Level.item [] [ button ]\n ]\n ]\n\nlet private deleteButton dispatch station =\n Button.button [\n Button.Color IsDanger\n SubmitButton.onClick (fun _ -> station |> MyScabStationsMsg.OpenDeleteModal |> MyScabStations |> dispatch)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Trash ] [] ]\n span [] [ str \"Löschen\" ]\n ]\n\nlet private renameButton dispatch station =\n Button.button [\n Button.Color Color.IsLink\n SubmitButton.onClick (fun _ -> station |> MyScabStationsMsg.OpenRenameModal |> MyScabStations |> dispatch)\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Pen ] [] ]\n span [] [ str \"Umbenennen\" ]\n ]\n\n\nlet private stationRow dispatch (station: MyScabStations.ListingDto) =\n Columns.columns [ Columns.IsVCentered; Columns.bottomBorder ] [\n Column.column [] [\n span [ Html.label ] [ str \"Name: \" ]\n span [ Style [ FontWeight \"bold\" ] ] [ str station.Name ]\n ]\n Column.column [] [\n span [ Html.label ] [ str \"Infektionstätigkeit:\" ]\n span [ Style [ FontWeight \"bold\" ] ] [ str station.InfectionState ]\n ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ detailsButton dispatch station.Id ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ renameButton dispatch station ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ deleteButton dispatch station ]\n ]\n\nlet rowsView dispatch (stations: MyScabStations.ListingDto list) =\n if List.isEmpty stations then\n [ p [] [ str \"Keine Schorf Stationen gefunden\" ] ]\n else\n List.map (stationRow dispatch) stations\n\nlet dataView dispatch (model: DataModel) =\n Container.container [ Container.isFullWidth ] [\n Box.box' [] [\n Heading.p [] [ str \"Schorf Stationen\" ]\n\n yield! (rowsView dispatch model.Stations)\n\n addButton\n ]\n\n match model.DeleteModal with\n | Some station ->\n createDeleteModalConfig (MyScabStations >> dispatch) station\n |> ConfirmationModal.view model.DeletionRunning\n | None -> ()\n\n match model.RenameModal with\n | Some modal -> RenameScabStation.view (MyScabStationsMsg.RenameModal >> MyScabStations >> dispatch) modal\n | None -> ()\n ]\n\nlet view dispatch (model: Model) = Loadable.view (dataView dispatch) model","module Client.Page.User.MyUserGroups\n\nopen Client.Domain\nopen Client.Infrastructure.Api\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fulma\nopen Fable.React.Helpers\nopen Fable.React.Standard\nopen Shared.Dto.Dto\nopen Shared.Dto.Page.User\n\ntype DataModel = { Groups: MyUserGroups.GroupListingData list }\n\ntype Model = Loadable\n\nlet init (session: UserSession) =\n let request = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n Loadable.Loading session,\n Cmd.OfAsync.perform api.getMyUserGroups request (MyUserGroupsMsg.GroupsReceived >> MyUserGroups)\n\nlet update (msg: MyUserGroupsMsg) (model: Model) =\n match msg, model with\n | MyUserGroupsMsg.GroupsReceived response, Loadable.Loading _ ->\n match response with\n | Ok groups -> Loadable.Data { Groups = groups }, Cmd.none\n | _ -> Loadable.Error \"Beim Laden der Gruppen ist ein Fehler aufgetreten\", Cmd.none\n | _, _ -> model, Cmd.none\n\nlet private groupRow (group: MyUserGroups.GroupListingData) =\n Columns.columns [] [\n Column.column [] [\n span [ Html.label ] [ str \"Gruppe:\" ]\n span [ Html.bold ] [ str group.GroupName ]\n ]\n ]\n\nlet private noGroups =\n Columns.columns [] [\n Column.column [] [\n span [] [\n str \"Du bist kein Mitglied einer Benutzergruppe\"\n ]\n ]\n ]\n\n\nlet private dataView (model: DataModel) =\n let rows =\n if List.isEmpty model.Groups then\n [ noGroups ]\n else\n List.map groupRow model.Groups\n\n Container.container [ Container.isFullWidth ] [\n Box.box' [] [\n Heading.p [] [ str \"Meine Gruppen\" ]\n\n yield! rows\n ]\n ]\n\nlet view (model: Model) = Loadable.view dataView model","module Client.Forms.RenamePeronosporaStation\n\nopen Client.Components\nopen Client.DomainTypes.Msg\nopen Fable.React\nopen Fulma\nopen Shared.DtoTypes.Page\nopen Shared.Infrastructure\n\ntype Model = {\n StationId: int\n Name: string option\n RequestRunning: bool\n}\n\ntype FormResult =\n | Noop\n | CloseModal\n | Rename of MyPeronosporaStations.RenameRequest\n\nlet init (station: MyPeronosporaStations.ListingDto) = {\n StationId = station.Id\n Name = Some station.Name\n RequestRunning = false\n}\n\nlet private form dispatch (model: Model) =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Name\" ]\n Control.div [] [\n Input.text [\n model.Name |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> RenameMyPeronosporaStationMsg.NameChanged\n |> dispatch\n )\n ]\n ]\n ]\n ]\n\nlet private tryCreateRenameRequest (model: Model) : MyPeronosporaStations.RenameRequest option =\n model.Name\n |> Option.map (fun name -> {\n StationId = model.StationId\n Name = name\n })\n\nlet private saveButton dispatch (model: Model) =\n let request = tryCreateRenameRequest model\n\n Button.button [\n Button.IsLoading model.RequestRunning\n Button.Color Color.IsLink\n\n match request with\n | Some request -> SubmitButton.onClick (fun _ -> dispatch (RenameMyPeronosporaStationMsg.RenameStation request))\n | None -> Button.Disabled true\n ] [ str \"Speichern\" ]\n\nlet view (dispatch: RenameMyPeronosporaStationMsg -> unit) (model: Model) =\n let closeModal = (fun _ -> dispatch RenameMyPeronosporaStationMsg.CloseModal)\n\n let headline = \"Schorf-Station umbenennen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ form dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]\n\nlet update (msg: RenameMyPeronosporaStationMsg) (model: Model) =\n match msg with\n | RenameMyPeronosporaStationMsg.NameChanged name -> { model with Name = name }, FormResult.Noop\n | RenameMyPeronosporaStationMsg.CloseModal -> model, FormResult.CloseModal\n | RenameMyPeronosporaStationMsg.RenameStation request ->\n { model with RequestRunning = true }, FormResult.Rename request","module Client.Page.User.MyPeronosporaStations\n\nopen Client\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Domain\nopen Client.DomainTypes\nopen Client.Forms\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Shared\nopen Shared.Dto.Dto\nopen Shared.DtoTypes.Page\nopen Thoth.Elmish\n\ntype DataModel = {\n Session: UserSession\n Stations: MyPeronosporaStations.ListingDto list\n DeleteModal: MyPeronosporaStations.ListingDto option\n RenameModal: RenamePeronosporaStation.Model option\n DeletionRunning: bool\n}\n\ntype Model = Loadable\n\nlet init (session: UserSession) : Model * Cmd =\n let request = {\n SessionKey = session.SessionKey\n Data = ()\n }\n\n Loadable.Loading session,\n Cmd.OfAsync.perform\n api.getMyPeronosporaStations\n request\n (MyPeronosporaStationsMsg.StationsReceived >> MyPeronosporaStations)\n\nlet update (msg: MyPeronosporaStationsMsg) (model: Model) : Model * Cmd =\n match msg, model with\n | MyPeronosporaStationsMsg.StationsReceived(Ok stations), Loadable.Loading loadingModel ->\n Loadable.Data {\n Session = loadingModel\n Stations = stations\n DeleteModal = None\n RenameModal = None\n DeletionRunning = false\n },\n Cmd.none\n | MyPeronosporaStationsMsg.StationsReceived(AuthenticatedResponse.Error _), _ ->\n Loadable.Error \"Fehler beim Laden der Peronospora Stationen, bitten laden Sie die Seite neu\", Cmd.none\n | MyPeronosporaStationsMsg.OpenDeleteModal station, Loadable.Data data ->\n Loadable.Data {\n data with\n DeleteModal = Some station\n DeletionRunning = false\n },\n Cmd.none\n | MyPeronosporaStationsMsg.CloseDeleteModal, Loadable.Data data ->\n Loadable.Data {\n data with\n DeleteModal = None\n DeletionRunning = false\n },\n Cmd.none\n | MyPeronosporaStationsMsg.DeleteStation id, Loadable.Data data ->\n let requestData: AuthenticatedRequest = {\n SessionKey = data.Session.SessionKey\n Data = id\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.deletePeronosporaStation\n requestData\n (MyPeronosporaStationsMsg.StationDeleted >> MyPeronosporaStations)\n\n Loadable.Data { data with DeletionRunning = true }, cmd\n | MyPeronosporaStationsMsg.StationDeleted response, Loadable.Data data ->\n match response with\n | Ok(MyPeronosporaStations.DeletionResponse.Successful id) ->\n let toastCmd =\n Toast.create \"Die Peronospora-Station wurde erfolgreich gelöscht\"\n |> Toast.success\n\n Loadable.Data {\n data with\n Stations = List.filter (fun station -> station.Id <> id) data.Stations\n DeleteModal = None\n },\n toastCmd\n | Ok MyPeronosporaStations.DeletionResponse.NotFound ->\n let toastCmd =\n Toast.create \"Die Peronospora-Station wurde nicht gefunden\" |> Toast.error\n\n Loadable.Data { data with DeleteModal = None }, toastCmd\n | AuthenticatedResponse.Error _ ->\n let toastCmd =\n Toast.create \"Beim Löschen der Peronospora-Station ist ein Fehler aufgetreten\"\n |> Toast.error\n\n Loadable.Data data, toastCmd\n | MyPeronosporaStationsMsg.OpenRenameModal station, Loadable.Data dataModel ->\n Loadable.Data { dataModel with RenameModal = Some(RenamePeronosporaStation.init station) }, Cmd.none\n | MyPeronosporaStationsMsg.RenameModal subMsg, Loadable.Data dataModel ->\n match dataModel.RenameModal with\n | Some modal ->\n let newModel, result = RenamePeronosporaStation.update subMsg modal\n\n match result with\n | RenamePeronosporaStation.Noop -> Loadable.Data { dataModel with RenameModal = Some newModel }, Cmd.none\n | RenamePeronosporaStation.CloseModal -> Loadable.Data { dataModel with RenameModal = None }, Cmd.none\n | RenamePeronosporaStation.Rename requestData ->\n let request = {\n SessionKey = dataModel.Session.SessionKey\n Data = requestData\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.renamePeronosporaStation\n request\n (MyPeronosporaStationsMsg.StationRenamed >> MyPeronosporaStations)\n\n Loadable.Data { dataModel with RenameModal = Some newModel }, cmd\n | None -> Loadable.Data dataModel, Cmd.none\n | MyPeronosporaStationsMsg.StationRenamed response, Loadable.Data dataModel ->\n match response with\n | Ok _ ->\n let toastCmd =\n Toast.create \"Die Schorf-Station wurde erfolgreich umbenannt\" |> Toast.success\n\n init dataModel.Session |> fun (model, cmd) -> model, Cmd.batch [ toastCmd; cmd ]\n | AuthenticatedResponse.Error _ ->\n let toastCmd =\n Toast.create \"Ein Fehler ist beim Umbenennen der Schorf-Station aufgetreten\"\n |> Toast.error\n\n Loadable.Data { dataModel with RenameModal = None }, toastCmd\n | _, _ -> model, Cmd.none\n\nlet private createDeleteModalConfig\n dispatch\n (station: MyPeronosporaStations.ListingDto)\n : ConfirmationModal.Configuration =\n {\n Headline = \"Peronospora-Station löschen\"\n Text = sprintf \"Willst du wirklich die Peronospora-Station '%s' löschen?\" station.Name\n OnClose = (fun _ -> dispatch MyPeronosporaStationsMsg.CloseDeleteModal)\n OnNo = (fun _ -> dispatch MyPeronosporaStationsMsg.CloseDeleteModal)\n OnYes = (fun _ -> dispatch (MyPeronosporaStationsMsg.DeleteStation station.Id))\n }\n\nlet private detailsButton dispatch (stationId: int) =\n Button.button [\n Button.Color Color.IsLink\n SubmitButton.onClick (fun _ -> dispatch (GlobalMsg.GoToRoute(Route.PeronosporaData stationId) |> Global))\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.ChartLine ] [] ]\n span [] [ str \"Details\" ]\n ]\n\nlet private addButton =\n let button =\n Button.button [ Button.Color IsLink; Button.Disabled true ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Plus ] [] ]\n span [] [ str \"Hinzufügen\" ]\n ]\n\n let text =\n p [] [\n str \"Während der Testphase können Peronospora-Stationen nur von einem Administrator angelegt werden\"\n ]\n\n Level.level [] [\n Level.left [] []\n Level.right [] [\n Level.item [] [ text ]\n Level.item [] [ button ]\n ]\n ]\n\nlet private deleteButton dispatch station =\n Button.button [\n Button.Color IsDanger\n SubmitButton.onClick (fun _ ->\n station\n |> MyPeronosporaStationsMsg.OpenDeleteModal\n |> MyPeronosporaStations\n |> dispatch\n )\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Trash ] [] ]\n span [] [ str \"Löschen\" ]\n ]\n\nlet private renameButton dispatch station =\n Button.button [\n Button.Color Color.IsLink\n SubmitButton.onClick (fun _ ->\n station\n |> MyPeronosporaStationsMsg.OpenRenameModal\n |> MyPeronosporaStations\n |> dispatch\n )\n ] [\n Icon.icon [] [ Fa.i [ Fa.Solid.Pen ] [] ]\n span [] [ str \"Umbenennen\" ]\n ]\n\n\nlet private stationRow dispatch (station: MyPeronosporaStations.ListingDto) =\n Columns.columns [ Columns.IsVCentered; Columns.bottomBorder ] [\n Column.column [] [\n span [ Html.label ] [ str \"Name: \" ]\n span [ Style [ FontWeight \"bold\" ] ] [ str station.Name ]\n ]\n Column.column [] [\n span [ Html.label ] [ str \"Keimung:\" ]\n span [ Style [ FontWeight \"bold\" ] ] [ str station.GerminationState ]\n ]\n Column.column [] [\n span [ Html.label ] [ str \"Primäre Infektionen:\" ]\n span [ Style [ FontWeight \"bold\" ] ] [ str station.PrimaryInfectionState ]\n ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ detailsButton dispatch station.Id ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ renameButton dispatch station ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ deleteButton dispatch station ]\n ]\n\nlet rowsView dispatch (stations: MyPeronosporaStations.ListingDto list) =\n if List.isEmpty stations then\n [\n p [] [ str \"Keine Peronospora Stationen gefunden\" ]\n ]\n else\n List.map (stationRow dispatch) stations\n\nlet dataView dispatch (model: DataModel) =\n Container.container [ Container.isFullWidth ] [\n Box.box' [] [\n Heading.p [] [ str \"Peronospora Stationen\" ]\n\n yield! (rowsView dispatch model.Stations)\n\n addButton\n ]\n\n match model.DeleteModal with\n | Some station ->\n createDeleteModalConfig (MyPeronosporaStations >> dispatch) station\n |> ConfirmationModal.view model.DeletionRunning\n | None -> ()\n\n match model.RenameModal with\n | Some modal ->\n RenamePeronosporaStation.view\n (MyPeronosporaStationsMsg.RenameModal >> MyPeronosporaStations >> dispatch)\n modal\n | None -> ()\n ]\n\nlet view dispatch (model: Model) = Loadable.view (dataView dispatch) model","module Client.Components.Graph.Graph.Peronospora\n\nopen Client.Components\nopen Client.Components.Graph\nopen Client.Components.Graph.Recharts\nopen Client.Domain\nopen Feliz\nopen Feliz.Recharts\nopen Fable.React.Props\nopen Shared.Dto.Page\nopen GraphCommon\n\ntype PeronosporaGraphData = {\n RainAxisTicks: float list\n Data: PeronosporaData.GraphNodeDto list\n MinTick: int\n MaxTick: int\n PrimaryInfectionsGraph: ReactElement\n SporangiaGraph: ReactElement\n NormalInfectionsGraph: ReactElement\n}\n\ntype PeronosporaGraph =\n | NoData\n | Data of PeronosporaGraphData\n\nlet private germinationGraph (graphData: PeronosporaGraphData) : ReactElement =\n let xDomain = xAxis.domain (domain.min, domain.max)\n\n let yAxisTicks = AxisTicks.createYProperty [ 0; 1 ]\n let dataKey = (fun (p: PeronosporaData.GraphNodeDto) -> p.Ticks) |> xAxis.dataKey\n\n Recharts.areaChart [\n areaChart.syncId \"syncId1\"\n areaChart.syncMethod \"value\"\n areaChart.data graphData.Data\n areaChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxisTimeTickFormatter\n xDomain\n ]\n Recharts.yAxis [\n yAxis.dataKey (fun (p: PeronosporaData.GraphNodeDto) -> p.ActiveGermination)\n yAxis.number\n yAxisTicks\n ]\n Recharts.legend []\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.area [\n area.fillOpacity 0.2\n area.fill \"#C8C8C8\"\n area.stroke \"#C8C8C8\"\n area.dataKey (fun (p: PeronosporaData.GraphNodeDto) -> p.ActiveGermination)\n area.name \"Aktive Keimung\"\n ]\n\n Recharts.area [\n area.fillOpacity 0.2\n area.fill \"#F08000\"\n area.stroke \"#F08000\"\n area.dataKey (fun (p: PeronosporaData.GraphNodeDto) -> p.GerminationFinished)\n area.name \"Oosporen gekeimt\"\n ]\n ]\n ]\n |> graphWrapper \"half-height-graph-box\"\n\nlet private rainfallGraph (graphData: PeronosporaGraphData) : ReactElement =\n let xDomain = xAxis.domain (domain.min, domain.max)\n let xAxisTickInterval = xAxis.interval.preserveStartEnd\n\n let amountAxisTicks = AxisTicks.createYProperty graphData.RainAxisTicks\n let yDomain = yAxis.domain (domain.min, domain.max)\n let yAxisWidth = 70\n\n let dataKey = (fun (p: PeronosporaData.GraphNodeDto) -> p.Ticks) |> xAxis.dataKey\n\n Recharts.barChart [\n barChart.data graphData.Data\n barChart.syncId \"syncId1\"\n barChart.syncMethod \"value\"\n barChart.children [\n Recharts.xAxis [\n dataKey\n xAxis.number\n xAxis.scale.time\n xAxisTimeTickFormatter\n xDomain\n xAxisTickInterval\n ]\n Recharts.yAxis [\n amountAxisTicks\n yAxis.dataKey (fun (p: PeronosporaData.GraphNodeDto) -> p.RainFallAmount)\n yAxis.unit \"mm\"\n yAxis.number\n yDomain\n yAxis.width yAxisWidth\n ]\n Recharts.tooltip [ tooltip.content tooltipContent ]\n Recharts.legend []\n\n Recharts.bar [\n bar.dataKey (fun (p: PeronosporaData.GraphNodeDto) -> p.RainFallAmount)\n bar.name \"Regenmenge [mm/15 Minuten]\"\n bar.fill \"#0033FF\"\n bar.stroke \"#0033FF\"\n ]\n\n Recharts.cartesianGrid [ cartesianGrid.strokeDasharray [| 3; 3 |] ]\n ]\n ]\n |> graphWrapper \"full-height-graph-box\"\n\nlet private primaryInfectionsGraph minTick maxTick (data: PeronosporaData.DataDto) : ReactElement =\n let yTicks = AxisTicks.createYProperty [ 0; 25; 50; 75; 100 ]\n\n let lines =\n data.PrimaryInfections\n |> List.mapi (fun idx infection ->\n Recharts.area [\n area.dot false\n area.data infection\n area.dataKey (fun (p: PeronosporaData.InfectionNodeDto) -> p.Percentage)\n area.name (sprintf \"Primärinfektion #%d\" (idx + 1))\n area.stroke \"#2401FF\"\n area.fill \"#2401FF\"\n area.fillOpacity 0.2\n ]\n )\n\n let xDomain = xAxis.domain (domain.constant minTick, domain.constant maxTick)\n\n Recharts.areaChart [\n areaChart.syncId \"syncId1\"\n areaChart.syncMethod \"value\"\n areaChart.children [\n Recharts.xAxis [\n xDomain\n xAxis.number\n xAxis.interval.preserveStart\n xAxis.tickFormatter formatTimeTick\n xAxis.dataKey (fun (p: PeronosporaData.InfectionNodeDto) -> p.Ticks)\n xAxis.scale.time\n xAxis.allowDuplicatedCategory false\n ]\n Recharts.yAxis [\n yTicks\n yAxis.number\n yAxis.unit \" %\"\n yAxis.dataKey (fun (p: PeronosporaData.InfectionNodeDto) -> p.Percentage)\n ]\n\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n\n yield! lines\n ]\n ]\n |> graphWrapper \"half-height-graph-box\"\n\nlet private maybePrimaryInfectionsGraph minTick maxTick (data: PeronosporaData.DataDto) : ReactElement =\n if List.isEmpty data.PrimaryInfections then\n Fable.React.Standard.div [ Class \"half-height-graph-box\" ] [\n PageSkeleton.centeredHeading \"Keine Primärinfektionen gefunden\"\n ]\n else\n primaryInfectionsGraph minTick maxTick data\n\nlet private sporangiaGraph minTick maxTick (data: PeronosporaData.DataDto) : ReactElement =\n let yTicks = AxisTicks.createYProperty [ 0; 25; 50; 75; 100 ]\n\n let lines =\n data.Sporangia\n |> List.mapi (fun idx sporangie ->\n Recharts.line [\n line.dot false\n line.data sporangie\n line.dataKey (fun (p: PeronosporaData.SporangiaNodeDto) -> p.Energy)\n line.name (sprintf \"Sporangien Absterben #%d\" (idx + 1))\n line.stroke \"#2401FF\"\n ]\n )\n\n let xDomain = xAxis.domain (domain.constant minTick, domain.constant maxTick)\n\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.syncMethod \"value\"\n lineChart.children [\n Recharts.xAxis [\n xDomain\n xAxis.number\n xAxis.interval.preserveStart\n xAxis.tickFormatter formatTimeTick\n xAxis.dataKey (fun (p: PeronosporaData.SporangiaNodeDto) -> p.Ticks)\n xAxis.scale.time\n xAxis.allowDuplicatedCategory false\n ]\n Recharts.yAxis [\n yTicks\n yAxis.number\n yAxis.dataKey (fun (p: PeronosporaData.SporangiaNodeDto) -> p.Energy)\n ]\n\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n\n yield! lines\n ]\n ]\n |> graphWrapper \"half-height-graph-box\"\n\nlet private maybeSporangiaGraph minTick maxTick (data: PeronosporaData.DataDto) : ReactElement =\n if List.isEmpty data.Sporangia then\n Fable.React.Standard.div [ Class \"half-height-graph-box\" ] [\n PageSkeleton.centeredHeading \"Keine Sporangien gefunden\"\n ]\n else\n sporangiaGraph minTick maxTick data\n\nlet private normalInfectionsGraph minTick maxTick (data: PeronosporaData.DataDto) : ReactElement =\n let yTicks = AxisTicks.createYProperty [ 0; 25; 50; 75; 100 ]\n\n let lines =\n data.NormalInfections\n |> List.mapi (fun idx infection ->\n Recharts.line [\n line.dot false\n line.data infection\n line.dataKey (fun (p: PeronosporaData.InfectionNodeDto) -> p.Percentage)\n line.name (sprintf \"Normalinfektion #%d\" (idx + 1))\n line.stroke \"#2401FF\"\n ]\n )\n\n let xDomain = xAxis.domain (domain.constant minTick, domain.constant maxTick)\n\n Recharts.lineChart [\n lineChart.syncId \"syncId1\"\n lineChart.syncMethod \"value\"\n lineChart.children [\n Recharts.xAxis [\n xDomain\n xAxis.number\n xAxis.interval.preserveStart\n xAxis.tickFormatter formatTimeTick\n xAxis.dataKey (fun (p: PeronosporaData.InfectionNodeDto) -> p.Ticks)\n xAxis.scale.time\n xAxis.allowDuplicatedCategory false\n ]\n Recharts.yAxis [\n yTicks\n yAxis.number\n yAxis.unit \" %\"\n yAxis.dataKey (fun (p: PeronosporaData.InfectionNodeDto) -> p.Percentage)\n ]\n\n Recharts.tooltip [ tooltip.content tooltipContentWithForecast ]\n\n yield! lines\n ]\n ]\n |> graphWrapper \"half-height-graph-box\"\n\nlet maybeNormalInfectionsGraph minTick maxTick (data: PeronosporaData.DataDto) : ReactElement =\n if List.isEmpty data.NormalInfections then\n Fable.React.Standard.div [ Class \"half-height-graph-box\" ] [\n PageSkeleton.centeredHeading \"Keine Normalinfektionen gefunden\"\n ]\n else\n normalInfectionsGraph minTick maxTick data\n\nlet createPeronosporaGraphData (data: PeronosporaData.DataDto) : PeronosporaGraphData =\n let rainFallAxisTicks =\n AxisTicks.generateBy true 1. (fun (node: PeronosporaData.GraphNodeDto) -> node.RainFallAmount) data.Nodes\n\n let ticks = data.Nodes |> List.map (fun node -> node.Ticks)\n let min = List.min ticks |> int\n let max = List.max ticks |> int\n\n {\n RainAxisTicks = rainFallAxisTicks\n Data = data.Nodes\n MinTick = min\n MaxTick = max\n PrimaryInfectionsGraph = maybePrimaryInfectionsGraph min max data\n SporangiaGraph = maybeSporangiaGraph min max data\n NormalInfectionsGraph = maybeNormalInfectionsGraph min max data\n }\n\nlet graphs (graphData: PeronosporaGraphData) = [\n germinationGraph graphData\n graphData.PrimaryInfectionsGraph\n graphData.SporangiaGraph\n graphData.NormalInfectionsGraph\n rainfallGraph graphData\n]","module Client.Page.User.PeronosporaData\n\nopen System\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Components.Graph.Graph.Peronospora\nopen Client.Domain\nopen Client.InfrastructureTypes\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React\nopen Feliz\nopen Fulma\nopen Shared.Dto.Page\nopen Shared.Dto.Dto\nopen Shared.Infrastructure\nopen Client.Components.GraphCommon\n\ntype DataModel = {\n RequestRunning: bool\n DateRangePicker: DateRangePicker.Data\n Session: UserSession\n SensorId: int\n Station: PeronosporaData.StationDto\n GraphData: Loadable\n}\n\ntype LoadingModel = {\n Session: UserSession\n SensorId: int\n}\n\ntype Model = Loadable\n\nlet init id (session: UserSession) : Model * Cmd =\n let requestData = {\n SessionKey = session.SessionKey\n Data = id\n }\n\n let cmd =\n Cmd.OfAsync.perform\n api.getPeronosporaStation\n requestData\n (PeronosporaDataMsg.StationReceived >> Msg.PeronosporaData)\n\n Loadable.Loading(\n {\n Session = session\n SensorId = id\n }\n ),\n cmd\n\nlet private createRequestDataCommand (request: AuthenticatedRequest) : Cmd =\n Cmd.OfAsync.perform api.getPeronosporaData request (PeronosporaDataMsg.GraphDataReceived >> Msg.PeronosporaData)\n\nlet private stationResponseToDataModel\n (loadingModel: LoadingModel)\n (response: AuthenticatedResponse)\n : Model * Cmd =\n match response with\n | Ok station ->\n match station with\n | PeronosporaData.Data data ->\n let startTimestamp = DateTime.Now |> DateTime.addDays -1 |> DateTime.startOfDay\n let endTimestamp = DateTime.Now |> DateTime.startOfDay\n\n let requestData: AuthenticatedRequest = {\n SessionKey = loadingModel.Session.SessionKey\n Data = {\n StationId = loadingModel.SensorId\n StartTimestamp = startTimestamp\n EndTimestamp = endTimestamp |> DateTime.endOfDay\n }\n }\n\n Loadable.Data {\n RequestRunning = true\n DateRangePicker = DateRangePicker.initWithRange startTimestamp endTimestamp (TimeSpan.FromDays 31) false\n Session = loadingModel.Session\n SensorId = loadingModel.SensorId\n Station = data\n GraphData = Loadable.Loading()\n },\n createRequestDataCommand requestData\n | PeronosporaData.NotFound -> Loadable.Error \"Schorf-Station nicht gefunden\", Cmd.none\n | AuthenticatedResponse.Error authError ->\n match authError with\n | AuthErr Unauthenticated -> Loadable.Error \"Sie sind nicht eingeloggt, bitte die Seite neu laden\", Cmd.none\n | AuthErr Unauthorized -> Loadable.Error \"Schorf-Station nicht gefunden\", Cmd.none\n | CustomErr err -> Loadable.Error \"Beim Laden der Schorf-Station ist ein Fehler aufgetreten\", Cmd.none\n\n\nlet update (msg: PeronosporaDataMsg) (model: Model) : Model * Cmd =\n match msg, model with\n | StationReceived stationResponse, Loadable.Loading loadingModel ->\n stationResponseToDataModel loadingModel stationResponse\n | GraphDataReceived dataResponse, Loadable.Data dataModel ->\n match dataResponse with\n | Ok(PeronosporaData.DataResponse.Data data) ->\n let graphData =\n if List.isEmpty data.Nodes then\n PeronosporaGraph.NoData\n else\n data |> createPeronosporaGraphData |> PeronosporaGraph.Data\n\n Loadable.Data {\n dataModel with\n RequestRunning = false\n GraphData = Loadable.Data graphData\n },\n Cmd.none\n | Ok(PeronosporaData.DataResponse.NotFound)\n | AuthenticatedResponse.Error _ ->\n Loadable.Data {\n dataModel with\n GraphData = Loadable.Error \"Ein Fehler ist beim Laden der Daten aufgetreten\"\n },\n Cmd.none\n | GraphDateRangeChanged dates, Loadable.Data dataModel ->\n let newPickerModel = DateRangePicker.updateData dates dataModel.DateRangePicker\n\n Loadable.Data { dataModel with DateRangePicker = newPickerModel }, Cmd.none\n | RequestData request, Loadable.Data dataModel ->\n let authenticatedRequest = {\n SessionKey = dataModel.Session.SessionKey\n Data = request\n }\n\n Loadable.Data { dataModel with RequestRunning = true }, createRequestDataCommand authenticatedRequest\n | _, _ -> model, Cmd.none\n\nlet private graphWrappingView (graphs: ReactElement list) = div [] [ yield! graphs ]\n\nlet private boxHeader: ReactElement =\n Heading.h3 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Option.Centered)\n ]\n ] [ str \"Visualisierung der Daten\" ]\n\nlet private createRequestData (stationId: int) (startDate: DateTime) (endDate: DateTime) : PeronosporaData.DataRequest = {\n StationId = stationId\n StartTimestamp = startDate\n EndTimestamp = endDate\n}\n\nlet createEnabledButtonOptions dispatch (stationId: int) (startDate: DateTime) (endDate: DateTime) =\n let requestData = createRequestData stationId startDate (endDate.AddDays(1.))\n\n [\n Button.Disabled false\n Button.OnClick(fun _ -> dispatch (PeronosporaDataMsg.RequestData requestData |> PeronosporaData))\n ]\n\nlet private dateRangePicker dispatch (model: DataModel) =\n let buttonOptions =\n Option.map2\n (createEnabledButtonOptions dispatch model.SensorId)\n model.DateRangePicker.Start\n model.DateRangePicker.End\n |> Option.defaultValue [ Button.Disabled true ]\n\n let buttonOptions =\n List.append buttonOptions [\n Button.IsLink\n Button.IsLoading model.RequestRunning\n ]\n\n Column.column [ Column.Width(Screen.All, Column.IsFull) ] [\n Columns.columns [ Columns.IsVCentered ] [\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ p [] [ str \"Datumsbereich:\" ] ]\n Column.column [] [\n DateRangePicker.view\n \"Von/Bis Datumsbereich auswählen\"\n ((PeronosporaDataMsg.GraphDateRangeChanged >> PeronosporaData) >> dispatch)\n model.DateRangePicker\n ]\n Column.column [ Column.Width(Screen.All, Column.IsNarrow) ] [ Button.button buttonOptions [ str \"Laden\" ] ]\n ]\n ]\n\nlet private pageHeader (stationName: string) : ReactElement =\n Heading.h1 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ] [ str stationName ]\n\nlet private pageLayout stationName content =\n Container.container [ Container.isFullWidth ] [\n pageHeader stationName\n Columns.columns [ Columns.IsMultiline ] [\n Column.column [ Column.Width(Screen.All, Column.IsFull) ] [ Box.box' [] content ]\n ]\n ]\n\nlet private graphsView (graphData: PeronosporaGraph) =\n match graphData with\n | PeronosporaGraph.NoData -> [\n createFullColumn (boxStringSubtitle \"Es wurden keine Daten im ausgewählten Zeitraum gefunden\")\n ]\n | PeronosporaGraph.Data data -> graphs data\n\n\nlet pageView dispatch (model: DataModel) =\n let boxContent = [\n boxHeader\n dateRangePicker dispatch model\n yield! (Loadable.listView graphsView model.GraphData)\n ]\n\n pageLayout model.Station.Name boxContent\n\n\nlet view dispatch (model: Model) = Loadable.view (pageView dispatch) model","module Client.Forms.UserGroup\n\nopen Client.Components\nopen Client.DomainTypes.Msg\nopen Fable.React\nopen Fulma\nopen Shared.Dto.Page\nopen Shared.Dto.Page.GroupList\nopen Shared.Infrastructure\n\ntype Model = {\n Name: string option\n RequestRunning: bool\n}\n\ntype FormResult =\n | Noop\n | CreateUserGroup of CreateUserGroupRequest\n | CloseModal\n\nlet init = {\n Name = None\n RequestRunning = false\n}\n\nlet update (msg: UserGroupFormMsg) (model: Model) =\n match msg with\n | UserGroupFormMsg.NameChanged name -> { model with Name = name }, FormResult.Noop\n | UserGroupFormMsg.CloseModal -> model, FormResult.CloseModal\n | UserGroupFormMsg.CreateGroup request -> model, FormResult.CreateUserGroup request\n\n\nlet private tryCreateRequest (model: Model) : GroupList.CreateUserGroupRequest option =\n Option.map (fun name -> { Name = name }) model.Name\n\n\nlet private toMsg msg = msg |> UserGroupForm |> GroupList\n\nlet private form dispatch (model: Model) =\n form [] [\n Field.div [] [\n Label.label [] [ str \"Name\" ]\n Control.div [] [\n Input.text [\n model.Name |> Option.defaultValue \"\" |> Input.Value\n Input.OnChange(fun event ->\n event.Value\n |> String.toOption\n |> UserGroupFormMsg.NameChanged\n |> toMsg\n |> dispatch\n )\n ]\n ]\n ]\n ]\n\nlet private saveButton dispatch (model: Model) =\n let request = tryCreateRequest model\n\n Button.button [\n Button.IsLoading model.RequestRunning\n Button.Color Color.IsLink\n\n match request with\n | Some request -> SubmitButton.onClick (fun _ -> UserGroupFormMsg.CreateGroup request |> toMsg |> dispatch)\n | None -> Button.Disabled true\n ] [ str \"Speichern\" ]\n\n\nlet view dispatch (model: Model) =\n let closeModal = (fun _ -> UserGroupFormMsg.CloseModal |> toMsg |> dispatch)\n\n let headline = \"Benutzergruppe erstellen\"\n\n Modal.modal [ Modal.IsActive true ] [\n Modal.background [] []\n Modal.Card.card [] [\n Modal.Card.head [] [\n Modal.Card.title [] [ str headline ]\n Delete.delete [ Delete.OnClick closeModal ] []\n ]\n Modal.Card.body [] [ Content.content [] [ form dispatch model ] ]\n Modal.Card.foot [] [ saveButton dispatch model ]\n ]\n ]","module Client.Page.Admin.GroupList\n\nopen Client\nopen Client.Infrastructure.Api\nopen Client.Components\nopen Client.Domain\nopen Client.Infrastructure\nopen Client.DomainTypes.Msg\nopen Elmish\nopen Fable.React.Helpers\nopen Fable.React.Standard\nopen Fulma\nopen Shared.Dto.Dto\nopen Shared.Dto.Page.GroupList\nopen Thoth.Elmish\n\n\ntype DeletionData = {\n Group: GroupListingData\n DeletionRunning: bool\n}\n\ntype DataModel = {\n UserSession: UserSession\n Groups: GroupListingData list\n UserGroupModal: Forms.UserGroup.Model option\n DeleteModal: DeletionData option\n}\n\ntype Model = Loadable\n\nlet init (userSession: UserSession) =\n let request = {\n SessionKey = userSession.SessionKey\n Data = ()\n }\n\n let cmd =\n Cmd.OfAsync.perform api.getAllGroups request (GroupListMsg.GroupsReceived >> GroupList)\n\n Loadable.Loading userSession, cmd\n\nlet private userGroupCreated (response: AuthenticatedResponse) (model: DataModel) =\n match response with\n | Ok group ->\n let toast =\n Toast.create \"Die Benutzergruppe wurde erfolgreich erstellt\" |> Toast.success\n\n let groups = group :: model.Groups |> List.sortBy (fun grp -> grp.Name)\n\n Data {\n model with\n Groups = groups\n UserGroupModal = None\n },\n toast\n | _ ->\n let toast =\n Toast.create \"Beim Erstellen der Benutzergruppe trat ein Fehler auf\"\n |> Toast.error\n\n Data model, toast\n\nlet update msg model =\n match msg, model with\n | GroupListMsg.GroupsReceived response, Loading loadingModel ->\n match response with\n | Ok groups ->\n Data {\n UserSession = loadingModel\n Groups = groups\n UserGroupModal = None\n DeleteModal = None\n },\n Cmd.none\n | _ -> Error \"Fehler beim Laden der Benutzergruppen\", Cmd.none\n | GroupListMsg.OpenCreateGroupModal, Data dataModel ->\n Data { dataModel with UserGroupModal = Some Forms.UserGroup.init }, Cmd.none\n | GroupListMsg.OpenDeleteGroupModal data, Data dataModel ->\n let deletionModel = {\n Group = data\n DeletionRunning = false\n }\n\n Data { dataModel with DeleteModal = Some deletionModel }, Cmd.none\n | GroupListMsg.DeleteGroup data, Data dataModel ->\n let deletionModel =\n Option.map (fun deletionModel -> { deletionModel with DeletionRunning = true }) dataModel.DeleteModal\n\n let requestData: AuthenticatedRequest = {\n SessionKey = dataModel.UserSession.SessionKey\n Data = data.Id\n }\n\n Data { dataModel with DeleteModal = deletionModel },\n Cmd.OfAsync.perform api.deleteUserGroup requestData (GroupDeleted >> GroupList)\n | GroupListMsg.GroupDeleted result, Data dataModel ->\n match result with\n | Ok _ ->\n let toast =\n Toast.create \"Benutzergruppe wurde erfolgreich gelöscht\" |> Toast.success\n\n let model, cmds = init dataModel.UserSession\n\n model, Cmd.batch [ cmds; toast ]\n | _ ->\n let cmd =\n Toast.create \"Beim Löschen der Benutzergruppe ist ein Fehler aufgetreten\"\n |> Toast.error\n\n Data dataModel, cmd\n | GroupListMsg.CloseDeleteGroupModal, Data dataModel -> Data { dataModel with DeleteModal = None }, Cmd.none\n | GroupListMsg.UserGroupForm formMsg, Data dataModel ->\n let modalModel, cmd =\n match dataModel.UserGroupModal with\n | Some modal ->\n let newModel, result = Forms.UserGroup.update formMsg modal\n\n match result with\n | Forms.UserGroup.FormResult.Noop -> Some newModel, Cmd.none\n | Forms.UserGroup.CreateUserGroup requestData ->\n let request: AuthenticatedRequest = {\n SessionKey = dataModel.UserSession.SessionKey\n Data = requestData\n }\n\n let cmd =\n Cmd.OfAsync.perform api.createUserGroup request (GroupListMsg.UserGroupCreated >> GroupList)\n\n Some newModel, cmd\n | Forms.UserGroup.FormResult.CloseModal -> None, Cmd.none\n | None -> None, Cmd.none\n\n\n Data { dataModel with UserGroupModal = modalModel }, cmd\n | GroupListMsg.UserGroupCreated response, Data dataModel -> userGroupCreated response dataModel\n | _, _ -> model, Cmd.none\n\nlet private createNewGroupButton dispatch =\n Button.button [\n Button.Color IsLink\n Button.OnClick(fun _ -> dispatch (GroupList OpenCreateGroupModal))\n ] [ str \"Neue Gruppe erstellen\" ]\n\nlet private groupToRow dispatch (index: int) (group: GroupListingData) =\n tr [] [\n td [] [ Table.rowIndexString index ]\n td [] [ str group.Name ]\n td [] [ str (string group.MemberCount) ]\n td [] [ str (string group.SensorCount) ]\n td [] [\n Button.button [ Button.Disabled true ] [ str \"Bearbeiten\" ]\n ]\n td [] [\n Button.button [\n Button.Color IsDanger\n Button.OnClick(fun _ -> OpenDeleteGroupModal group |> GroupList |> dispatch)\n ] [ str \"Löschen\" ]\n ]\n ]\n\nlet private groupListToTable dispatch (users: GroupListingData list) =\n Table.table [\n Table.IsBordered\n Table.IsFullWidth\n Table.IsStriped\n ] [\n thead [] [\n tr [] [\n th [] [ str \"#\" ]\n th [] [ str \"Name\" ]\n th [] [ str \"Mitglieder\" ]\n th [] [ str \"Sensoren\" ]\n th [] []\n th [] []\n ]\n ]\n tbody [] (List.mapi (groupToRow dispatch) users)\n ]\n\nlet private tableHeader dispatch =\n Level.level [] [\n Level.left [] []\n Level.right [] [\n Level.item [] [\n Field.div [] [\n Control.div [] [ createNewGroupButton dispatch ]\n ]\n ]\n ]\n ]\n\nlet deleteUserGroupModalConfig dispatch (group: GroupListingData) : ConfirmationModal.Configuration =\n let text =\n sprintf \"Sollen die Benutzergruppe '%s' wirklich gelöscht werden?\" group.Name\n\n {\n Headline = \"Benutzergruppe löschen\"\n Text = text\n OnClose = (fun _ -> dispatch CloseDeleteGroupModal)\n OnYes = (fun _ -> dispatch (DeleteGroup group))\n OnNo = (fun _ -> dispatch CloseDeleteGroupModal)\n }\n\nlet dataView dispatch (model: DataModel) =\n let table = groupListToTable dispatch model.Groups\n\n [\n Container.container [ Container.IsFluid ] [\n Heading.h1 [] [ str \"Benutzer-Gruppen Liste\" ]\n tableHeader dispatch\n Table.scrollableTable table\n ]\n\n match model.UserGroupModal with\n | Some modal -> Forms.UserGroup.view dispatch modal\n | None -> ()\n\n match model.DeleteModal with\n | Some deletion ->\n let config = deleteUserGroupModalConfig (GroupList >> dispatch) deletion.Group\n\n ConfirmationModal.view deletion.DeletionRunning config\n | None -> ()\n ]\n\nlet view (dispatch: Msg -> unit) (model: Model) =\n Loadable.listView (dataView dispatch) model","namespace Elmish.React\n\nopen Fable.React\nopen Elmish\n\ntype LazyProps<'model> = {\n model:'model\n render:unit->ReactElement\n equal:'model->'model->bool\n}\n\nmodule Components =\n type LazyView<'model>(props) =\n inherit Component,obj>(props)\n\n override this.shouldComponentUpdate(nextProps, _nextState) =\n not <| this.props.equal this.props.model nextProps.model\n\n override this.render () =\n this.props.render ()\n\n[]\nmodule Common =\n /// Avoid rendering the view unless the model has changed.\n /// equal: function to compare the previous and the new states\n /// view: function to render the model\n /// state: new state to render\n let lazyViewWith (equal:'model->'model->bool)\n (view:'model->ReactElement)\n (state:'model) =\n ofType,_,_>\n { render = fun () -> view state\n equal = equal\n model = state }\n []\n\n /// Avoid rendering the view unless the model has changed.\n /// equal: function to compare the previous and the new states\n /// view: function to render the model using the dispatch\n /// state: new state to render\n /// dispatch: dispatch function\n let lazyView2With (equal:'model->'model->bool)\n (view:'model->'msg Dispatch->ReactElement)\n (state:'model)\n (dispatch:'msg Dispatch) =\n ofType,_,_>\n { render = fun () -> view state dispatch\n equal = equal\n model = state }\n []\n\n /// Avoid rendering the view unless the model has changed.\n /// equal: function to compare the previous and the new model (a tuple of two states)\n /// view: function to render the model using the dispatch\n /// state1: new state to render\n /// state2: new state to render\n /// dispatch: dispatch function\n let lazyView3With (equal:_->_->bool) (view:_->_->_->ReactElement) state1 state2 (dispatch:'msg Dispatch) =\n ofType,_,_>\n { render = fun () -> view state1 state2 dispatch\n equal = equal\n model = (state1,state2) }\n []\n\n /// Avoid rendering the view unless the model has changed.\n /// view: function of model to render the view\n let lazyView (view:'model->ReactElement) =\n lazyViewWith (=) view\n\n /// Avoid rendering the view unless the model has changed.\n /// view: function of two arguments to render the model using the dispatch\n let lazyView2 (view:'model->'msg Dispatch->ReactElement) =\n lazyView2With (=) view\n\n /// Avoid rendering the view unless the model has changed.\n /// view: function of three arguments to render the model using the dispatch\n let lazyView3 (view:_->_->_->ReactElement) =\n lazyView3With (=) view\n\n\n","(** Custom navigation\n------\nThis port of the Elm library is about treating the address bar as an input to your program.\nIt converts changes in the address bar into messages and provides functions for manipulation of the browser history.\n*)\nnamespace Elmish.Navigation\n\nopen Browser\nopen Browser.Types\nopen Elmish\n\n(**\n#### Parser\nA function to turn the string in the address bar into data that is easier for your app to handle.\n*)\ntype Parser<'a> = Location -> 'a\n\ntype Navigable<'msg> =\n | Change of Location\n | UserMsg of 'msg\n\n(**\n#### Direct history manipulation\n*)\n[]\nmodule Navigation =\n let [] internal NavigatedEvent = \"NavigatedEvent\"\n\n /// Modify current location\n let modifyUrl (newUrl:string):Cmd<_> =\n [fun _ -> history.replaceState((), \"\", newUrl)]\n\n /// Push new location into history and navigate there\n let newUrl (newUrl:string):Cmd<_> =\n [fun _ -> history.pushState((), \"\", newUrl)\n let ev = CustomEvent.Create(NavigatedEvent)\n window.dispatchEvent ev\n |> ignore ]\n\n /// Jump to some point in history (positve=forward, nagative=backward)\n let jump (n:int):Cmd<_> =\n [fun _ -> history.go n]\n\n\n(**\n#### Program extensions\nTreat user's program as a child component, by wrapping it and handling navigation events.\n*)\n[]\n[]\nmodule Program =\n\n module Internal =\n let mutable private onChangeRef : obj -> obj =\n fun _ ->\n failwith \"`onChangeRef` has not been initialized.\\nPlease make sure you used Elmish.Navigation.Program.Internal.subscribe\"\n\n let subscribe (dispatch:Dispatch<_ Navigable>) =\n let mutable lastLocation = None\n let onChange _ =\n match lastLocation with\n | Some href when href = window.location.href -> ()\n | _ ->\n lastLocation <- Some window.location.href\n Change window.location |> dispatch\n |> box\n\n onChangeRef <- onChange\n\n window.addEventListener(\"popstate\", unbox onChangeRef)\n window.addEventListener(\"hashchange\", unbox onChangeRef)\n window.addEventListener(Navigation.NavigatedEvent, unbox onChangeRef)\n\n let unsubscribe () =\n window.removeEventListener(\"popstate\", unbox onChangeRef)\n window.removeEventListener(\"hashchange\", unbox onChangeRef)\n window.removeEventListener(Navigation.NavigatedEvent, unbox onChangeRef)\n\n let toNavigableWith (parser : Parser<'a>)\n (urlUpdate : 'a->'model->('model * Cmd<'msg>))\n (program : Program<'a,'model,'msg,'view>)\n (onLocationChange : Dispatch> -> unit) =\n\n let map (model, cmd) =\n model, cmd |> Cmd.map UserMsg\n\n let update userUpdate msg model =\n match msg with\n | Change location ->\n urlUpdate (parser location) model\n | UserMsg userMsg ->\n userUpdate userMsg model\n |> map\n\n let subs userSubscribe model =\n Cmd.batch\n [ [ onLocationChange ]\n userSubscribe model |> Cmd.map UserMsg ]\n\n let init userInit () =\n userInit (parser window.location) |> map\n\n let setState userSetState model dispatch =\n userSetState model (UserMsg >> dispatch)\n\n let view userView model dispatch =\n userView model (UserMsg >> dispatch)\n \n program\n |> Program.map init update view setState subs\n\n /// Add the navigation to a program made with `mkProgram` or `mkSimple`.\n /// urlUpdate: similar to `update` function, but receives parsed url instead of message as an input.\n let toNavigable (parser : Parser<'a>)\n (urlUpdate : 'a->'model->('model * Cmd<'msg>))\n (program : Program<'a,'model,'msg,'view>) =\n\n Internal.toNavigableWith parser urlUpdate program Internal.subscribe\n","module Client.Navbar\n\nopen Fable.React\nopen Fable.React.Props\nopen Fulma\nopen Shared.Dto.User\n\nlet navLink text onClick =\n Navbar.Item.div [] [\n Button.a [ Button.OnClick onClick ] [ str text ]\n ]\n\nlet navBrand =\n Navbar.Brand.div [] [\n Navbar.Item.div [] [ img [ Src \"/mysens_logo.png\" ] ]\n ]\n\nlet leftNavigation (maybeUser: UserDto option) dispatch =\n let items = []\n\n Navbar.Start.div [] items\n\nlet rightNavigation (maybeUser: UserDto option) dispatch =\n let items = []\n\n Navbar.End.div [] items\n\nlet createMainNavbar (user: UserDto option) dispatch =\n Navbar.navbar [ Navbar.Color Color.IsLight ] [\n navBrand\n leftNavigation user dispatch\n rightNavigation user dispatch\n ]","module Client.Page.NotFound\n\nopen Fulma\nopen Fable.React\n\nlet view =\n Heading.h1 [\n Heading.Modifiers [\n Modifier.TextAlignment(Screen.All, TextAlignment.Centered)\n ]\n ] [ str \"Diese Seite existiert nicht\" ]","module Index\n\nopen Client\nopen Client.DomainTypes\nopen Client.Domain\nopen Client.Model\nopen Client.DomainTypes.Msg\nopen Client.Session\nopen Client.Page\nopen Client.Page.Admin\nopen Client.Page.User\nopen Fable.Core.JsInterop\nopen Elmish\nopen Fable.FontAwesome\nopen Fable.React\nopen Fulma\nopen Leaflet\nopen Client.Navbar\nopen Shared.Dto.Dto\nopen Shared.Dto.User\n\nimportAll \"flatpickr/dist/themes/material_green.css\"\nimportAll \"../../node_modules/leaflet/dist/leaflet.css\"\nicon?Default?imagePath <- \"//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/images/\"\n\nimportAll \"./Styles/main.css\"\nimportAll \"./Styles/map.css\"\nimportAll \"./Styles/graph.css\"\n\n\nlet private mapModel (modelMap: 'model -> PageModel) (subModel: 'model, cmd: Cmd) = modelMap subModel, cmd\n\nlet onlyLoggedIn route =\n onlyForLoggedInSession (Login.init route >> mapModel PageModel.Login)\n\n\nlet urlUpdate (maybeRoute: Route option) (model: Model) : Model * Cmd =\n let route = Option.defaultValue Route.NotFound maybeRoute\n\n let map (modelMap: 'model -> PageModel) (cmdMap: 'msg -> Msg) (subModel: 'model, subCmd: Cmd<'msg>) =\n modelMap subModel, Cmd.map cmdMap subCmd\n\n let onlyWithSession =\n initWithSession (PendingSession.init route |> PageModel.PendingSession, Cmd.none) model.Session\n\n let model, pageCmd =\n match route with\n | Route.Home ->\n onlyWithSession (onlyLoggedIn route (Home.init >> mapModel PageModel.Home))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.TtnSensorList ->\n onlyWithSession (onlyLoggedIn route (PhysicalSensorList.init >> mapModel PageModel.TtnSensorList))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MySensSensorList ->\n onlyWithSession (onlyLoggedIn route (MapSensorList.init >> mapModel PageModel.MySensSensorList))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.GatewayList ->\n onlyWithSession (onlyLoggedIn route (GatewayList.init >> mapModel PageModel.GatewayList))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.PublicMap ->\n onlyWithSession (fun _ -> PublicMap.init |> map PublicPage PublicMap)\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.SensorMap _ ->\n onlyWithSession (onlyLoggedIn route (SensorMap.init >> map PageModel.SensorPage Msg.Map))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.Login ->\n onlyWithSession (Login.init Route.Home >> mapModel Model.Login)\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.NotFound ->\n onlyWithSession (fun _ -> NotFound, Cmd.none)\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.PasswordLost ->\n onlyWithSession (fun _ -> PageModel.PasswordLost PasswordLost.init, Cmd.none)\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.ResetPassword token ->\n onlyWithSession (ResetPassword.init token >> mapModel Model.ResetPassword)\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MySettings ->\n onlyWithSession (onlyLoggedIn route (MySettings.init >> mapModel PageModel.MySettings))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.UserList ->\n onlyWithSession (onlyLoggedIn route (UserList.init >> mapModel PageModel.UserList))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.CalculationConfiguration ->\n onlyWithSession (\n onlyLoggedIn route (CalculationConfiguration.init >> mapModel PageModel.CalculationConfiguration)\n )\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MySensSensor id ->\n onlyWithSession (onlyLoggedIn route (MapSensorDataPage.init id >> mapModel PageModel.MapSensorData))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.AlertsList ->\n onlyWithSession (onlyLoggedIn route (AlertsList.init >> mapModel PageModel.AlertsList))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MyAlerts ->\n onlyWithSession (onlyLoggedIn route (MyAlerts.init >> mapModel PageModel.MyAlerts))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MySensorsData ->\n onlyWithSession (onlyLoggedIn route (Page.User.MySensorsData.init >> mapModel PageModel.MySensorsData))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MyMapSensors ->\n onlyWithSession (onlyLoggedIn route (Page.User.MyMapSensors.init >> mapModel PageModel.MyMapSensors))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.RimPro ->\n onlyWithSession (onlyLoggedIn route (Page.User.RimPro.init >> mapModel PageModel.RimPro))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MyGateways ->\n onlyWithSession (onlyLoggedIn route (Page.User.MyGateways.init >> mapModel PageModel.MyGateways))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MyScabStations ->\n onlyWithSession (onlyLoggedIn route (Page.User.MyScabStations.init >> mapModel PageModel.MyScabStations))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.ScabData stationId ->\n onlyWithSession (onlyLoggedIn route (Page.User.ScabData.init stationId >> mapModel PageModel.ScabData))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MyUserGroups ->\n onlyWithSession (onlyLoggedIn route (Page.User.MyUserGroups.init >> mapModel PageModel.MyUserGroups))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.UserDefinedMapSensorProperties id ->\n onlyWithSession (\n onlyLoggedIn\n route\n (Page.User.UserDefinedMapSensorProperties.init id\n >> mapModel PageModel.UserDefinedMapSensorSettings)\n )\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.MyPeronosporaStations ->\n onlyWithSession (\n onlyLoggedIn route (Page.User.MyPeronosporaStations.init >> mapModel PageModel.MyPeronosporaStations)\n )\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.PeronosporaData stationId ->\n onlyWithSession (\n onlyLoggedIn route (Page.User.PeronosporaData.init stationId >> mapModel PageModel.PeronosporaData)\n )\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n | Route.GroupList ->\n onlyWithSession (onlyLoggedIn route (GroupList.init >> mapModel PageModel.GroupList))\n |> (fun (pageModel, cmd) -> { model with Page = pageModel }, cmd)\n\n\n model, pageCmd\n\nlet heroView (user: UserDto option) (dispatch: Msg -> Unit) (content: ReactElement) =\n div [] [\n createMainNavbar user (Global >> dispatch)\n Hero.hero [ Hero.IsFullheightWithNavbar ] [\n content\n Hero.foot [] [ PageSkeleton.mySensFooter ]\n ]\n ]\n\nlet mapCmd (model: Model) (modelMap: 'model -> PageModel) (cmdMap: 'msg -> Msg) (subModel: 'model, subCmd: Cmd<'msg>) =\n let newModel = { model with Page = modelMap subModel }\n\n newModel, Cmd.map cmdMap subCmd\n\nlet toggleBurger (model: Model) = { model with IsBurgerOpen = not model.IsBurgerOpen }\n\nlet closeBurger (model: Model) = { model with IsBurgerOpen = false }\n\nlet update (msg: Msg) (model: Model) : Model * Cmd =\n let mapModel (modelMap: 'model -> PageModel) (subModel: 'model, cmd: Cmd) = modelMap subModel, cmd\n\n match (msg, model.Page) with\n | Global LogoutPressed, _ ->\n match model.Session with\n | Pending -> model, Cmd.none\n | Session userSession -> model, runLogout userSession |> Cmd.map Global\n | Global LoggedOut, _ ->\n let session = Anonymous\n\n Page.Login.init Route.Home session |> mapCmd model Model.Login id\n | Global(SessionReceived session), PendingSession(PendingSession.Loading route) ->\n urlUpdate (Some route) { model with Session = Session session }\n | Global(GoToRoute route), _ ->\n model\n |> closeBurger\n |> (fun model ->\n let additionalCommands = Routing.routeToAdditionalCommands route\n let navCmd = route |> Routing.routeToUrl |> Navigation.Navigation.newUrl\n\n model, Cmd.batch [ navCmd; additionalCommands ]\n )\n | Global ToggleBurger, _ -> toggleBurger model, Cmd.none\n | PublicMap pageMsg, PublicPage pageModel ->\n PublicMap.update pageMsg pageModel\n |> mapCmd model Model.PublicPage Msg.PublicMap\n | Map pageMsg, SensorPage pageModel -> SensorMap.update pageMsg pageModel |> mapCmd model Model.SensorPage Map\n | Login loginMsg, PageModel.Login loginModel ->\n let clientSession =\n match loginMsg with\n | LoginResult(Successful userSession) ->\n storeClientSessionId (sessionKeyToString userSession.SessionKey)\n\n Session(UserSession userSession)\n | _ -> model.Session\n\n Login.update loginMsg loginModel\n |> mapModel Model.Login\n |> fun (pageModel, cmd) ->\n {\n model with\n Page = pageModel\n Session = clientSession\n },\n cmd\n | Msg.Home dataMsg, PageModel.Home dataModel ->\n Page.Home.update dataMsg dataModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.Home pageModel }, cmd\n | TtnSensorList ttnMsg, PageModel.TtnSensorList listModel ->\n PhysicalSensorList.update ttnMsg listModel\n |> mapModel Model.TtnSensorList\n |> fun (pageModel, cmd) -> { model with Page = pageModel }, cmd\n | MapSensorList mySensMsg, PageModel.MySensSensorList listModel ->\n MapSensorList.update mySensMsg listModel\n |> mapModel Model.MySensSensorList\n |> fun (pageModel, cmd) -> { model with Page = pageModel }, cmd\n | GatewayList gatewayMsg, PageModel.GatewayList listModel ->\n GatewayList.update gatewayMsg listModel\n |> mapModel Model.GatewayList\n |> fun (pageModel, cmd) -> { model with Page = pageModel }, cmd\n | MySettings mySettingsMsg, PageModel.MySettings profileModel ->\n MySettings.update mySettingsMsg profileModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MySettings pageModel }, cmd\n | UserList userListMsg, PageModel.UserList userListModel ->\n UserList.update userListMsg userListModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.UserList pageModel }, cmd\n | PasswordLost lostMsg, PageModel.PasswordLost lostModel ->\n PasswordLost.update lostMsg lostModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.PasswordLost pageModel }, cmd\n | ResetPassword resetMsg, PageModel.ResetPassword resetModel ->\n ResetPassword.update resetMsg resetModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.ResetPassword pageModel }, cmd\n | CalculationConfiguration calcConfigurationMsg, PageModel.CalculationConfiguration calcConfigurationModel ->\n CalculationConfiguration.update calcConfigurationMsg calcConfigurationModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.CalculationConfiguration pageModel }, cmd\n | MapSensorData sensorMsg, PageModel.MapSensorData sensorModel ->\n MapSensorDataPage.update sensorMsg sensorModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MapSensorData pageModel }, cmd\n | AlertsList alertsMsg, PageModel.AlertsList alertsModel ->\n AlertsList.update alertsMsg alertsModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.AlertsList pageModel }, cmd\n | MyAlerts alertsMsg, PageModel.MyAlerts alertsModel ->\n MyAlerts.update alertsMsg alertsModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MyAlerts pageModel }, cmd\n | MySensorsData dataMsg, PageModel.MySensorsData dataModel ->\n MySensorsData.update dataMsg dataModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MySensorsData pageModel }, cmd\n | UserDefinedMapSensorProperties dataMsg, PageModel.UserDefinedMapSensorSettings dataModel ->\n UserDefinedMapSensorProperties.update dataMsg dataModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.UserDefinedMapSensorSettings pageModel }, cmd\n | Msg.MyMapSensors dataMsg, PageModel.MyMapSensors dataModel ->\n Page.User.MyMapSensors.update dataMsg dataModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MyMapSensors pageModel }, cmd\n | Msg.RimPro subMsg, PageModel.RimPro pageModel ->\n Page.User.RimPro.update subMsg pageModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.RimPro pageModel }, cmd\n | Msg.MyGateways subMsg, PageModel.MyGateways pageModel ->\n Page.User.MyGateways.update subMsg pageModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MyGateways pageModel }, cmd\n | Msg.ScabData subMsg, PageModel.ScabData pageModel ->\n Page.User.ScabData.update subMsg pageModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.ScabData pageModel }, cmd\n | Msg.MyScabStations subMsg, PageModel.MyScabStations pageModel ->\n Page.User.MyScabStations.update subMsg pageModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MyScabStations pageModel }, cmd\n | Msg.MyUserGroups subMsg, PageModel.MyUserGroups pageModel ->\n Page.User.MyUserGroups.update subMsg pageModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MyUserGroups pageModel }, cmd\n | Msg.MyPeronosporaStations subMsg, PageModel.MyPeronosporaStations pageModel ->\n Page.User.MyPeronosporaStations.update subMsg pageModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.MyPeronosporaStations pageModel }, cmd\n | Msg.PeronosporaData subMsg, PageModel.PeronosporaData pageModel ->\n Page.User.PeronosporaData.update subMsg pageModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.PeronosporaData pageModel }, cmd\n | Msg.GroupList subMsg, PageModel.GroupList pageModel ->\n Page.Admin.GroupList.update subMsg pageModel\n |> fun (pageModel, cmd) -> { model with Page = PageModel.GroupList pageModel }, cmd\n | _, _ -> model, Cmd.none\n\nlet view (model: Model) (dispatch: Msg -> unit) =\n let user () =\n model.Session |> getUserFromClientSession |> Option.get\n\n let pageSkeletonFactory content =\n PageSkeleton.skeleton (user ()) model.IsBurgerOpen dispatch content\n\n let pageSkeletonSingleElementFactory content = pageSkeletonFactory [ content ]\n\n match model.Page with\n | PublicPage pageModel -> PublicMap.view pageModel dispatch\n | SensorPage pageModel ->\n SensorMap.view pageModel dispatch\n |> PageSkeleton.skeletonWithoutContentWrapper (user ()) model.IsBurgerOpen dispatch\n | Model.Login pageModel ->\n Page.Login.view pageModel dispatch\n |> heroView (getUserFromClientSession model.Session) dispatch\n | NotFound -> Page.NotFound.view |> heroView (getUserFromClientSession model.Session) dispatch\n | PendingSession _ -> Loadable.loadingView (Some \"Warten auf Daten vom Server\") Fa.Fa8x\n | Model.TtnSensorList listModel -> PhysicalSensorList.view listModel dispatch |> pageSkeletonSingleElementFactory\n | Model.MySensSensorList listModel ->\n Page.Admin.MapSensorList.view listModel dispatch\n |> pageSkeletonSingleElementFactory\n | Model.Home model -> Page.Home.view model dispatch |> pageSkeletonSingleElementFactory\n | Model.MySettings profileModel ->\n MySettings.view (MySettings >> dispatch) profileModel\n |> pageSkeletonSingleElementFactory\n | Model.UserList userListModel -> UserList.view userListModel dispatch |> pageSkeletonSingleElementFactory\n | Model.PasswordLost lostModel -> Page.PasswordLost.view lostModel dispatch |> heroView None dispatch\n | Model.ResetPassword resetModel -> Page.ResetPassword.view resetModel dispatch |> heroView None dispatch\n | Model.GatewayList listModel ->\n Page.Admin.GatewayList.view listModel dispatch\n |> pageSkeletonSingleElementFactory\n | Model.CalculationConfiguration calcConfigurationModel ->\n Page.Admin.CalculationConfiguration.view (CalculationConfiguration >> dispatch) calcConfigurationModel\n |> pageSkeletonSingleElementFactory\n | Model.MapSensorData sensorModel -> MapSensorDataPage.view sensorModel dispatch |> pageSkeletonSingleElementFactory\n | Model.AlertsList alertsModel ->\n Page.Admin.AlertsList.view alertsModel dispatch\n |> pageSkeletonSingleElementFactory\n | Model.MyAlerts alertsModel -> Page.User.MyAlerts.view alertsModel dispatch |> pageSkeletonFactory\n | Model.MySensorsData dataModel ->\n Page.User.MySensorsData.view dataModel dispatch\n |> pageSkeletonSingleElementFactory\n | Model.UserDefinedMapSensorSettings dataModel ->\n Page.User.UserDefinedMapSensorProperties.view dataModel dispatch\n |> pageSkeletonSingleElementFactory\n | Model.MyMapSensors dataModel ->\n Page.User.MyMapSensors.view dispatch dataModel\n |> pageSkeletonSingleElementFactory\n | Model.RimPro pageModel -> Page.User.RimPro.view dispatch pageModel |> pageSkeletonFactory\n | Model.MyGateways pageModel -> Page.User.MyGateways.view pageModel |> pageSkeletonSingleElementFactory\n | Model.ScabData pageModel -> Page.User.ScabData.view dispatch pageModel |> pageSkeletonSingleElementFactory\n | Model.MyScabStations pageModel ->\n Page.User.MyScabStations.view dispatch pageModel\n |> pageSkeletonSingleElementFactory\n | Model.MyUserGroups pageModel -> Page.User.MyUserGroups.view pageModel |> pageSkeletonSingleElementFactory\n | Model.MyPeronosporaStations pageModel ->\n Page.User.MyPeronosporaStations.view dispatch pageModel\n |> pageSkeletonSingleElementFactory\n | Model.PeronosporaData pageModel ->\n Page.User.PeronosporaData.view dispatch pageModel\n |> pageSkeletonSingleElementFactory\n | Model.GroupList pageModel -> Page.Admin.GroupList.view dispatch pageModel |> pageSkeletonFactory","module App\n\nopen Client\nopen Client.Infrastructure.Api\nopen Client.DomainTypes\nopen Client.DomainTypes.Msg\nopen Client.Domain\nopen Client.Model\nopen Client.Page\nopen Elmish\nopen Elmish.HMR\nopen Index\nopen Client.Session\nopen Shared.Dto.Dto\nopen Thoth.Elmish\n\n#if DEBUG\nopen Elmish.Debug\n#endif\n\nlet init (initialRoute: Option) : Model * Cmd =\n let route = initialRoute |> Option.defaultValue Route.Home\n\n let sessionCmd =\n Cmd.OfAsync.either\n api.getSession\n (loadClientSessionId () |> Option.map SessionKey)\n SessionReceived\n LoadingSessionFailed\n |> Cmd.map Global\n\n {\n Session = ClientSession.Pending\n IsBurgerOpen = false\n Page = PageModel.PendingSession(PendingSession.init route)\n },\n sessionCmd\n\n\nProgram.mkProgram init update view\n#if DEBUG\n|> Program.withConsoleTrace\n#endif\n|> Program.toNavigable (UrlParser.parsePath Routing.parseRoute) urlUpdate\n|> Toast.Program.withToast Toast.renderToastWithFulma\n|> Program.withReactSynchronous \"elmish-app\"\n#if DEBUG\n|> Program.withDebugger\n#endif\n|> Program.run","namespace Elmish.React\n\n[]\nmodule Helpers =\n open Fable.React.Props\n open Fable.Core.JsInterop\n\n /// `Ref` callback that sets the value of an input textbox after DOM element is created.\n /// Can be used instead of `DefaultValue` and `Value` props to override input box value.\n let inline valueOrDefault value =\n Ref <| (fun e -> if e |> isNull |> not && !!e?value <> !!value then e?value <- !!value)\n\n[]\nmodule Program =\n\n module Internal =\n\n open Fable.React\n open Browser\n open Elmish\n\n let withReactBatchedUsing lazyView2With placeholderId (program:Program<_,_,_,_>) =\n let mutable lastRequest = None\n let setState model dispatch =\n match lastRequest with\n | Some r -> window.cancelAnimationFrame r\n | _ -> ()\n\n lastRequest <- Some (window.requestAnimationFrame (fun _ ->\n ReactDom.render(\n lazyView2With (fun x y -> obj.ReferenceEquals(x,y)) (Program.view program) model dispatch,\n document.getElementById placeholderId\n )))\n\n program\n |> Program.withSetState setState\n\n let withReactSynchronousUsing lazyView2With placeholderId (program:Elmish.Program<_,_,_,_>) =\n let setState model dispatch =\n ReactDom.render(\n lazyView2With (fun x y -> obj.ReferenceEquals(x,y)) (Program.view program) model dispatch,\n document.getElementById placeholderId\n )\n\n program\n |> Program.withSetState setState\n\n let withReactHydrateUsing lazyView2With placeholderId (program:Elmish.Program<_,_,_,_>) =\n let setState model dispatch =\n ReactDom.hydrate(\n lazyView2With (fun x y -> obj.ReferenceEquals(x,y)) (Program.view program) model dispatch,\n document.getElementById placeholderId\n )\n\n program\n |> Program.withSetState setState\n\n\n /// Renders React root component inside html element identified by placeholderId.\n /// Uses `requestAnimationFrame` to batch updates to prevent drops in frame rate.\n /// NOTE: This may have unexpected effects in React controlled inputs, see https://github.com/elmish/react/issues/12\n let withReactBatched placeholderId (program:Elmish.Program<_,_,_,_>) =\n Internal.withReactBatchedUsing lazyView2With placeholderId program\n\n /// Renders React root component inside html element identified by placeholderId.\n /// New renders are triggered immediately after an update.\n let withReactSynchronous placeholderId (program:Elmish.Program<_,_,_,_>) =\n Internal.withReactSynchronousUsing lazyView2With placeholderId program\n\n []\n let withReact placeholderId (program:Elmish.Program<_,_,_,_>) =\n Internal.withReactBatchedUsing lazyView2With placeholderId program\n\n []\n let withReactUnoptimized placeholderId (program:Elmish.Program<_,_,_,_>) =\n Internal.withReactSynchronousUsing lazyView2With placeholderId program\n\n /// Renders React root component inside html element identified by placeholderId using `React.hydrate`.\n let withReactHydrate placeholderId (program:Elmish.Program<_,_,_,_>) =\n Internal.withReactHydrateUsing lazyView2With placeholderId program\n","namespace Client.Domain\n\nopen Leaflet\nopen Shared.Dto\n\n[]\nmodule Location =\n let toLatLngExpression (location: Location) : LatLngExpression =\n LatLngExpression.Case3(location.Latitude, location.Longitude)"],"names":["x","Array","isArray","ArrayBuffer","isView","isHashable","GetHashCode","Dispose","sameConstructor","y","_a","_b","Object","getPrototypeOf","constructor","Enumerator","iter","this","current","cur","next","value","done","Error","o","GetEnumerator","Symbol","iterator","en","hasNext","undefined","Lazy","factory","isValueCreated","Value","createdValue","IsValueCreated","i","length","str","toString","date","date1","offset","kind","getTimezoneOffset","int32ToString","radix","ObjectRef","static","idMap","has","set","count","get","stringHash","s","h","len","charCodeAt","numberHash","combineHashCodes","hashes","reduce","h1","h2","arrayHash","Date","getTime","dateHash","values","map","v","id","equalArraysWith","eq","Equals","isEquatable","xKeys","keys","yKeys","sort","equalObjects","xtime","ytime","compareArrays","comp","j","compareArraysWith","CompareTo","isComparable","key","compareObjects","max","comparer","createObj","fields","obj","kv","round","digits","m","Math","pow","n","toFixed","floor","f","r","WeakMap","CURRIED","arity","uncurried","args","res","_curry","arg","concat","Some","toJSON","String","other","flatten","opt","defaultValue","mapping","map2","opt1","opt2","map3","opt3","binder","callStack","self","seqToString","cons","entries","k","join","name","cases","tag","fieldStr","withParens","indexOf","unionToString","splice","recordToJSON","recordToString","recordGetHashCode","thisNames","recordEquals","result","recordCompareTo","contentsOrGetter","setter","getter","contents","Exception","message","ensureErrorOrException","e","NumberStyles","getRange","unsigned","bitsize","isValid","style","exec","replace","prefix","AllowHexSpecifier","getRadix","invalidDigits","getInvalidDigits","test","regexMatch","sign","validResponse","Number","parseInt","isNaN","umin","umax","min","defValue","symbol","isNumeric","multiply","dp","toPrecision","sd","toExponential","toHex","wasm","WebAssembly","Instance","Module","Uint8Array","exports","Long","low","high","isLong","prototype","substr","bytes","le","fromBytesLE","fromBytesBE","fromBytes","$this","hi","lo","toBytesLE","toBytesBE","__isLong__","defineProperty","INT_CACHE","UINT_CACHE","cachedObj","cache","UZERO","ZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","MIN_VALUE","MAX_VALUE","negate","TWO_PWR_32_DBL","lowBits","highBits","pow_dbl","fromString","RangeError","p","substring","radixToPower","size","add","val","TWO_PWR_16_DBL","TWO_PWR_24","ONE","UONE","NEG_ONE","isZero","isNegative","radixLong","div","divide","rem1","subtract","rem","remDiv","isOdd","lessThan","greaterThan","greaterThanOrEqual","thisNeg","otherNeg","not","addend","a48","a32","a16","a00","b48","b32","b16","c48","c32","c16","c00","subtrahend","multiplier","mul","get_high","b00","divisor","approx","div_u","div_s","toUnsigned","numBits","shiftRightUnsigned","shiftLeft","shiftRight","log2","ceil","log","LN2","delta","approxRes","approxRem","op_UnaryNegation","xh","_bitsize","lessOrEqual","padStart","maxValue","getMaxValue","toUpperCase","isMinus","minutes","abs","dateToHalfUTCString","half","toISOString","dateToStringWithCustomFormat","format","utc","match","rep","NaN","getUTCFullYear","getFullYear","getUTCMonth","getMonth","getUTCDate","getDate","getUTCHours","getHours","getUTCMinutes","getMinutes","getUTCSeconds","getSeconds","getUTCMilliseconds","getMilliseconds","_provider","_c","d","dateWithOffset","dateToISOStringWithOffset","dateToStringWithOffset","toUTCString","toLocaleString","toLocaleDateString","toLocaleTimeString","printOffset","dateToISOString","dateToStringWithKind","DateTime","parseRaw","input","fail","trim","baseDate","timeInSeconds","timeParts","split","parseFloat","offsetInMinutes","detectUTC","_err","year","month","day","ms","dateValue","UTC","setFullYear","now","hour","millisecond","minute","second","dayOfWeek","getUTCDay","getDay","dayOfYear","_year","_month","_day","ts","newDate","oldTzOffset","newTzOffset","addMinutes","that","matches","reg","startAt","global","lastIndex","lastMatchIndex","index","push","fsFormatRegExp","interpolateRegExp","formatRegExp","isLessThan","cont","fsFormat","continuePrint","formatReplacement","flags","padLength","precision","toLowerCase","zeroFlag","minusFlag","ch","pad","createPrinter","_strParts","_matches","_result","padArg","strParts","slice","_padLength","strIdx","matchIndex","shift","_","idx","pattern","padLeft","intPart","decimalPart","repInt","repDecimal","rightZeros","padRight","thousandGroups","thousands","endsWith","search","lastIndexOf","delimiter","xs","from","fromBase64String","b64Encoded","binary","atob","notSupported","isRight","splitters","options","removeEmpty","filter","splits","RegExp","findSplits","candidate","startIndex","Helpers_allocateArrayFromCons","indexNotFound","target","targetIndex","start","fill","mapIndexed","source","arrays","arrays_1","totalIdx","totalLength","idx_1","arr_2","initializer","take","array","predicate","find","folder","state","zip","array1","array2","differentLengths","equals","length1","length2","head","tail","super","xs_1_mut","ys_1_mut","loop","xs_1","ys_1","matchValue","xt","yt","i_mut","h_mut","t","_key","c","ListEnumerator$1","it","__","FSharpList_get_Empty","FSharpList_Cons_305B8EAC","FSharpList__get_IsEmpty","FSharpList__get_Length","FSharpList__get_Head","FSharpList__get_Tail","xs_mut","tryLast","acc","action","unitVar","tail_1","lists","root","node","forEach","enumerator","xs_6","t_2","ys","zs","xs_3","acc_mut","FSharpList__get_Item_Z524259A4","arr","Compare","projection","setPrototypeOf","Trampoline","callCount","maxTrampolineCallCount","incrementAndCheck","hijack","setTimeout","ctx","cancelToken","isCancelled","onCancel","trampoline","err","onError","Bind","computation","onSuccess","Combine","computation1","computation2","Delay","generator","For","sequence","body","While","Return","ReturnFrom","TryFinally","compensation","TryWith","catchHandler","ex","Using","resource","guard","Zero","FSharpChoice$2","emptyContinuation","_x","defaultCancellationToken","cancelled","_id","_cancelled","_listeners","Map","cancel","listener","addListener","removeListener","delete","register","$","work","Choice_makeChoice1Of2","startImmediate","cancellationToken","continuation","exceptionContinuation","cancellationContinuation","startWithContinuations","delegates","Add","_addHandler","Publish","Trigger","senderOrValue","valueOrUndefined","sender","AddHandler","handler","RemoveHandler","_removeHandler","Subscribe","callback","OnNext","onNext","onCompleted","OnError","_e","OnCompleted","interval","returnVal","_enabled","_isDisposed","_intervalId","_timeoutId","Interval","AutoReset","_elapsed","Elapsed","Enabled","setInterval","clearTimeout","clearInterval","Close","Start","Stop","dispatch","cmd","call","g","cmds","msg","task","ofSuccess","ofError","_arg1","dateTime","time","days","months","newMonth","newMonth_","yearOffset","newYear","_daysInMonth","currentTime","dt","years","range","Id","todayRange","thisWeekRange","thisMonthRange","thisYearRange","yesterdayRange","lastWeekRange","lastMonthRange","lastYearRange","response","errorMsg","reponseText","CaseInfo","declaringType","TypeInfo","fullname","generics","construct","parent","enumCases","fullName","getHashCode","getGenerics","t1","t2","getRecordElements","k1","v1","k2","v2","caseNames","argType","returnType","generic","info","elemType","getElementType","isGenericType","isEnum","getGenericTypeDefinition","getEnumUnderlyingType","getEnumValues","parseEnum","getEnumCase","getUnionCases","getTupleElements","isTuple","getFunctionElements","isFunction","gen","isUnion","isRecord","startsWith","getUnionFields","case_","getUnionCaseFields","uci","getRecordField","field","makeUnion","expectedLength","makeRecord","_t","assertUnion","Enumerator_notStarted","Enumerator_alreadyFinished","Enumerator_Seq","Enumerator_FromFunctions$1","dispose","Enumerator_noReset","Enumerator_FromFunctions$1_$ctor_58C54629","Enumerator_generateWhileSome","openf","compute","closef","curr","started","x_1","finish","matchValue_1","mkSeq","Enumerator_Seq_$ctor_673A07F2","argName","Operators_NullArg","sources","outerOpt","innerOpt","finished","inner","outer","copyOfStruct","inner_1","outer_1","Enumerator_concat","ar","xs_5","generate","create","generateIndexed","chooser","e_1","found","reverse","Enumerator_enumerateThenFinally","dashify","separator","charAt","caseRule","definedCaseRule","kvPair","assign","changeCase","dict","pairs","this$","hashMap","pair","Dictionary__Add_5BDDA1","toStringTag","item","Dictionary__Clear","Dictionary__TryFind_2B595","pattern_matching_result","arrayIndex","Dictionary__get_Count","Dictionary__Remove_2B595","Dictionary__ContainsKey_2B595","Dictionary__get_Item_2B595","Dictionary__set_Item_5BDDA1","clear","thisArg","Dictionary__TryFindIndex_2B595","outArg","findIndex","typeDef","patternInput","flattenFuncTypes","l","unitVar0","resolvedType","typeInfoCache","ti","activePatternResult6082","primType","activePatternResult6085","types","createTypeInfo","lazyToDelayed","activePatternResult6086","activePatternResult6087","prop","activePatternResult6088","activePatternResult6089","activePatternResult6090","activePatternResult6091","activePatternResult6092","activePatternResult6093","activePatternResult6094","activePatternResult6095","activePatternResult6096","activePatternResult6097","genArgs","keyType","valueType","activePatternResult6098","activePatternResult6099","activePatternResult6100","activePatternResult6101","_createTypeInfo","case","data","content","fileName","mimeType","binaryData","blob","dataUrl","anchor","url","headers","req","withCredentials","preparation","resultMapper","token","request","tupledArg","xhr","XMLHttpRequest","Url","cancellationTokenRegistration","forLoopVar","WithCredentials","readyState","RequestBody","Parsimmon","seed","times","elem","a","isParser","isBuffer","Buffer","makeSuccess","status","furthest","expected","makeFailure","mergeReplies","last","hasOwnProperty","union","makeLineColumnIndex","line","column","lines","assertParser","assertNumber","assertRegexp","assertFunction","assertString","repeat","string","amount","leftPad","char","rangeFromIndexAndOffsets","before","after","to","formatGot","error","lineWithErrorIndex","lineRange","lastLineNumberLabelLength","verticalMarkerLength","byteLineWithErrorIndex","columnByteIndex","byteRange","bytesPerLine","bytesAfter","bytesInChunks","chunkSize","chunks","chunkIndex","toChunks","byteLines","byteRow","byteValue","byteRangeToRange","byteLine","inputLines","lineWithErrorCurrentIndex","linesWithLineNumbers","lineSource","lineNumberLabel","isLineWithError","re","anchoredRegexp","parsers","arguments","numParsers","accum","seqMap","mapper","pop","apply","results","alt","sepBy1","parser","then","many","rs","regexp","group","anchored","fullMatch","groupMatch","parse","skip","tryParse","formatError","type","or","alternative","wrap","leftParser","rightParser","left","middle","thru","wrapper","tieWith","assertArray","tie","prevResult","atMost","atLeast","init","rest","fn","contramap","promap","mark","end","sepBy","lookahead","notFollowedBy","text","desc","reply","fallback","ap","chain","empty","of","digit","optWhitespace","cr","lf","newline","others","right","skipped","ps","strings","MapTreeLeaf$2","MapTreeLeaf$2_$ctor_5BDDA1","MapTreeLeaf$2__get_Key","MapTreeLeaf$2__get_Value","MapTreeNode$2","MapTreeNode$2_$ctor_499A11FD","MapTreeNode$2__get_Left","MapTreeNode$2__get_Right","MapTreeNode$2__get_Height","MapTreeModule_sizeAux","m_mut","m2","MapTreeModule_size","MapTreeModule_mk","hl","hr","m2_1","m_2","MapTreeModule_rebalance","m2_2","m_3","m2_3","t1h","t2h","matchValue_2","matchValue_3","MapTreeModule_add","MapTreeModule_empty","MapTreeModule_tryFind","comparer_mut","k_mut","MapTreeModule_iterOpt","f_mut","MapTreeModule_iter","MapTreeModule_mapiOpt","l2","r2","MapTreeModule_mapi","MapTreeModule_copyToArray","MapTreeModule_ofSeq","MapTreeModule_ofArray","MapTreeModule_ofList","ie","e_mut","MapTreeModule_mkFromEnumerator","MapTreeModule_MapIterator$2","stack","MapTreeModule_collapseLHS","stack_mut","MapTreeModule_mkIterator","MapTreeModule_current","MapTreeModule_alreadyFinished","MapTreeModule_notStarted","MapTreeModule_mkIEnumerator","MapTreeModule_moveNext","FSharpMap","tree","combineHash","activePatternResult","FSharpMap__ComputeHashCode","e1","e2","m1","e1c","e2c","b1","b2","kvp1","kvp2","FSharpMap__ContainsKey","FSharpMap__get_Item","FSharpMap__get_Count","_arg","FSharpMap_$ctor","FSharpMap_Create","MapTreeModule_find","MapTreeModule_mem","table","FSharpMap__Add","FSharpMap__TryFind","containsKey","elements","m_1_mut","m_1","MapTreeModule_toList","MapTreeModule_toArray","jint","arg0","jfloat","negJint","escape","anyCharSnippet","otherParser","tuple","withWhitespace","jnull","jbool","jnumber","stringLiteral","jvalue","comma","P","cmp","_this","MAX_DP","NAME","INVALID","INVALID_DP","DIV_BY_ZERO","UNDEFINED","NUMERIC","nl","Big","DP","RM","rm","more","xc","xci","unshift","stringify","doExponential","isNonzero","isneg","yc","b","bl","bt","ri","bz","ai","al","rl","q","qc","qi","gt","gte","lt","lte","minus","sub","xlty","plus","xe","ye","mod","ygtx","one","prec","sqrt","NE","PE","toNumber","strict","valueOf","_Big_","normalize","TypeError","BigNat","bound","BigNatModule_FFT_pow32","x_mut","n_mut","BigNatModule_bound","BigNatModule_coeff","BigNatModule_coeff64","BigNatModule_setCoeff","BigNatModule_pow64","BigNatModule_pow32","BigNatModule_FFT_maxTwoPower","Int32Array","BigNatModule_baseBits","BigNatModule_baseN","BigNatModule_baseNi64","BigNatModule_baseMaski64","BigNatModule_divbase","BigNatModule_modbase","BigNatModule_createN","BigNatModule_normN","na_mut","na","findLeastBound","BigNatModule_embed","r_1","BigNatModule_eval32","BigNatModule_one","BigNatModule_zero","BigNatModule_degree","rbound","c_mut","p_mut","q_mut","r_mut","z","i_1","z_1","i_2","BigNatModule_addP","BigNatModule_lt","pa_mut","qa_mut","pa","qa","check","BigNatModule_compare","BigNatModule_mulSchoolBookCarry","rak","BigNatModule_mulSchoolBookOneSmall","bp","q_1","BigNatModule_encoding","bigL","twoToBigL","bigK","bigN","BigNatModule_mkEncoding","BigNatModule_table","pSmall","qSmall","BigNatModule_mulSchoolBookBothSmall","ra","pai","qaj","BigNatModule_mulSchoolBookNeitherSmall","BigNatModule_mulSchoolBook","BigNatModule_scaleSubInPlace","patternInput_1","ad","a_1","f_1","zLo","zHi","BigNatModule_scaleAddInPlace","BigNatModule_removeFactor","degx","dega","xa","aa","pn","qn","qai","BigNatModule_shiftCompare","copy","BigNatModule_copyN","Invariant","BigNatModule_toFloat","evalFloat","BigNatModule_ofInt32","BigNatModule_ofInt64","rem_u","rem_s","BigNatModule_embed64","BigNatModule_toString","degn","collect","isLeading_mut","digits_mut","n_1_mut","_arg_mut","isLeading","n_1","n_2","prior_1","nL","nH","digits_4","prior_mut","ten2k_mut","prior","ten2k","route","BigNatModule_ofString","ten","build","BigNatModule_getSmall","signInt","BigInteger__get_SignInt","BigInteger__get_V","BigNatModule_hash","nn","BigInteger_$ctor_Z2BE94A1","BigInteger_nat_Z67CCE57D","smallLim","smallPosTab","BigInteger_posn_Z67CCE57D","BigNatModule_equal","zero","text_1","toDecimal","BigInteger__get_ToDecimal","number","arg10","arg20","jsObject","jsonValue","activePatternResult6798","activePatternResult6799","activePatternResult6800","activePatternResult6802","parseNative'","activePatternResult6803","object","two","ok","Uri","uri","URL","isAbsoluteUri","original","baseUri","relativeUri","kindOrUri","tryCreateWithKind","tryCreateWithBase","tryCreateImpl","out","decodeURIComponent","asUrl","absoluteUri","href","scheme","protocol","host","absolutePath","pathname","query","pathAndQuery","fragment","hash","originalString","DateTimeOffset","checkOffsetInRange","offsetMatch","fromDayNumber","dayNumber","ticks","Long_op_Multiply","Long_toNumber","Long_op_Division","guidRegex","guidRegexNoHyphen","guidRegexHex","hyphenateGuid","wsTrimAndLowered","chars","newGuid","random","littleEndian","getBytesInt32","DataView","buffer","byteOffset","byteLength","setInt32","view","getInt32","SetTreeLeaf$1","SetTreeLeaf$1_$ctor_2B595","SetTreeLeaf$1__get_Key","SetTreeNode$1","SetTreeNode$1_$ctor_Z6E7BE5F7","SetTreeNode$1__get_Left","SetTreeNode$1__get_Right","SetTreeNode$1__get_Height","SetTreeModule_countAux","t_mut","SetTreeModule_count","SetTreeModule_mk","t2_1","SetTreeModule_rebalance","t2_3","t_3","t2_4","t2_2","SetTreeModule_add","c_1","SetTreeModule_empty","SetTreeModule_mem","SetTreeModule_iter","SetTreeModule_SetIterator$1","SetTreeModule_collapseLHS","x2","SetTreeModule_mkIterator","SetTreeModule_current","SetTreeModule_alreadyFinished","SetTreeModule_notStarted","SetTreeModule_mkIEnumerator","SetTreeModule_moveNext","SetTreeModule_compare","l1_mut","l2_mut","SetTreeModule_compareStacks","l1","x1_3","x2_3","t1_6","x1_4","t2_6","x2_4","matchValue_4","pattern_matching_result_1","t1_7","x1_5","t2_7","x2_5","c_3","c_2","matchValue_5","pattern_matching_result_2","t1_8","x1_6","t2_8","x2_6","pattern_matching_result_3","t1_2","x1","x2_1","pattern_matching_result_4","t1_4","x1_2","x2_2","SetTreeModule_copyToArray","SetTreeModule_ofSeq","SetTreeModule_ofArray","SetTreeModule_ofList","SetTreeModule_mkFromEnumerator","FSharpSet","FSharpSet__ComputeHashCode","FSharpSet__get_Comparer","FSharpSet__get_Tree","FSharpSet__get_Count","FSharpSet__Contains","FSharpSet_$ctor","set$","items","HashSet__Add_2B595","HashSet__Clear","HashSet__Contains_2B595","HashSet__get_Count","HashSet__Remove_2B595","HashSet__TryFindIndex_2B595","v_1","signedRound","fromDays","fromSeconds","firstDot","firstColon","window","document","json","activePatternResult6914","activePatternResult6909","activePatternResult6915","activePatternResult6911","leftMap","rightMap","linkedList","foundCase","testExpr","typeInfo","getlElemType","getElemType","genericJson","getTypes","optionalTypeDelayed","caseName","getFields","serializedRecord","caseValue","elementTypeDelayed","tupleTypesDelayed","tuples","getType","underlyingType","originalType","insideBrowser","unionType","activePatternResult7001","CaseTypes","arg30","expectedCases","_arg2","caseInfo","caseType","foundDiscriminatorKey","keyword","discriminatorValueJson","discriminatorValue","foundUnionCase","unexpectedJson","expectedType","caseIndex","fieldValues","_arg3","caseTypes","_arg4","_arg5","otherwise","_arg6","_arg7","foundCaseName","elementType","recordType","list","clo1","fieldType","fieldName","_arg8","dictKeys","recordFields","keyValuePair","output","hashset","inputJson","inputText","escapable","meta","Long_fromNumber","PropertyInfo","FieldType","FieldName","element","usedCase","enumUnion","serializedFields","serializedValues","serializedKey","serializedValue","isPrimitive","tupleTypes","typeName","func","funcArgs","argumentCount","returnTypeAsync","binaryInput","baseUrl","trimEnd","RouteBuilder","BaseUrl","funcNeedParameters","contentType","inputArgumentTypes","CustomHeaders","Authorization","executeRequest","onOk","CustomResponseSerialization","serializer","typ","requestBody","sendAndRead","statusCode","responseAsBlob","Blob","reader","responseText","parsedJson","arg1","arg2","arg3","arg4","arg5","arg6","arg7","inputArguments","package","user","FirstName","LastName","sensorType","sensor","Name","DeviceEui","AppEui","AppKey","sensorModelToString","wetness","longitude","latitude","long","lat","Mail","LastLogin","alertType","thresholdType","schemaType","fieldTypes","delegateArg0","delegateArg1","delegateArg2","delegateArg3","delegateArg4","delegateArg5","delegateArg6","delegateArg7","methodName","clientSession","userSession","User","integralRangeStep","step","stop","stepFn","stepComparedWithZero","stepGreaterThanZero","comparedWithLast","makeRangeStepFunction","st_1","Enumerator_unfold","rangeDouble","wix","rix","rix'","mapInit","mapUpdate","mapView","mapSetState","mapSubscribe","program","update","setState","subscribe","model","rb","reentered","syncDispatch","wix'","ix","nextMsg","model'","title","builder","delay","detail","Message","Title","Icon","Position","DismissOnClick","WithCloseButton","event","CustomEvent","triggerEvent","classPosition","render","toasts","props","children","arg00","containerClass","Status","closeButton","layout","icon","Toasts_BL","Toasts_BC","Toasts_BR","Toasts_TL","Toasts_TC","Toasts_TR","notification","promise","Promise","er","reject","catch","screen","level","baseClass","baseProps","cl","modifiers","option","display","direction","cls","el","parseOptions","opts","faOptions","baseElement","std","booleans","complete","Size","Border","Pull","Rotation","Flip","CustomClass","StackSize","FixedWidth","IsLi","HavePulse","HaveSpin","IsInverse","Props","Classes","className","suffix","ofOffset","color","onClick","txt","iconView","Screen","pos","inputRecord","code","toast","maybeItem","btnView","fieldView","controlView","ofType","valueOrDefault","Prop","maybeString","session","maybeRequestData","mail","password","Password","RequestRunning","requestData","LoginMsg","buttonOptions","onClickPreventDefault","goToRouteMsg","visited","unvisited","tipe","stringToSomething","subValue","``arg10@``","segment","parseBefore","parseAfter","isBurgerOpen","navbarProps","Role","adminMenu","navbarStart","mySensFooter","centeredHeading","maybeText","spinner","loadable","classes","Online","TotalCount","sensorsDeviceRow","Sensors","gatewayDeviceRow","Gateways","oldPassword","newPassword","newPasswordRepeated","OldPassword","NewPassword","NewPasswordRepeated","headingContent","label","tab","openTab","MySettingsMsg","OpenTab","Profile","packages","getPackageLabel","bookedPackagesBox","ChangePasswordModel","passwordBox","getFirstName","getLastName","getMail","userTypeToString","profileBox","limit","totalMinutes","getTotalMinutesLimit","getSensorDataDate","latLong","popupContent","isOldAgeData","getIconNameByMapSensorData","iconOptions","rssi","strength","file","moisture","severity","windSpeed","category","ph","SoilPh","intensity","singleString","multipleString","timespan","countToString","toHumanReadable","createElapsedTime","todayColumnContent","labelColumn","Label","SubLabel","popupSecondColCls","aggregatedValues","rows","createAggregatedValueRow","minValue","datedTemperatureString","datedPercentageString","sensorName","css","getSensorNameLinkColor","Data","createDetailsSensorNameLink","toolTip","src","signalStrength","fromRssi","leafletWetness","airData","LeafletWetness","weatherStationSensorData","leafletMoisture","moistureData","LeafletMoisture","rainIntensity","sensorData","averageWindSpeed","soilPh","soilMoisture","radiationIntensity","solarRadiation","leftContent","createPopupSymbol","signalStrengthCls","getBatteryLevel","leafletWetnessTooltipText","rightContent","leafletWetnessCls","rainIntensityCls","wideIconCls","timeElapsed","timeElapsedToolTip","currentWind","wind","popupDataRow","compassDirectionToLabel","degree","WindDirection","valIdx","WindSpeed","makeMarkerPopupHeader","makeMarkerSymbolRow","noPublicSensorDataPopup","popupUpdateRow","AirTemperature","AirHumidity","HumidTemperature","DewPoint","aggregatedValuesDailyPopup","createAggregatedMinMaxTemperaturePopup","MinAirTemperature","MaxAirTemperature","airDataToPopup","GroundHumidity","GroundTemperature","conductivity","SoilConductivity","createAggregatedMinMaxHumidityPopup","MinGroundHumidity","MaxGroundHumidity","groundDataToPopup","maybeRainFallToString","rainFallToString","CurrentRainFall","RainFallLastHour","RainFallLast24h","rainFallDataToPopup","LeafletTemperature","leafletMoistureDataToPopup","SoilTemperature","soilPhDataToPopup","AverageWindSpeed","averageWindSpeedDataToPopup","MinTemperature","MaxTemperature","MaxWindSpeed","maybeAverageWindSpeed","createCurrentWindRow","CurrentWind","weatherStationDataToPopup","liquidLevelToString","LiquidLevel","liquidLevelDataToPopup","solarRadiationToString","SolarRadiation","solarRadiationDataToPopup","noSensorDataToolTip","sensorDataToPopup","api","getPublicSensors","PublicMapMsg","caseStrategy","replacement","tmp","withGroups","pLast","groups","_s","sub1","sub2","lengthLeft","lengthRight","padLeftAndRightWithZeros","extra","skipNullField","encoderRef","encoder","setters","fi","targetKey","encode","autoEncoder","enumType","encoders","valueEncoder","activePatternResult27764","keyEncoder","clo4","activePatternResult27768","autoEncodeRecordsAndUnions","unit","datetime","datetimeOffset","guid","newLine","path","decoder","reason","genericMsg","errorToString","requestedIndex","currentPath","vArray","tokens","cb","decoder1","decoder2","andThen","``arg20@``","decoders","autoDecoder","mixedArray","isOptional","decoderRef","decoderInfos","reduceRight","delegateArg","delegateArg_1","autoObject","enumValue","clo2","keyDecoder","valueDecoder","d1","autoObject2","runner","errors","ctor","toMap","autoDecodeRecordsAndUnions","bool","sbyte","byte","int16","uint16","int","uint32","float32","datetimeUtc","latLng","Latitude","lng","space","makeExtra","sessionKey","getSensors","MapMsg","ErrorMessage","FinishedState","maybeTooltip","tooltip","createReadyButton","maybeData","maybeF","maybeExistingSensor","existing","BaseData","Configuration","Description","control","createFormField","selected","modelList","sensorModel","isSelected","sensorModelString","modelToOption","PhysicalSensorFormMsg","typeString","sensorTypeFromString","sensorModelSelect","appEui","editExisting","deviceEui","appKey","description","createNameField","createAppEuiField","createDeviceEuiField","EditExisting","createAppKeyField","createSensorTypeField","SelectedType","createDescriptionField","maybeSensor","baseData","eui","ttnId","createPhysicalSensorBaseData","tryCreateSensor","PhysicalSensorListMsg","headline","additionalCmd","getAllTtnSensors","requestRunning","modalModel","Modal","expectedMinutes","expectedIntervalMinutes","roundedMinutes","createTableCell","dangerColor","blackColor","sensors","lastDataCells","LastData","lastData","maybeSensorModel","LastTimeStamp","LastTimespan","createLastIntervalCell","LastSpreadingFactor","getSensorType","Sensor","getSensorAppEui","getSensorDeviceEui","getSensorAppKey","sensorTypeAsString","sensorToRow","physicalSensorToOption","selectedDeviceEui","MapSensorListMsg","ChoosePhysicalSensorFormMsg","closeModal","physicalSensorSelect","SelectedSensor","UnusedSensors","saveButton","successCallback","errorCallback","geolocation","requestCurrentLocation","maybeDouble","maybeValue","onChange","boolean","getFullNameLastFirst","onUserSelected","selectedUser","userToOption","selectedValue","userId","users","MapSensorStateDto","SensorType","baseSensorData","ttnSensor","TtnSensorId","UserId","Location","Longitude","Altitude","IsPublic","State","Note","LastAssignmentDate","StateSince","type_","sensorTypeToString","isExisting","sensorTypeToOption","sensorStateToString","sensorStateToOption","sensorStateFromString","RetrieveCurrentLocationRunning","navigator","location","locationSuccessCallback","locationErrorCallback","deviceLocationOnClick","stateSelect","sensorTypeSelect","TtnSensorSelected","TtnSensors","UserSelected","Users","maybeOnClick","maybeName","maybeLatitude","maybeLongitude","altitude","isPublic","isDisabled","selectedTtnSensor","note","lastAssignmentDate","MapSensorDto","createCreateMapSensor","createCreateSensorMsg","stateSince","createUpdateMapSensor","ttn","mapSensors","Session","MySensSensors","onClickMsg","position","createItem","createDropdownItem","dropDownItems","ttnSensors","maybeTtnSensor","totalTimeLimit","isOldAge","LastDate","lastDate","getIconForSensor","lastDateString","lastAssignmentDateString","lastDateTooltip","stateSinceString","lastDateCellProps","sensorHasLocation","physicalSensorName","createSensorDropdownMenu","createNewSensorButton","Headline","OnClose","Body","Footer","gateway","GatewayListMsg","Gateway","ExistingGateway","optionalDoubleToString","existingGateway","createUpdateGatewayMsg","dot","gateways","gatewayToViewModel","SessionKey","getAllGateways","getAllUsers","running","stats","viewModel","TtnId","TtsId","updateGatewayViewModel","getStatus","statusDot","createStatusTableCell","StatusDot","disconnected","DisconnectedAt","connected","createStatusCellFromStatus","validLocationLabel","statusCell","createStatusCell","Eui","TtsDescription","gatewayToRow","gw","isRefreshRequestRunning","refreshGatewayStats","RefreshAllGatewayStatsRunning","refreshDevicesTTNButton","TTNRefreshRequestRunning","refreshDevicesTTIButton","TTIRefreshRequestRunning","placeholder","config","dates","mode","loc","propOptions","IsConfig","Key","role","defaultSelected","defaultValidUntil","validUntil","customerNumber","roleFromDto","getPackages","roleToString","ttnSensorToOption","UserListMsg","packagesElements","packageRow","Packages","packagesTable","UserFormMsg","rolesSelect","CustomerNumber","placeHolder","ValidUntil","SelectedDate","MinDate","MaxDate","firstName","lastName","FullUserDto","createUserData","dto","createUpdateUserMsg","availablePackages","getPackageId","packageToOption","packageId","packageFromId","packageSelect","SelectedPackage","AvailablePackages","AddPackageFormMsg","getAllFullUsers","maybeUserList","formMsg","addPackageMsg","success","maybeUser","modelFromDto","createNewModel","updateData","FormResult","roleFromString","createUser","updateUser","DeletedPackages","formResult","Package","loadingModel","addPackage","deleteUser","toastCmd","purchased","getPackageCharacter","userIsDisabled","getLastLogin","getRoleDataString","userToRow","userListToTable","createNewUserButton","UserModal","AddPackageModal","modalView","configuration","maybeConfiguration","AbsoluteHumidityFactorLimit","RelativeHumidityDeltaLimit","DewPointLimit","DryHumidityLimit","WetHumidityLimit","wetHumidityLimit","dryHumidityLimit","dewPointLimit","relativeHumidityDeltaLimit","absoluteHumidityDeltaLimit","configurationFactory","createConfiguration","LeafletWetnessConfigurationMsg","isDanger","defaultControlOptions","createControl","maybeForm","addonButton","percentAddon","createWetHumidityLimitInput","createDryHumidityLimitInput","createDewPointInput","createRelativeHumidityDeltaInput","createAbsoluteHumidityFactorInput","passwordRepeated","PasswordRepeated","ResetPasswordMsg","includeZero","startDataValue","startValue","roundTicks","valueFunc","cssClass","graph","createBox","boxTitle","createBoxWithStringHeadline","graphWrapper","graphBox","fullHeightGraphBoxClass","unixTimeStamp","formatTimeTick","properties","header","timestamp","originalData","timestampToTicks","boxSubtitle","TimeStamp","leafletWetnessToInt","IsForecast","SoilHumidity","RainFallSum","exn","updateStartEnd","startDate","endDate","DeltaLimit","FixedEndLimit","updateLimits","flatpickrOptions","End","StartLimit","EndLimit","deltaLimit","hasForecast","endLimit","initWithRange","cn","selectedRange","availableRanges","toSelectOption","findRangeOption","isGraphDataEmpty","HistoryGraphData","wetLimit","dryLimit","Temperature","createGroundSensorGraphData","WetLimit","DryLimit","toGroundSensorGraphData","Nodes","graphDataDtoToGroundGraphData","dtoList","getLocalDateTime","firstDateTime","lastDateTime","AmountOfRain","createRainFallSensorGraphData","toRainFallSensorGraphData","graphDataDtoToRainFallGraphData","toLeafletMoistureSensorGraphData","graphDataToLeafletMoistureData","toSoilPhSensorGraphData","graphDataToSoilPhGraphData","createAverageWindSpeedGraphsData","toAverageWindSpeedSensorGraphData","graphDataToAverageWindSpeedGraphData","temperatureAxisTicks","graphNode","windSpeedAxisTicks","createWindSpeedAxisTicks","createWeatherStationGraphData","toWeatherGraphData","graphDataDtoToWeatherStationGraphData","toLiquidLevelSensorGraphData","graphDataToLiquidLevelGraphData","toSolarRadiationSensorGraphData","graphDataToSolarRadiationGraphData","createTemperatureAxisTicks","createAirSensorGraphData","toAirSensorGraphData","graphDataDtoToAirGraphData","startFileName","Range","endFileName","rangeFileNamePart","sensorId","elems","elms","createHistoricRequestData","DownloadRange","StartTime","EndTime","MySensSensorMsg","AvailableDownloadRanges","graphData","xStart","Ticks","xDomain","yDomain","xAxisTickInterval","dataKey","humidityAxisTicks","HumidityAxisTicks","limitAreas","humidityChart","fullHeightGraphBox","TemperatureAxisTicks","temperatureChart","conductivityAxisTicks","ConductivityAxisTicks","groundDataGraphs","amountAxisTicks","AmountOfRainAxisTicks","rainFallChart","forecastLineProps","CurrentTimestamp","sumAxisTicks","SumOfRainAxisTicks","sumGraph","sum","LastDateTime","FirstDateTime","TotalRainSum","first","rainFallDataGraphs","moistureYAxis","createMoistureAxisTicks","moistureChart","temperatureYAxis","leafletMoistureDataGraphs","phYAxisTicks","createSoilPhYAxisTicks","phChart","temperatureYAxisTicks","createSoilTemperatureYAxisTicks","soilPhDataGraphs","averageWindSpeedDataGraphs","temperatureTicks","TemperatureAxis","humidityYAxis","HumidityAxis","wetnessTicks","leafletWetnessGraph","halfHeightGraphBox","windSpeedTicks","WindSpeedAxis","weatherStationDataGraphs","liquidLevelYAxisTicks","createLiquidLevelYAxisTicks","liquidLevelGraphs","solarRadiationYAxisTicks","createSolarRadiationYAxisTicks","solarRadiationGraphs","airDataGraphs","rangePicker","createEnabledButtonOptions","SensorId","GraphRequestRunning","datePicker","GraphDateRange","boxStringSubtitle","createDatePicker","createFullColumn","getGraphs","graphsView","AlertMessages","Alerts","ContactInfos","contactInfos","alerts","messages","alert","Alert","dataModelCon","localDateTime","lastTemperature","LastAlertMessages","CreatedAt","method","Method","PhoneNumber","Type","Content","Timestamp","alertMessageToRow","createSensorLink","stateClass","contactInfo","ContactInfoId","TemperatureType","PhoneAlertType","Threshold","lastTemperatureCell","LastTemperature","statusSinceCell","alertToRow","unicodeCategoryFunc","a1","codePointAt","a2","codepoints","Uint32Array","categories","cp","mid","getCategoryFunc","isDigit","getUnicodeCategory2","isDigit2","character","ContactInfoFormMsg","Phone","phone","characterValidForPhoneNumber","createContactInfo","threshold","typeToOption","thresholdTypeFromString","availableSensors","sensorToOption","availableContactInfos","contactInfoToOption","alertTypeToOption","phoneAlertTypeFromString","sensorSelect","AvailableSensors","contactInfoSelect","ContactInfo","AvailableContactInfos","alertTypeSelect","thresholdTypeSelect","TemperatureThresholdType","AlertFormMsg","maybeContactInfo","phoneAlertType","maybeThreshold","createAlert","checkThresholdLimits","createAlertMsg","countToOption","price","Count","countSelect","DisclaimerApproved","isLoading","Text","createButton","OnYes","OnNo","createModalFooter","getMyAlerts","getMyContactInfos","getMyAirTemperatureMapSensors","getPurchasedAlertCounts","PurchasedAlertCounts","purchasedCounts","inUse","createDeleteContactInfoButton","createContactInfoRow","contactInfoInUse","buttonRow","button","onAddClick","contactInfoName","stateText","temperatureString","createAlertsRowIcon","createDeleteAlertButton","createAlertsRow","alertsCount","maxCount","PurchasedAlertsCount","PurchasedAlertPackagesCount","maxCountText","addButtonRow","currentCount","maybeMaxCount","createAddButtonRow","usedCount","usedText","boxHeadlineWithCount","packagesCount","cnt","getMyMapSensorsData","MySensorDataMsg","maybeSecondName","secondName","maybeSubtitle","wrapBoxHeading","wrapBoxTitles","createActiveBoxTitleLink","createBoxSubTitle","SecondName","windDirectionToString","dataTextContent","activeSensorDataContent","mySensorBoxes","surroundingBox","createDefectiveBoxTitleLink","defectiveSensorBoxContent","activeSensorBoxContent","sensorBoxContent","MySensors","groupSensorBoxes","sensorBoxes","activeSensorBox","Senors","heading","groupView","Groups","TtnSensor","settings","soilSettings","SensorSettings","BaseSettings","sensorSettings","baseDtoToSettings","dtoToSensorSettings","baseSettings","UpdatedMapSensorSettingsDto","createSaveRequestData","UpdateRequestRunning","locationUpdateRunning","UserDefinedMapSensorPropertiesMsg","createLatitudeField","createLongitudeField","createAltitudeField","createDeviceLocationButton","formContent","createBaseSettingFields","DeviceLocationUpdateRunning","createLimitField","createSaveButton","soilFormView","baseFormView","imgSrc","MapSensorName","PhysicalSensorName","createSensorStatusItem","ModificationAllowed","createActivationButton","createSettingsButton","sensorToBox","selectedSensor","withNoneOption","wetnessSensors","AvailableLeafletWetnessSensors","AvailableAirSensors","RimProFormMsg","AirSensor","RainSensor","AvailableRainSensors","FirstWetnessSensor","SecondWetnessSensor","maybeNewStation","airSensor","rainSensor","firstWetnessSensor","tryCreateDto","newStation","tuple_0","tuple_1","distinct","hashSet","RimProMsg","getMyRainFallMapSensors","getMyLeafletWetnessMapSensors","getMyRimProStations","Stations","air","rain","stations","dataModel","CreationModal","newModel","createRimProStation","deleteRimProStation","airSensors","rainSensors","leafletWetnessSensors","ifNone","updateForm","updateDataModel","newLoadingModel","tryCreateDataModel","updateLoadingModel","station","airSensorName","AirSensorId","rainSensorName","RainSensorId","names","FirstLeafletWetnessSensorId","SecondLeafletWetnessSensorId","deleteButton","stationToRow","rowsView","isConnected","createGatewayStatusItem","createGatewayConnectedStatusItem","gatewayStatusRow","gatewayToBox","previous","DegreeHours","InfectionPercentage","RainFallAmount","RainSum","dtos","nodes","count_mut","xs_4","t_4","createGraphNode","generateFixedStart","percentage","createToolTipRow","degreeHours","domainMax","InfectionMaxPercentage","console","infectionTooltipContent","createInfectionYDomain","createInfectionReferenceLine","RainAxisTicks","axisTicks","RainSumAxisTicks","getScabData","ScabDataMsg","stationName","infectionGraph","rainfallGraph","rainSumGraph","graphs","Station","boxHeader","stationId","createRequestData","DateRangePicker","GraphData","pageHeader","RenameMyScabStationMsg","StationId","tryCreateRenameRequest","getMyScabStations","MyScabStationsMsg","InfectionState","detailsButton","renameButton","stationRow","addButton","DeleteModal","DeletionRunning","createDeleteModalConfig","RenameModal","GroupName","noGroups","groupRow","RenameMyPeronosporaStationMsg","getMyPeronosporaStations","MyPeronosporaStationsMsg","GerminationState","PrimaryInfectionState","yAxisTicks","rainFallAxisTicks","minTick","maxTick","PrimaryInfections","yTicks","infection","Percentage","primaryInfectionsGraph","maybePrimaryInfectionsGraph","Sporangia","sporangie","Energy","sporangiaGraph","maybeSporangiaGraph","NormalInfections","normalInfectionsGraph","maybeNormalInfectionsGraph","getPeronosporaData","PeronosporaDataMsg","germinationGraph","PrimaryInfectionsGraph","SporangiaGraph","NormalInfectionsGraph","toMsg","UserGroupFormMsg","tryCreateRequest","getAllGroups","GroupListMsg","MemberCount","SensorCount","groupToRow","createNewGroupButton","nextProps","_nextState","modelMap","subModel","onAnonymous","mapModel","onlyForLoggedInSession","maybeRoute","cmdMap","onlyWithSession","``arg00@``","``arg01@``","onPending_0","onPending_1","initWithSession","onlyLoggedIn","getConfiguredTtnSensors","getAllMySensSensorsWithOptionalLastDate","mapViewData","retrieveMapDataFromLocalStorage","storeMapDataInLocalStorage","retrieveSensorsCmd","getPasswordResetRequest","getMyProfile","getLeafletWetnessConfiguration","CalculationConfigurationMsg","getSensorDetailPageData","messagesRequestData","getAlerts","AlertListMsg","getContactInfos","getAllMySensSensors","getAlertMessages","refreshCmd","getMyMapSensors","getMyGateways","getScabStation","getMyUserGroups","MyUserGroupsMsg","getMapSensorSettings","getPeronosporaStation","getDashboard","HomeMsg","navBrand","subCmd","IsBurgerOpen","renderer","placeholderId","lazyView2With","getElementById","equal","urlUpdate","onLocationChange","userInit","unitVar1","userUpdate","userView","userSetState","userSubscribe","states","parseHelp","segments","splitUrl","querystring","toKeyValuePair","lastLocation","onChangeRef","Page","pageModel","pageMsg","loginModel","loginMsg","dataMsg","listModel","ttnMsg","mySensMsg","gatewayMsg","mySettingsMsg","profileModel","userListModel","userListMsg","lostModel","lostMsg","resetModel","resetMsg","calcConfigurationModel","calcConfigurationMsg","sensorMsg","alertsModel","alertsMsg","subMsg","logout","mapCmd","closeBurger","additionalCommands","newUrl","history","ev","toggleBurger","newMapViewData","Center","Zoom","sensorsResult","updateSensors","sessionId","sessionIdKey","login","refreshTtnEndDevices","refreshTtiEndDevices","updateRefreshButtonState","buttonState","modal","selectedType","updateRequestRunning","createPhysicalSensor","createdSensor","updatePhysicalSensor","updatedSensor","removePhysicalSensor","maybeUsers","newSensor","deletedId","choosePhysicalSensorFormMsg","userFilter","updatedLoadingModel","modelLoadingToData","getSortKey","getUnusedPhysicalSensors","updateRequestRunningModalState","updateMapSensor","createMapSensor","deleteMySensSensor","modalData","MapSensors","belongsToUser","coords","successful","loadGatewayStatus","updateAllGatewayWithStatus","refreshGatewaysFromTtn","refreshGatewaysFromTti","updateRefreshRequestRunning","updatedGateway","updateGateway","loading","updatePassword","sendPasswordResetRequest","repeatedPassword","initDataModel","resetPassword","lwModel","LeafletWetnessForm","updateLeafletWetnessConfiguration","historicData","PageModel","graphDateRange","Visualisations","dateRanges","DownloadRangeIds","CurrentData","pageDataToDataModel","onDetailPageDataReceived","getHistoricMapSensorData","toGraphDataList","downloadMapSensorData","createExcelFileName","alertsResult","contactInfosResult","countsResult","runningAlert","tryDataModel","deleteContactInfo","deleteAlert","buyAlertPackages","getSession","getSessionKey","newProperties","updateBaseData","updateMapSensorSettings","activateMapSensor","changeStatus","disableMapSensor","stationResponse","dataResponse","authError","startTimestamp","endTimestamp","createRequestDataCommand","stationResponseToDataModel","ScabGraph","createScabGraphData","deleteScabStation","renameScabStation","deletePeronosporaStation","renamePeronosporaStation","PeronosporaGraph","createPeronosporaGraphData","deletionModel","deleteUserGroup","createUserGroup","grp","userGroupCreated","initialRoute","sessionCmd","ClientSession","getUserFromClientSession","pageSkeletonFactory","contentWrapper","pageSkeletonSingleElementFactory","markers","makeMarker","makePosition","makeMarkerPopup","MapProps","MapViewData","latLngToLocation","getCenter","onDrag","getMapFromEvent","getZoom","onZoom","RefreshRunning","loadingView","containerBox","loginView","heroView","tableButtons","ttnButtonModel","ttiButtonModel","createNewDevice","refreshTtnButton","refreshTtiButton","TTNRefreshButton","TTIRefreshButton","sensorListToTable","FilteredMapSensors","tableHeader","SelectedUserFilter","getFullName","devicesView","Devices","tabs","getUserPackages","createTabView","dataView","PasswordLostMsg","noRequestView","gatewayListToTable","leafletWetnessBox","headingOnlyPageContent","boxes","currentAirDataBox","currentGroundDataBox","currentRainfallDataBox","currentLeafletMoistureDataBox","currentSoilPhDataBox","currentAverageWindSpeedDataBox","currentLiquidLevelDataBox","currentSolarRadiationDataBox","graphBoxContent","downloadBox","createMapLink","pageView","alertsTable","alertMessagesTable","myAlertsDispatch","contactForm","ContactInfoForm","alertForm","AlertForm","deleteContactInfoModal","deleteContactInfoModalConfig","ContactInfoDeleteModal","deleteAlertModal","deleteAlertModalConfig","AlertDeleteModal","buyPackagesModal","BuyAlertPackageFormMsg","formView","buyButton","BuyAlertsFormModal","alertStartedModal","MyAlertsMsg","AlertStartedModal","buyButtonState","packagesText","createBuyButton","deleteModal","deleteStationModalConfig","creationModal","groupListToTable","UserGroupModal","deletion","deleteUserGroupModalConfig","Group","newToast","delayedCmd","Guid","UserModel","view'"],"sourceRoot":""}