Made small improvements like dismissing the keyboard. Tapping the Contacts tab causes the app to crash.

This commit is contained in:
Isaac Greene 2022-06-10 23:55:34 -04:00
parent b77ef882e8
commit 5c4d4f8059
21 changed files with 174 additions and 36 deletions

View file

@ -14,6 +14,10 @@
850F8018284A83400094580D /* FeaturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F8017284A83400094580D /* FeaturesView.swift */; }; 850F8018284A83400094580D /* FeaturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F8017284A83400094580D /* FeaturesView.swift */; };
850F80202853F7790094580D /* LicenseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F801F2853F7790094580D /* LicenseView.swift */; }; 850F80202853F7790094580D /* LicenseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F801F2853F7790094580D /* LicenseView.swift */; };
850F80222853F7E30094580D /* SecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F80212853F7E30094580D /* SecretView.swift */; }; 850F80222853F7E30094580D /* SecretView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850F80212853F7E30094580D /* SecretView.swift */; };
850F8027285437500094580D /* caleb.bost.duo.heic in Resources */ = {isa = PBXBuildFile; fileRef = 850F8023285437500094580D /* caleb.bost.duo.heic */; };
850F8028285437500094580D /* aiden.moore.states.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 850F8024285437500094580D /* aiden.moore.states.jpg */; };
850F8029285437500094580D /* isaac.greene.clouds.heic in Resources */ = {isa = PBXBuildFile; fileRef = 850F8025285437500094580D /* isaac.greene.clouds.heic */; };
850F802A285437500094580D /* jake.zimmerman.group.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 850F8026285437500094580D /* jake.zimmerman.group.jpg */; };
85AAA0D627FA2DD600F4B9A1 /* SplitsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */; }; 85AAA0D627FA2DD600F4B9A1 /* SplitsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */; };
85AAA0D827FA2DD600F4B9A1 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */; }; 85AAA0D827FA2DD600F4B9A1 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */; };
85AAA0DA27FA2DDA00F4B9A1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */; }; 85AAA0DA27FA2DDA00F4B9A1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */; };
@ -31,6 +35,10 @@
850F8017284A83400094580D /* FeaturesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturesView.swift; sourceTree = "<group>"; }; 850F8017284A83400094580D /* FeaturesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturesView.swift; sourceTree = "<group>"; };
850F801F2853F7790094580D /* LicenseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseView.swift; sourceTree = "<group>"; }; 850F801F2853F7790094580D /* LicenseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseView.swift; sourceTree = "<group>"; };
850F80212853F7E30094580D /* SecretView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretView.swift; sourceTree = "<group>"; }; 850F80212853F7E30094580D /* SecretView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretView.swift; sourceTree = "<group>"; };
850F8023285437500094580D /* caleb.bost.duo.heic */ = {isa = PBXFileReference; lastKnownFileType = file; name = caleb.bost.duo.heic; path = Assets.xcassets/caleb.bost.duo.heic; sourceTree = "<group>"; };
850F8024285437500094580D /* aiden.moore.states.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = aiden.moore.states.jpg; path = Assets.xcassets/aiden.moore.states.jpg; sourceTree = "<group>"; };
850F8025285437500094580D /* isaac.greene.clouds.heic */ = {isa = PBXFileReference; lastKnownFileType = file; name = isaac.greene.clouds.heic; path = Assets.xcassets/isaac.greene.clouds.heic; sourceTree = "<group>"; };
850F8026285437500094580D /* jake.zimmerman.group.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = jake.zimmerman.group.jpg; path = Assets.xcassets/jake.zimmerman.group.jpg; sourceTree = "<group>"; };
85AAA0D227FA2DD600F4B9A1 /* Splits.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Splits.app; sourceTree = BUILT_PRODUCTS_DIR; }; 85AAA0D227FA2DD600F4B9A1 /* Splits.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Splits.app; sourceTree = BUILT_PRODUCTS_DIR; };
85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitsApp.swift; sourceTree = "<group>"; }; 85AAA0D527FA2DD600F4B9A1 /* SplitsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitsApp.swift; sourceTree = "<group>"; };
85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; }; 85AAA0D727FA2DD600F4B9A1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
@ -83,6 +91,10 @@
85AAA0E527FA2EB100F4B9A1 /* ModalView.swift */, 85AAA0E527FA2EB100F4B9A1 /* ModalView.swift */,
850F801F2853F7790094580D /* LicenseView.swift */, 850F801F2853F7790094580D /* LicenseView.swift */,
85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */, 85AAA0D927FA2DDA00F4B9A1 /* Assets.xcassets */,
850F8025285437500094580D /* isaac.greene.clouds.heic */,
850F8023285437500094580D /* caleb.bost.duo.heic */,
850F8026285437500094580D /* jake.zimmerman.group.jpg */,
850F8024285437500094580D /* aiden.moore.states.jpg */,
85AAA0DB27FA2DDA00F4B9A1 /* Preview Content */, 85AAA0DB27FA2DDA00F4B9A1 /* Preview Content */,
); );
path = Splits; path = Splits;
@ -162,6 +174,10 @@
files = ( files = (
85AAA0DD27FA2DDA00F4B9A1 /* Preview Assets.xcassets in Resources */, 85AAA0DD27FA2DDA00F4B9A1 /* Preview Assets.xcassets in Resources */,
85AAA0DA27FA2DDA00F4B9A1 /* Assets.xcassets in Resources */, 85AAA0DA27FA2DDA00F4B9A1 /* Assets.xcassets in Resources */,
850F802A285437500094580D /* jake.zimmerman.group.jpg in Resources */,
850F8028285437500094580D /* aiden.moore.states.jpg in Resources */,
850F8027285437500094580D /* caleb.bost.duo.heic in Resources */,
850F8029285437500094580D /* isaac.greene.clouds.heic in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };

View file

@ -49,7 +49,7 @@
<key>Splits.xcscheme_^#shared#^_</key> <key>Splits.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>0</integer>
</dict> </dict>
<key>SwiftRichString (Playground) 1.xcscheme</key> <key>SwiftRichString (Playground) 1.xcscheme</key>
<dict> <dict>

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "aiden.moore.states.jpg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "caleb.bost.duo.heic",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "isaac.greene.clouds.heic",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "jake.zimmerman.group.jpg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View file

@ -17,11 +17,14 @@ struct June2022: View {
VStack (alignment: .leading) { VStack (alignment: .leading) {
Text("2022-06-10") Text("2022-06-10")
.font(.title2) .font(.title2)
Text("Version 1.0.0 (LVSXT10a)\n") Text("Version Release Candidate (LVSXT10a)\n")
.font(.footnote) .font(.footnote)
Text("\u{2022} Got the conversion of paces to work, so a 5:00/km pace will also show as 8:03/mi\n\u{2022} This app is now considered \"Finished\" and will transition to Version Numbers") Text("\u{2022} Got the conversion of paces to work, so a 5:00/km pace will also show as 8:03/mi\n\u{2022} This app is now considered \"Finished\" and will transition to Version Numbers\n\u{2022} FINALLY MADE A WAY TO DISMISS THE KEYBOARD\n\t\u{2022} (as with most of the other solutions I've had to use for other problems in this app, the fix was remarkably easy)\n\u{2022} Made several small quality-of-life improvements")
} }
Spacer()
} }
.padding(30)
//2022-06-09 //2022-06-09
HStack { HStack {
VStack (alignment: .leading) { VStack (alignment: .leading) {
@ -97,6 +100,8 @@ struct June2022: View {
} }
.padding(30) .padding(30)
} }
.navigationTitle("June 2022 Log")
.navigationBarTitleDisplayMode(.inline)
} }
} }
@ -129,6 +134,8 @@ struct May2022: View {
} }
.padding(30) .padding(30)
} }
.navigationTitle("May 2022 Log")
.navigationBarTitleDisplayMode(.inline)
} }
} }
@ -226,6 +233,8 @@ struct April2022: View {
} }
.padding(30) .padding(30)
} }
.navigationTitle("April 2022 Log")
.navigationBarTitleDisplayMode(.inline)
} }
} }
@ -258,5 +267,7 @@ struct March2022: View {
} }
.padding(30) .padding(30)
} }
.navigationTitle("March 2022 Log")
.navigationBarTitleDisplayMode(.inline)
} }
} }

View file

@ -9,6 +9,7 @@ import SwiftUI
import Foundation import Foundation
struct ContentView: View { struct ContentView: View {
@FocusState private var nameIsFocused: Bool
var SISystem = ["km","mi"] var SISystem = ["km","mi"]
@State var timeHours: String = "" @State var timeHours: String = ""
@State var timeMinutes: String = "" @State var timeMinutes: String = ""
@ -18,11 +19,13 @@ struct ContentView: View {
var body: some View { var body: some View {
VStack { VStack {
Spacer()
VStack { VStack {
TextField("Enter distance here", text: $distance) TextField("Enter distance here", text: $distance)
.padding() .padding()
.keyboardType(.decimalPad) .keyboardType(.decimalPad)
.textFieldStyle(.roundedBorder) .textFieldStyle(.roundedBorder)
.focused($nameIsFocused)
} }
VStack { VStack {
Text("Unit of measurement:") Text("Unit of measurement:")
@ -39,6 +42,7 @@ struct ContentView: View {
TextField("Enter hours here", text: $timeHours) TextField("Enter hours here", text: $timeHours)
.keyboardType(.numberPad) .keyboardType(.numberPad)
.textFieldStyle(.roundedBorder) .textFieldStyle(.roundedBorder)
.focused($nameIsFocused)
} }
.frame(minWidth: 100) .frame(minWidth: 100)
.padding(.trailing, -15) .padding(.trailing, -15)
@ -48,6 +52,7 @@ struct ContentView: View {
TextField("Enter minutes here", text: $timeMinutes) TextField("Enter minutes here", text: $timeMinutes)
.keyboardType(.numberPad) .keyboardType(.numberPad)
.textFieldStyle(.roundedBorder) .textFieldStyle(.roundedBorder)
.focused($nameIsFocused)
} }
.frame(minWidth: 100) .frame(minWidth: 100)
.padding(.trailing, -15) .padding(.trailing, -15)
@ -58,6 +63,7 @@ struct ContentView: View {
TextField("Enter seconds here", text: $timeSeconds) TextField("Enter seconds here", text: $timeSeconds)
.keyboardType(.numberPad) .keyboardType(.numberPad)
.textFieldStyle(.roundedBorder) .textFieldStyle(.roundedBorder)
.focused($nameIsFocused)
} }
.frame(minWidth: 100) .frame(minWidth: 100)
.padding(.leading, -15) .padding(.leading, -15)
@ -65,6 +71,13 @@ struct ContentView: View {
} }
PaceResults(timeHours: $timeHours, timeMinutes: $timeMinutes, timeSeconds: $timeSeconds, selectedSystem: $selectedSystem, distance: $distance) PaceResults(timeHours: $timeHours, timeMinutes: $timeMinutes, timeSeconds: $timeSeconds, selectedSystem: $selectedSystem, distance: $distance)
} }
Spacer()
if nameIsFocused == true {
Button("Done") {
nameIsFocused = false
}
.padding()
}
} }
} }
} }
@ -164,11 +177,11 @@ struct PaceResults: View {
HStack { HStack {
VStack { VStack {
Text("Distance: \(distance)\(selectedSystem)") Text("Distance: \(distance)\(selectedSystem)")
Text("Converted distance: \(convertedDistanceString)\(notSelectedSystem)") Text("Distance: \(convertedDistanceString)\(notSelectedSystem)")
} }
Text("Total time: \(hoursFormatted):\(leadingZeros)") Text("Total time\n\(hoursFormatted):\(leadingZeros)")
.padding() .padding()
VStack { VStack(alignment: .trailing) {
Text("\(paceFormatted) per \(selectedSystem)") Text("\(paceFormatted) per \(selectedSystem)")
Text("\(paceFormattedOpposite) per \(notSelectedSystem)") Text("\(paceFormattedOpposite) per \(notSelectedSystem)")
} }

View file

@ -11,12 +11,20 @@ import SwiftUI
// human-readable without aid, as long as // human-readable without aid, as long as
// the reader has a basic understanding of // the reader has a basic understanding of
// Swift and/or SwiftUI. // Swift and/or SwiftUI.
let username = "admin" let username = "admin"
let password = "123" let password = "123"
struct DocsView: View { struct DocsView: View {
@State var pass: String = "" enum Field: Hashable {
@State var user: String = "" case username
case password
}
@State private var pass: String = ""
@State private var user: String = ""
@FocusState private var focusedField: Field?
var body: some View { var body: some View {
NavigationView { NavigationView {
List { List {
@ -36,14 +44,22 @@ struct DocsView: View {
} }
Section(header: Text("App Information")) { Section(header: Text("App Information")) {
NavigationLink("Software License", destination: LicenseView()) NavigationLink("Software License", destination: LicenseView())
Text("Version: 1.0.0") Text("Version: Release Candidate (1.0.0)")
Text("Release date: 2022-06-10") Text("Release date: 2022-06-10")
Text("Start date: 2022-03-25") Text("Start date: 2022-03-25")
Link("Built with SwiftUI \(Image(systemName: "swift"))", destination: URL(string: "https://developer.apple.com/xcode/swiftui")!) Link("Built with SwiftUI \(Image(systemName: "swift"))", destination: URL(string: "https://developer.apple.com/xcode/swiftui")!)
} }
Section(header: Text("Login")) { Section(header: Text("Login")) {
SecureField("Username", text: $user) SecureField("Username", text: $user)
.keyboardType(.alphabet)
.textContentType(.username)
.submitLabel(.next)
.focused($focusedField, equals: .username)
SecureField("Password", text: $pass) SecureField("Password", text: $pass)
.keyboardType(.numbersAndPunctuation)
.textContentType(.password)
.submitLabel(.done)
.focused($focusedField, equals: .password)
if (pass == password && user == username) { if (pass == password && user == username) {
NavigationLink("Contacts", destination: SecretView()) NavigationLink("Contacts", destination: SecretView())
} }
@ -51,6 +67,14 @@ struct DocsView: View {
} }
.navigationTitle("Docs") .navigationTitle("Docs")
} }
.onSubmit {
switch focusedField {
case .username:
focusedField = .password
default:
()
}
}
} }
} }

View file

@ -10,10 +10,6 @@ import SwiftUI
struct NewFeatures: View { struct NewFeatures: View {
var body: some View { var body: some View {
ScrollView { ScrollView {
Text("New Features\n")
.font(.largeTitle)
.bold()
.padding(.top, 40)
VStack(alignment: .leading) { VStack(alignment: .leading) {
Text("\u{2022} Reformatted the Docs tabs and made the common things up at the top") Text("\u{2022} Reformatted the Docs tabs and made the common things up at the top")
Text("Implemented in Version Prerelease LVSXT10d.2\n") Text("Implemented in Version Prerelease LVSXT10d.2\n")
@ -30,6 +26,7 @@ struct NewFeatures: View {
} }
.padding(30) .padding(30)
} }
.navigationTitle("New Features")
} }
} }
@ -48,6 +45,7 @@ struct InProgressFeatures: View {
} }
.padding(30) .padding(30)
} }
.navigationTitle("In Progress")
} }
} }
@ -66,6 +64,7 @@ struct DeprecatedFeatures: View {
} }
.padding(30) .padding(30)
} }
.navigationTitle("Deprecated")
} }
} }

View file

@ -12,61 +12,49 @@ import SwiftUI
struct RecentlyResolved: View { struct RecentlyResolved: View {
var body: some View { var body: some View {
ScrollView { ScrollView {
Text("Recently Resolved Issues")
.font(.largeTitle)
.bold()
.padding(.top, 40)
VStack(alignment: .leading) { VStack(alignment: .leading) {
Text("\n\u{2022} None since the addition of this tab") Text("\u{2022} Implemented an easy way to dismiss the keyboard in the main view of Calculator (it only took 2 1/2 months)")
} }
.padding(30) .padding(30)
} }
.navigationTitle("Recently Resolved")
} }
} }
struct HighPriority: View { struct HighPriority: View {
var body: some View { var body: some View {
ScrollView { ScrollView {
Text("High Priority Issues")
.font(.largeTitle)
.bold()
.padding(.top, 40)
VStack(alignment: .leading) { VStack(alignment: .leading) {
Text("\n\u{2022} You can not dismiss the keyboard on iPhone\n\t\u{2022} This hides the tab bar at the bottom so you can't navigate the app after bringing it up") Text("Tapping on the Contacts tab after entering correct login details causes the app to crash")
} }
.padding(30) .padding(30)
} }
.navigationTitle("High Priority")
} }
} }
struct MediumPriority: View { struct MediumPriority: View {
var body: some View { var body: some View {
ScrollView { ScrollView {
Text("Medium Priority Issues")
.font(.largeTitle)
.bold()
.padding(.top, 40)
VStack(alignment: .leading) { VStack(alignment: .leading) {
Text("Wow. Such Empty.") Text("Wow. Such Empty.")
.italic() .italic()
} }
.padding(30) .padding(30)
} }
.navigationTitle("Medium Priority")
} }
} }
struct LowPriority: View { struct LowPriority: View {
var body: some View { var body: some View {
ScrollView { ScrollView {
Text("Low Priority Issues")
.font(.largeTitle)
.bold()
.padding(.top, 40)
VStack(alignment: .leading) { VStack(alignment: .leading) {
Text("\n\u{2022} Space between the equation and explanation in the \"Help\" tab is too large\n\u{2022} App has no custom icon") Text("\u{2022} Space between the equation and explanation in the \"Help\" tab is too large\n\u{2022} App has no custom icon")
} }
.padding(30) .padding(30)
} }
.navigationTitle("Low Priority")
} }
} }

View file

@ -8,7 +8,7 @@
import SwiftUI import SwiftUI
struct LicenseView: View { struct LicenseView: View {
var fontSize:CGFloat {UIScreen.main.bounds.width > 700 ? 18 : 8} var fontSize:CGFloat {UIScreen.main.bounds.width > 700 ? 18 : 9}
// figuring out how to do this came partly from tinyurl.com/9snwkrzt // figuring out how to do this came partly from tinyurl.com/9snwkrzt
// and also partly from stackoverflow.com/questions/57727107/ // and also partly from stackoverflow.com/questions/57727107/
// then I remembered about ternary operators and I optimized it // then I remembered about ternary operators and I optimized it
@ -96,10 +96,13 @@ struct LicenseView: View {
Text("Updated: 2022-06-09") Text("Updated: 2022-06-09")
} }
.navigationTitle("Software License Agreement") .navigationTitle("Software License Agreement")
.navigationBarTitleDisplayMode(.inline)
// sets the top of the screen to this text which always // sets the top of the screen to this text which always
// lets you know what page you're in // lets you know what page you're in
.padding() .padding()
.frame(maxWidth: .infinity) .frame(maxWidth: .infinity)
// this just makes it so you can scroll anywhere on screen
// instead of only in the frame
} }
} }
} }

View file

@ -15,7 +15,7 @@ import SwiftUI
struct SecretView: View { struct SecretView: View {
var body: some View { var body: some View {
VStack { VStack {
HStack { ScrollView {
VStack { VStack {
Image("jake.zimmerman.group") Image("jake.zimmerman.group")
.resizable() .resizable()
@ -59,8 +59,6 @@ Email: bostc@students.lakeviewspartans.org
} }
.frame(minWidth: 350, minHeight: 175) .frame(minWidth: 350, minHeight: 175)
.border(.primary) .border(.primary)
}
HStack {
VStack { VStack {
Image("aiden.moore.states") Image("aiden.moore.states")
.resizable() .resizable()
@ -104,6 +102,8 @@ Email: greenei@students.lakeviewspartans.org
.frame(minWidth: 350, minHeight: 175) .frame(minWidth: 350, minHeight: 175)
.border(.primary) .border(.primary)
} }
.navigationTitle("Contacts")
} }
.frame(minWidth: .infinity)
} }
} }