AppForce1: news and info for iOS app developers

Twitter Space: Xcode 13.3 and Swift 5.6

March 19, 2022 Jeroen Leenarts
AppForce1: news and info for iOS app developers
Twitter Space: Xcode 13.3 and Swift 5.6
AppForce1: news and info for iOS app developers +
Help us continue making great content for listeners everywhere.
Starting at $3/month
Support
Show Notes Transcript
Jeroen Leenarts:

So let's see ASMR learning space by being on my Mac keyboard,

Stefan Blos:

I just read it.

Jeroen Leenarts:

Now I'm actually tweeting it. Alright. Alright. I think the topic of today is quite obvious, right? We had some new updates by by Apple Swift 5.6 and Xcode 13.3. And I heard some different takes on mine about, about Swift 5.6. Because, of course, they've added new language features, again to the Swift language. And it's probably not a popular opinion that I'm having. But the way Swift is developing and really brings me back to the days that it did Java development. And there was like back in the days that you had like Java six, and seven. And Swift, when it was first released was intended to be like, language, it was easy to get it to, easy to learn, and it really helpful to get started with software development. And that's pretty much also where the Java language started. Right. But I don't think Swift is, it's not that simple anymore nowadays with all the features that are keeping on being added to the language. So let's just start and dive in, we made a list of things we wanted to talk about. So yeah, where shall we start? Stefan and Adam?

Stefan Blos:

I think I think a nice starting point would be like, when we want to talk about things like new language features, new new Xcode features, like what are places that you guys are checking for these new features? So for example, are you are using the Swift forums for that? Or are there any websites you can recommend? Where it's easy to get these these news and these resources from?

Jeroen Leenarts:

But yeah, I usually just check my, my RSS feeds, because I always check RSS feeds, right. So I've seen a number of different articles over the last weeks, really, on the new language features in Swift 5.6. For instance, Paul Hudson did a big write up of everything that is new. But there was also some someone who wrote about the Doxy documentation generator that you can now generate a static site with with Xcode 13.3. It's not directly Swift, but it's like a tool that supports Swift, you could say. But also, that Swift package manager now supports binary dependencies in private GitHub releases, which is probably very important for companies out there that wants to deliver functionality to their users without sharing the code of their work. Well, at stream, we do everything open source, and I really liked that. But probably this will make some new kinds of work possible for a number of companies out there who, up till now had to do their distribution with manual installation of xc frameworks, for example. So I think, I think that's a really cool features in in Xcode and swift. Any which way that you that you look at it? So yeah, they can pretty much start everywhere. So let's, let's start with the basics. Let's start at the language level, right.

Stefan Blos:

Yeah, sure. Sure. What's the what's the most prominent thing that was added? In your, in your opinion?

Jeroen Leenarts:

Oh, that's kind of hard to say, because I think there's a number of things that were released in Swift 5.6. And the ones that that we got highlighted in our notes is the any keyword, I still am in the process of wrapping my head around it. And I know Donnie waltz wrote a nice article about this specific keyword and what implications it has. And it's like, it's like an existential type. So there's already been jokes going around on Twitter that that the Swift language is not a protocol oriented language anymore, but that it's an extent existential based language and nowadays, so not sure yet what what the joke is there exactly. But yeah, I think I think that any keywords is a nice one to start at. And then we of course, have type placeholders which is more like, I think, a feature that will support an IDE when working with the Swift language, so for instance, Xcode, unless I understand the feature wrong, and some some more features for a dictionary so that you can put different types into repeat container. So I have That's like just one of these language tweaks that's nice to have. It's a little bit of ergonomics that that's being put into the Swift language. And then there's an interesting thing called the unavailability condition. We already had the availability condition beforehand. But now we can explicitly mark things as not available. And then some, some conversion, well, some concurrency changes, that seems to be like more preparation for bigger changes that are coming in Swift six, right. So yeah, let's start with the any keyword. Do you have any thoughts on that? Adam?

Adam Rush:

I just kind of want you to stop by. I feel like generally, when changes like this happen, there's kind of like a bit of what's the word like pop rock, in like the communion, I like I kind of expected to have this reaction when, when it would get released, because anything kind of big and new, that that's changed within the language is kind of scary, I guess for for a lot of people. But I've been tracking this proposal for pretty much since it was created. And I wasn't actually sure what changes would come. So I kind of I didn't actually write about this in, in my what's coming in, in Swift 5.6. So I didn't actually cover this particular proposal on my website. But I've definitely been tracking this, I just kind of wanted to say this, it's not as scary as it as it might seem. I'm very much, I think it's a very much a real positive change. I mean, basically, what it means is that when you're defining a protocol, for example, this is the best example. And like you mentioned, Danny was actually covered this particular subject in a specific article, which I'm sure will link to. But it essentially means when you're defining a protocol you are using, as you mentioned, an existential type, which essentially means that the compiler has no idea what what size, memory, memory to allocate to that, because it's just unsure of what the type is. So in terms of in terms of the underlying performance, it can be bad. So that they're essentially exposing that to programmer level, so that they're enforcing this any keyword to, to show that you are using this existential type. It's, it's a mouthful, so that they're bringing it the program level so that you're aware that you're, you're using this, and then, you know, eventually moving towards the, the major version of six, that they'll actually start enforcing this, and it's just to kind of encourage, I guess, better performance, but a visibility there. And, and they've also done this before, but I think, you know, generally speaking, it's it's a positive move, essentially, I think what will happen is, a lot of people will just insert the any keyword and be done with and then you know, moving towards the sweepstakes, hopefully people can understand this a little bit better and start making different decisions when when building protocol. Definition So, honestly, I don't think it's a scary as it seems, I wouldn't be concerned too much. I think, you know, pick out some some articles get to understand it a bit more. And, and when it comes to defining those protocols, Is that easier to the implementation? You're just defining those types, so that the compiler knows how much memory to allocate on on that. So yeah, honestly, I think it's a really positive move. But yeah, I don't know if anyone's got any thoughts on on any of that.

Stefan Blos:

So like, like you mentioned, I think the, the more important time for it will probably be When Swift six will be released. Because the way I understand it for now, you can optionally declare any type or the ID keyword, but you don't have to install php 5.6. But starting with six, it's mandatory, right. So code that will not have it. Where is actually necessary to have it will not compile anymore. Right.

Adam Rush:

Exactly. Yeah.

Stefan Blos:

So I like the way they're introducing it, because like you mentioned, I think it's nice to, to read up on that. But not requiring users yet to actually use it when necessary. It's, I think a nice way to do something like, like a soft introduction to it. So I like the way they they're approaching this year.

Adam Rush:

And you see this all the time, actually, that they're doing it with the whole concurrency changes. So that introducing like a pre concurrency flag, which essentially means, hey, we're heading towards better concurrency and this library or our code base, or whatever you've, you've got it defined. And it's just a kind of surface is this information to the programmer level to say, hey, you know, we're moving in the right direction, we're not quite there yet. But here's a flag to show that we're moving into the right direction. And I think, all of these changes to prepare for this major, Swift, six point or which, who knows when that's gonna be coming? Probably.

Stefan Blos:

One thing that's also interesting is gonna be like, Will Apple have some specific use cases for it? Because they remember what swift UI was released, the property wrappers were newly introduced into the language. And it's basically they were just just there and only really became popular when, when you had the other, for example, state property wrappers and everything. So it really, it was really the adoption was really pushed when Apple used it themselves. So I'm curious to see whether there any keyword will also be seen see that that push? Maybe during during June when the PC will be happening? That's gonna be interesting to monitor as well.

Adam Rush:

Yeah, yeah, for sure. But I mean, yeah, I mean, like I said, generally speaking, I wouldn't be too scared by this. I think, if anything, it forces better. Programming. But I mean, I say this, but like, generally speaking, I don't think many people would actually be aware of existential types. Like it's, I mean, Swift is very good at kind of keeping this hidden. You know, we saw it right back in the early days of, of Apple, introducing Arkwright, that hides a lot of the memory management, further down, that the sort of the compiler level, so that we don't have to worry about this stuff, necessarily. And I think, you know, this is a prime example of them going, Hey, actually, we need programmers to care about this, you know, especially when, you know, apps are getting bigger that the performance of apps is so key now. Now it is. So yeah. I just, I just think this is a good move around.

Stefan Blos:

Yeah, sounds good. Sounds good. I think there's not not a lot more to tell about this, we can definitely recommend the article by Donnie walls, we will link to that in our in our show notes. So that's definitely worth reading. Okay, so the next next want to talk about our type of placeholders? I think, I think so the way I understand it, it's basically a convenience feature, right? So you can, you can basically specify, for example, an array or sending a dictionary where one of the types will be inferred by the compiler. So if it's clear, for example, that it's a string, or an integer or a double, then the compiler will be able to automatically infer the type for you. Right?

Adam Rush:

Yeah. Yeah, exactly. That it's exactly how you said it's convenience. It's sort of if there's any real benefit over then you're basically saying, hey, you know, we can swift can infer this type, basically. So yeah, I think dictionary is probably a prime example of where you would use this. So you could define one of the probably the value type, and be able to infer that so yeah, I think it's, it's more of a convenience change, that you could do this.

Stefan Blos:

So one question I would have about this is what are the limits here? Because like, the compiler still did the study to be a clear indication of the type, right? So it's not possible that so if there was really confusing, I'm just wondering how smart the compiler is, in actually knowing which type to infer.

Jeroen Leenarts:

Well, I think It's a matter of just going up the object hierarchy. And keep on doing it for as long as there's no like consensus on which type it should be. So if you have like a large dictionary with like a lot of statically, declared, properties enum, or values, as you'd say, then it has to potentially inspect all of them to be able to determine whether or not a string would do as the inferred type or that maybe you need to go to any object, if there's something that's even in there, that's not a string. So and it's really, you know, it's like one of these small language features that it's like, it's it's probably nice, probably convenience. It does indicate that I think type inference has some impact when compiling Swift code, because I don't know about you guys. But I've been able to increase compilation performance of some code bases by just being explicit about the types that I'm using and not letting the compiler infer those. So yeah, I think it's, it's it's a feature that allows a sort of a go between thing in that regards that you can just infer some parts of your types and then have other parts of your types be determined by the compiler. But it's it's not. It's not a really an exciting feature, I think. And yeah, I think the the usage is pretty straightforward. So yeah, not much we can say about it. Right.

Adam Rush:

Yeah, I think, yeah, that, I think like you said that there will be some performance benefit, I think, very, very, very minimal. In terms of that. And also, my kind of final remark on this is, you know, often these See, see these changes, which I think can be good. But often as well, let's not forget, you know, the code needs to still remain readable. And I think often these changes can can kind of move us away from that a little bit. So, yeah, I often like to define the types because I think it's a bit more readable, especially in sample code, or proof of concepts or anything, where you're kind of building out the interface of some fee, nothing defining what those types are really good, because it just makes it much more readable. So, I mean, there's got to be a balance between, you know, we've been convenient or under, are we keeping our code readable? And, you know, so yeah, I think we better keep that in mind.

Jeroen Leenarts:

Now talking about keeping the code readable. There was also an unavailability condition added to the Swift language. And I think this is it's a small change, but it's, it's a very useful change. Because up till now, if you wanted to mark some code as being only executed on a specific version of, of iOS, you had to be yet quite often had to refer to the else case of an availability check, right? Yeah. And now, and now with the unavailable, it's, it's much more straightforward. It's sort of like, you have one, we have one branch in your code, instead of two. And even though that one of those two branches is, like, not significant with the available case, but with the unavailable case, you can just mark something as, okay, if, if iOS version 15 is not available, then you need to do some work. And if we have iOS 15, available, then just skip this, which is, which is I think it's it's a nice addition. It does have some, some implication on the syntax that you have to use in these in these clauses, because the unavailable case doesn't allow for a wildcard to be used as a platform identifier. So yeah, it's convenient addition, I think, to unavailable class, it's pretty straightforward if you know available statements in your code and getting used to unavailable statements is quite easy. And I think it's this that that is one of those small things that really helps making certain types of code much more readable. But yeah, again, small change. I think, maybe under the hood, there's like a lot of things that that you need to do for that. But I think the concurrency changes that are introduced in Swift 5.6 is a bit more significant. In that you can now explicitly mark certain aspects of your code as being written before the concurrency updates on on the Swift line. language. So it cannot explicitly marks areas of code as pre concurrency. So you can put that on individual classes, structs, properties, methods and, and a few other things as well, because the pre concurrency modifier is quite selective. And yeah, I think it's a good way that if you have a code base that is a mix back between old and new style programming that new at least now can explicitly prevent other users of your codes to, to try and apply concurrency features on code that is just not ready for that yet. And there are some other course changes as well. Right?

Adam Rush:

Yeah. And this will also be enforced as well in switch six. So then it will actually start throwing errors. So this is another move to, to kind of get people using the new currency and also the new anytime that we just talked about earlier, so yeah, this is kind of you can tell we're getting very close to sort of 6.0.

Jeroen Leenarts:

What do you think this this summer swift six, or

Adam Rush:

I think that's quite likely. But then again, I'm not sure. Because they often want to give people time. You know, before enforcing these, these changes, so I'm not sure on that.

Jeroen Leenarts:

We'll see. We'll see. Yeah.

Stefan Blos:

I mean, there's a certain event happening in June where swift six might might or might not be introduced, at least, maybe not really published yet. But

Adam Rush:

yeah, and that's kind of it isn't it for 5.6, there's a few of a smaller proposals that have also been been merged. But, but that's kind of the biggest.

Jeroen Leenarts:

Yeah, I think I think at the Swift language level, they did some things to the Swift package manager that is sort of like the first steps towards getting a pluggable system going in the Swift package manager. So that things you can do in the future is, for instance, half Swift, lint integrated with the Swift package manager as like sort of a first class citizen in the ecosystem, so that you can just add a plug in for swift lint, to his fifth package declaration so that once you start working with it, for instance, your your code is automatically printed. And probably there are some crazy other use cases as well that we can come up with, once this stuff becomes available in full force. Just checking, like on Swift 5.6, if there's anything else, yeah, I really liked the documentation generator that you can now really get static websites available with doxey and that it's now officially released, you could already play around with it in release candidates. But now you should be able to, if you have some sort of code written in Swift, and you want some documentation on it, so you have some comments, you have some markdown files, in your code base in the correct places, then you can now you could already generate a documentation package out of that, which integrates really nicely with Xcode. But now you can also make that available online quite easily by just generating it out. And all you need to do is just hosted somewhere, and people can start clicking through your API documentation right away. I think it's, I think, and I hope it will do wonders for the availability of API level documentation on ostrich packages. Because in my experience, the the quality and the level of documentation that is available on like, interface level within swift packages is quite often. But it could be it could be done better. And in this fifth community, we've been getting around to it by writing more long form content about specific API. So you have more articles and stuff that that explore an API in detail. But I really like it when you as a developer get to the stage that you can make up your own minds how you want to use an API, because you are familiar enough with the API. And then with the help of an API documentation, you can really start working with it. So I'm expecting some nice things to show up online. Based on this Doxie update for static websites.

Stefan Blos:

Yep. Actually, we will we will try to use it because like there's an there's an open source package we're actually currently currently developing and we will try to use the Toxie steady costing with that. So gonna be interesting to see how easy it is for we actually have we actually have someone who has a question or wants to contribute something, which is new. So Neil, welcome. Welcome on stage. Hello. SRU. So do you have any question? Or do you want to share something? Yeah, like, what are your thoughts on existential anytime? Okay, so we already already talking about it. I think Adam already shared a few of his thoughts. But basically, it was more or less something that it's interesting to have this type. And it's actually a move into the right direction. But it will probably be more interesting, once with sixes around where the usage of the any keyword will be made. necessary, so you can ignore it. So I think that's the most interesting part about it. Oh, did I did I miss anything?

Adam Rush:

I would maybe replay this back. I don't want to, I feel like I could easily talk again for the next 10 minutes. But people might get bored of the voice.

Jeroen Leenarts:

The trainer space is being recorded. So once we close 20 space, you can scroll back and and have a listen to the beginning of when Adam talked about this topic.

Adam Rush:

In short, I would I would just say like, I think there's quite a lot of panic, or that's kind of the feeling I get on Twitter and various other platforms. I just think it's nothing to panic about this change. I think it's a good move around. And they're doing it slowly. So I just said Don't, don't panic about this change. I think it's a good move. But definitely replay it back. I kind of talked about it for about five or 10 minutes. It could be could be worth listening back on that.

Jeroen Leenarts:

Yeah. And I think it's it's typical human nature, right? Something changes and people are resistant to change in general, I think. Yes. People People like feeling in control and understanding their environment. And yeah, Swift language is changing. And then there's some big things down the pipeline as well, for swift six. So who knows what kind of cool features are still ahead of us. So switching things up a little bit. We've been talking mostly about Swift 5.6. Now, so about like a little under half an hour. But there's more that was released. And it's also in the title of this sort of space. And that's the new Xcode version. And with the new Xcode version, I really feel it's mostly bug fixes, right? A few new features that are not like really huge, I think, but there's one change that has some impact, most likely, especially if you haven't upgraded your system to MacOS moderator yet. So, yeah, if I'm correct, it's now a requirements for X codes to be running the latest main version of of Mapquest which is Monterey. So yeah, that's going to be for a number of people a big upgrade because not only are you downloading 10 gigabytes of Xcode and and trying to unpack that, but also, if you haven't yet you have to update your your MacOS now. And there's no way around it it seems unless you want to use an older version of Xcode. But my first impressions on Xcode 13.3 are that it's it's better than the previous version seems to be a little bit more stable. Which is has been a thing with Xcode over the last few months in my opinion. Not Not as many source gates questions anymore as like a year ago, but Xcode itself as a tool has its tendency to just disappear on me on my screen. And then you get the crash window. But yeah, thus far with 13.3 It's seems okay. And yeah, a number of the new features that is now available I think a big one or maybe a bigger one down the line would be the a new built in compiler system. So they're testing something there but I haven't explored that yet. And I know you have been looking at that a little bit Adam. Is there anything you can share on that?

Adam Rush:

This is golden nugget. Nobody actually really knows what about this. This is like it's almost like you know when Apple just every now and again just drop this, like increase problem and nobody really sees it, you know, laundry 2019 They're like, hey is swift UI. And by the way, here's, you know, some finance and something else. And nobody's really kind of expects it, they're doing, they're doing a huge amount of work in the compiler system and within the build system. And this is the long side, like everyone and to get Xcode to really utilize the cores, and, and, and hardware to, like, optimize performance and speed in the compiler system. And they've actually released a flag that you can set in the user defaults to enable this in kinda like beater or test mode. And I've actually shared on Twitter this morning, so you can set this user default, and utilize this kind of view, I kind of want to say a new system, but it's, I don't think it's a new system, I think it's just like a an extended version of what's already there. But with some major changes, I'm yet to use it. But I'm really looking forward to doing it and seeing what the performance is like on my on my M one, but yeah, I mean, I've shared on Twitter, you just set the use of default, and then it will start taking advantage of this new system within Xcode 13.3. So I'm really keen to see how that performs. And really curious as well, if anyone else does the same and sees any significant kind of performance improvements on the compiler.

Jeroen Leenarts:

Imagine being able to have a Mac Studio and a larger Swift code base and being able to just flat out saturate all those cores that are available on these one maximum one Ultra chips that are available. So maybe this is a feature that will that will help with the case, to watch your manager or your wallet really convincing somebody to get like one of these new Mac stereos with wouldn't have one maximum and one Ultra chip in it. Because 10 CPU cores or 20 CPU cores, that's a lot of that's a lot of CPU compute power that you have available. And it would be wonderful if if you would be able to use and utilize those to the fullest extent available when compiling your Swift code. Because, of course, if you if you run earlier versions of the M one hardware so for instance, I'm running a 13 inch Macbook and one I think Xcode can do a better job at utilizing the available performance on my on my laptop still even. So who knows how this, this feature bill will work out? So yeah, that's like one of these smaller things. And Apple has tendency to do this more often that there's like this, like this one small line in the in the release notes somewhere. Oh, yeah, we have a new feature some build system, just do a default, right? And oh, yes, please report any issues to this new build system with the feedback assistance, and then they attach a number that you should should mention when submitting feedback on this specific feature. So other things that are available in in a new Xcode version that are, you know, significant beyond fixing crashes in Xcode and underlying tools, so many

Adam Rush:

bug fixes, like I was looking for the release notes. And wow, significant amount of bug fixes, which is, which is always good to see. The only other thing I kind of pulled out there's, there's a lot of stock exchanges, loads of improvements there. So that that kind of taken over on, on the subscription changes and various other things as well worth digging into that, if you use stock it, that kind of feed I pulled out of that was that they've enabled, they've built inside, so you can actually start testing price increases. So if you're, if you've got an app that's got a subscription, and you want to kind of do a price increase, often you might want to display some UI saying hey, by the way, we're putting the prices up because of I don't know some crazy inflation going on in the world. And previously, it was quite hard to test that on simulator but now they've built that in so it's kind of a small nice nice to have they're obviously seeing some some demand there. So there's loads of stock exchanges so if you if you still kids who are worth worth digging into that and then there's also like you mentioned that the whole plugin plugin support SPM which is which is really nice. But yeah, I mean, other than that, it's it's very much kind of bug fix heavy, which is, is always nice to see, I guess.

Jeroen Leenarts:

Yeah, no, I must say if you really want to have like a single source of anything that is new in in exco to empty the underlying swift compiler definitely have a look at the Xcode 30.3 Release Notes. Because all the new Swift 5.6 additions are mentioned in there. It's still brief but with sample code in the in the release notes, which is really nice. And yeah, I think I think those are the the headline things right with Xcode being updated. I do hope that the pairing of your iOS device with with a watch device will work a lot better for a number of people because yeah, I mean, just just the number of times I had to like reboot my Apple Watch and my iPhone just to get it to work again, was I probably wore out the the power button on both devices just by this simple fact. It seems. Not that they're okay. They still work. But it is something that is. Yeah, I hope they did it. They have it fixed now in Xcode 30.3. And one thing that I really liked about the Xcode 33 release note is also that it's one of the first things with the App Store integration that resolved several lock for J Filner abilities by updating the lock for J JAR files to version two point 17.1. So it's it's again, one of those confirmations yes, we're using modern tools. Xcode, we're running at the Monterey like M one hardware and stuff like that. Oh, and by the way, there's also Java being used under the hood. Which is, which is quite funny. Because, yeah, it's that even even nowadays, that the Java language still has its tentacles into the into the Apple ecosystem. even still today. So yeah, is there anything that we need to talk about the administration or good here?

Adam Rush:

There's a another small kind of had to say like, okay, that got pushed out last night, as well as a sort of.org website is going fully open source? Which, yeah, and, you know, these fins can get just like, pushed out really quietly, and like, subtly, I guess it's really nice that the community kind of does these these talks to kind of share it with everyone. But yeah, Swift org is going fully open source. And they're going to build a working group like they normally do. And you can actually apply to, like a, almost like a maintainer. I could contribute to the website. So yeah, I'll also share it. I mean, the link to this is on Swift. org, on their blog, also, on Twitter as well. But yeah, this is also really interesting. So that this whole website is going to go open source, it's going to be really, I'm kind of curious as to what direction it gets pushed into. Because I think there's a huge demand for this site to become more of a learning platform for people who were interested in learning swift a bit more. So I'm really curious about that.

Jeroen Leenarts:

Sounds good, because especially the swift.org blog, I tend to follow that one as well. But I haven't seen this article. Yep. Because it's been two days since I last checked my RSS feeds in depth. Because I really, like I really liked pushing in this direction that the Swift language as a thing, it's becoming more and more something that is community owns, even though Apple is still one of the main drivers behind this development. But it's, it's it looks like Swift might eventually be like a viable language to do all kinds of software development with not just on the Apple platform. And I think that's cool things happening in this recording. Yeah,

Adam Rush:

yeah. And also for people not to forget about iOS 15.4 as well, but the jam is coming in, in the iOS app. People often forget about the the front end side. I always, I always kind of track to see what's going on bear affricates it's really useful to keep an eye on

Jeroen Leenarts:

Yeah, must I must say that Apple is really pushing their adoption for iOS 15.4 by including by including over 100 new emojis right? Because what's the main driver for for for people to upgrade the iPhone? I think it's the emojis.

Stefan Blos:

Yeah, but 100%

Adam Rush:

There's some big changes there like they're adding vaccination records for the whole COVID situation into the health app. Just kind of cool. And the keychain is also moving is moving more towards like a one password or similar like you can now add no some stuff like that to the keychain which is which is kind of cool. So now there's some other cool little changes to have a look at.

Jeroen Leenarts:

Okay, I already installed iOS 15.4, but didn't look at new features yet, but I'm definitely going to check out the vaccination records and the and the keychain changes, because especially the keychain changes and heard about those before, probably because I was not paying attention myself. But yeah, I think I think there's some cool stuff in there as well. Have a nice lunch if we're in the Western European timezone. And otherwise, have a great evening or great start a few days, depending on where you're at in the world. And talk to you guys later.

Stefan Blos:

Yeah, thanks for thanks for attending everybody. Thanks, Adam. And, of course for being here and sharing your thoughts. It's been very nice.