WEBVTT 00:00.000 --> 00:21.860 Alright, so we now have Ruben who's going to tell us his war stories about rewriting 00:21.860 --> 00:26.860 and things in rust and take it away. 00:26.860 --> 00:28.860 Thank you. 00:28.860 --> 00:31.860 Could we have some quiet? 00:31.860 --> 00:36.860 Okay, thank you. 00:36.860 --> 00:39.860 Alright, let's get started. 00:39.860 --> 00:46.860 So I'm going to talk about rewriting system software in rust. 00:46.860 --> 00:51.860 And to this point, some of you, I'm just going to talk about none. 00:51.860 --> 00:59.860 And then finally around 2017, I had my first commercial project, which was a map server binding 00:59.860 --> 01:06.860 to rust and map server is this mapping software where you can sort of make your own Google maps. 01:06.860 --> 01:09.860 So that's pretty cool. 01:09.860 --> 01:13.860 And then from that point on, it sort of became bigger and bigger and bigger. 01:13.860 --> 01:29.860 So then finally, in January of 2022, we got our first open source project that we could actually do for rust. 01:29.860 --> 01:36.860 Our company already worked with all of this open source software, but that was the first time that we actually made something new. 01:36.860 --> 01:40.860 And it was sort of because COVID and work was a little bit slow. 01:41.860 --> 01:43.860 Well, let's do some open source development. 01:43.860 --> 01:56.860 So we got this grant from the AnilNet Foundation, where we were out to make a PTP prototype, precision time protocol, which is a time synchronization protocol. 01:56.860 --> 02:08.860 And then around April of that year, we got into contact with Prostimo from the Internet Security Research Group, the Let's Encrypt People, to implement NTP in rust, 02:08.860 --> 02:13.860 is the other time synchronization protocol, isn't that a coincidence. 02:13.860 --> 02:19.860 And then finally, in December of that same year, I started to reach out again. 02:19.860 --> 02:27.860 And we were allowed to make a sudo implementation in rust together with the folks from Fair Systems in Berlin. 02:27.860 --> 02:31.860 And that was a real fun project to do as well. 02:31.860 --> 02:34.860 So we had some work for a couple of months. 02:34.860 --> 02:45.860 And then finally, in August of 2023, we got a massive grant from the sovereign tech friends, which is a German government-ish-based organization. 02:45.860 --> 02:48.860 These days they're called the sovereign tech agency. 02:48.860 --> 02:54.860 For our NTP and PTP work together in a project that we called pendulum. 02:54.860 --> 02:59.860 And then finally, in April of 2024, we were like, well, this is getting quite a lot. 02:59.860 --> 03:02.860 Let's make it into a non-profit foundation. 03:02.860 --> 03:05.860 And that is what my shirt is all about. 03:05.860 --> 03:07.860 It's the Fairfax tech foundation. 03:07.860 --> 03:13.860 So all of our open source work is now in a non-profits organization. 03:13.860 --> 03:16.860 So what then does Fairfax accurately do? 03:16.860 --> 03:20.860 So we have sort of four main things that we do. 03:20.860 --> 03:26.860 First, we have time synchronizations or the pendulum project, the PTP and NTP work. 03:26.860 --> 03:29.860 Then we have the privilege boundary, which is sue. 03:29.860 --> 03:33.860 Then we have data compression, which is ZLIP and BZIP. 03:33.860 --> 03:44.860 And we have a smart grid protocol, which is open leader, which is automatic demand response protocol for the power grid. 03:44.860 --> 03:55.860 And then we have sort of two sort of secondary things, which is TTRS, which is our education project, where you have an open source university education course. 03:55.860 --> 03:57.860 Which you can try out. 03:57.860 --> 04:05.860 And then finally, we have this sort of site project born out of ZLIP, mostly, where we want to make Rust faster than C. 04:05.860 --> 04:15.860 Because sometimes there are these edge cases, especially with ZLIP, where Rust's code gen isn't quite the same as we can do with C. 04:15.860 --> 04:19.860 So there are still something to be gained there. 04:19.860 --> 04:27.860 And our tech line is sort of then open infrastructure software for the public interest. 04:27.860 --> 04:40.860 So what is system software? And I looked up on Wikipedia and Wikipedia system software is software designed to provide a platform for other software, which is a little bit vague. 04:40.860 --> 04:47.860 And I don't really have a good definition of what system software is, so it's going to stay a little bit vague. 04:47.860 --> 04:54.860 But I say generally, system software is a little bit low level software, it's not like a web page or something. 04:54.860 --> 05:01.860 And generally, it's relatively low overhead and generally relatively high performance. 05:01.860 --> 05:15.860 And then most of the time, you're sort of implementing protocols, algorithms and formats, like NTP, PTP, ZLIP is a format and then sudo, it doesn't really fit into any of these. 05:15.860 --> 05:19.860 So apparently it's not just this, it's more than that. 05:19.860 --> 05:27.860 So it's got something to do with a little bit more foundational software for your system. 05:27.860 --> 05:34.860 So why did we pick all of these projects that I just showed you on the previous slides? 05:34.860 --> 05:37.860 And basically the main thing here is it's got to be interesting. 05:37.860 --> 05:44.860 It's got to be something that's going to be fun to do for a long time because this is something that we want to keep on doing for a longer time. 05:44.860 --> 05:54.860 So not just something where it's like just earn some money and then just put it out there and then not maintain it anymore. 05:54.860 --> 06:01.860 This is got to be something that's going to stay up for a longer time and it's got to be relevant for a longer time. 06:01.860 --> 06:06.860 So what if you were to do this for your own? 06:07.860 --> 06:14.860 I'd say like we'll just start with the projects with the most buffer overflow issues, right? 06:14.860 --> 06:25.860 And I mean sure you can do that but it's also quite limiting because it's not just buffer overflows where the rest is better than the rest. 06:25.860 --> 06:28.860 It's a little bit more than that. 06:28.860 --> 06:34.860 And also if you try and do this too much then you might turn into the rest evangelism strike force. 06:34.860 --> 06:40.860 And that's something where you can get some irritation by some people if you do that too much. 06:40.860 --> 06:52.860 So like don't turn into this crow that's that's someone saying something and then have you tried rosts. 06:52.860 --> 06:54.860 It's memory safety you know. 06:54.860 --> 06:56.860 So do a little bit better than that. 06:56.860 --> 07:04.860 So just rewriting and rost is not enough is my sort of statement here because she got to be careful about those negatives. 07:04.860 --> 07:10.860 Because every time you just say I'm just going to rewrite it in rust and then everyone's going to have to deal with that. 07:10.860 --> 07:15.860 You're splitting communities because maybe not everyone likes that you're writing it in rust. 07:15.860 --> 07:19.860 And maybe not everyone wants you to write it in rust. 07:19.860 --> 07:22.860 And then also users won't see those changes. 07:22.860 --> 07:27.860 If you're just rewriting in rust and then they'll think oh this part is just two kinds of things. 07:27.860 --> 07:35.860 So for example entropy if we are at the IATF and to be working group the average age is about 60 or something. 07:35.860 --> 07:43.860 And then we're trying to bring that age a little bit down because this is important so far that everyone is relying on everyone wants their computers to have the current time. 07:43.860 --> 07:54.860 But then if all the people that are working on this are slowly aging to the end of their working life then yeah you're sort of starting to get a bit of a trouble there. 07:54.860 --> 08:03.860 And there's also other pieces such as the sudo software is developed by one single person and one single person only and everyone's relying on this tool. 08:03.860 --> 08:08.860 But there's only basically one person who knows how this software works. 08:08.860 --> 08:15.860 So again something where I would say that's not a good situation to be in. 08:15.860 --> 08:21.860 Other things to look at is does that project have a history of security issues. 08:21.860 --> 08:28.860 I'm not just memory safety issues but security issues in general because security issues don't just have to be memory issues. 08:28.860 --> 08:32.860 There can be lots of security issues. 08:32.860 --> 08:42.860 So if a project has security issues quite often then probably there's something fundamental going on and maybe the rest types system are the rest. 08:42.860 --> 08:47.860 Like way of thinking about things can actually help in that specific domain. 08:47.860 --> 09:02.860 The other thing to also note there is is if you have unstructured code bases where things are just randomly going through and maybe again the rest type system is something that can help or the rest way of doing things. 09:02.860 --> 09:11.860 And the final thing I'd note here is that all of these projects are not specifically related to rest because all of these things are about system utilities. 09:11.860 --> 09:26.860 That are meant for like the whole computer as the whole computer and operating system as a whole and not specifically something that's related to rest. 09:26.860 --> 09:33.860 So let's say we found that magical project that could use some rest. 09:33.860 --> 09:43.860 The first thing I'd say is do you already know like the entire problem space are you aware of all the intricacies in that specific problem space. 09:43.860 --> 10:00.860 Because if you're not then just start a hobby like start to enjoy this stuff because otherwise you're going to burn out at some points and then like you created some code and then this is just going to live on get up and then no one's going to look at it and that's not great. 10:00.860 --> 10:15.860 I mean it helps you learn stuff but if your goal is that you want to evolve the ecosystem and then just making some code on get up is not enough I will say at least. 10:15.860 --> 10:23.860 And the other thing I'd say is even if you think well breasts fine just let it exist and I don't really care about it. 10:23.860 --> 10:38.860 I'd still say encourage people to try do something with rest because encouraging those people might also encourage those people to enjoy to join your ecosystem of your specific protocol or algorithm or whatever. 10:38.860 --> 10:43.860 So it's sort of widening your user base. 10:43.860 --> 11:08.860 And make sure when when you're looking at this to look at competing implementations as well look at every implementation that's there be where do if you're working on something with like GPL and you're thinking oh I'm going to write this in MIT and then you might run into some licensing issues as well so like there's caveats. 11:08.860 --> 11:20.860 So this is sort of my business side here is saying well we have to think about something other than just memory safety type safety. 11:20.860 --> 11:28.860 We have to think about this unique selling point for our new implementation for this protocol idea or whatever. 11:28.860 --> 11:35.860 So we have to find some unique selling points and this is very business speak but sure. 11:35.860 --> 11:47.860 Because we we respore on us we we really enjoy our type safety and our memory safety but that's not something users looked at all the features that were in sudo which is quite a lot. 11:47.860 --> 12:00.860 It might be surprising because I did notice I just thought it's a way to get to root but it does like a thousand things it has a thousand features and then maybe some of those features were not necessary for almost everyone. 12:00.860 --> 12:12.860 And we kind of chose to limit the number of features that that were in our implementation but still made it usable for almost everyone that uses sudo in a daily basis. 12:12.860 --> 12:25.860 And then for anspdrs for example we focus on network time security that which is a secured variant of network the network time protocol which is completely unscured and uninterrupted and whatever. 12:25.860 --> 12:32.860 So there's again a focus on something specific other than the rest programming language. 12:32.860 --> 12:37.860 Or maybe you could focus on performance because that's something that rs can do. 12:37.860 --> 12:42.860 But maybe then add a little bit of fun safe even though that was the thing that you shouldn't do. 12:42.860 --> 12:51.860 Maybe that little bit of unsafe can actually make your program faster and if you can explain your little bit of unsafe away then sure maybe that's fine. 12:51.860 --> 12:58.860 So for example in Z Flip we use a lot of simply instructions which are unsafe. 12:58.860 --> 13:03.860 But we can explain why we need those specific instructions to make it fast. 13:03.860 --> 13:08.860 So we can sort of explain why this is okay to do. 13:08.860 --> 13:18.860 And of course if you're thinking about performance then make sure that you actually verify those things and you create some benchmarks and of course there is always problems with benchmarks. 13:18.860 --> 13:25.860 But like have some proof that you're actually fast. 13:25.860 --> 13:29.860 Another thing we could do is focus on stability and stability. 13:29.860 --> 13:31.860 I can sort of see that in two ways. 13:31.860 --> 13:35.860 Maybe think about memory leaks because for us doesn't protect against memory leaks. 13:35.860 --> 13:40.860 If you can just leak a box and then it's gone and doesn't get cleaned up. 13:40.860 --> 13:45.860 And there are lots of other ways in which you could leak memory because that's not a memory safety issue. 13:45.860 --> 13:59.860 But it is a stability issue because if you keep on leaking memory for our process that's supposed to long for run for a long time then well you run into problems and users get irritated that your software isn't great. 13:59.860 --> 14:05.860 So maybe that's something you can focus on and show that actually this thing can run stable for a long time. 14:05.860 --> 14:09.860 Which could look at this in another way in stable APIs. 14:09.860 --> 14:17.860 You can have APIs that maybe don't change for a long time and you know that this API is going to be there always and you can trust on it. 14:17.860 --> 14:30.860 Which is for example the way we did it in Z Flip where our C interface or the C interface that already existed for is that the poor a very long time is the primary interface but which you use at the press. 14:30.860 --> 14:37.860 So that sort of guarantees that we have a stable interface and that won't change for a long time. 14:37.860 --> 14:52.860 And for NSPDRS we very quickly started working toward a one point over release where we had stability guarantees about which parameters and which functions were stable in the whole project. 14:53.860 --> 15:05.860 So focus on your strength and use that strength to help others even if that other project is not written in Rust because that sort of makes the whole ecosystem better and not just your project. 15:05.860 --> 15:18.860 That's what I think this is all about like Rust is all about making things better and the only way to make things better sometimes is to even look at those other implementation even if they're in C and make sure that they also get better. 15:18.860 --> 15:30.860 So for example with NSPD we want to make sure that C implementation support the same protocols as we do so everyone can use that network time secured. 15:30.860 --> 15:43.860 And basically be to change you want to you want to see make sure that that you show the way to make things better and then other people can adopt your way of changing things. 15:43.860 --> 15:50.860 So help those other implementation and document what works in your implementation what doesn't work in your implementation. 15:50.860 --> 16:02.860 Another way to look at focuses for example are NSPD and PCP implementations both have different algorithm for basically determining the time offset. 16:02.860 --> 16:13.860 And that offset is that that algorithm is something new compared to the rest of the ecosystem because it's sort of self-learning a little bit it's not AI. 16:13.860 --> 16:15.860 I'd say it's not AI. 16:15.860 --> 16:23.860 But it's self-learning it's tuning automatically based on the environment and that's something that our NTP and PTP implementations don't have. 16:23.860 --> 16:30.860 So that's something where we can say we understand this problem domain and we thought aware of like algorithm choices and such. 16:30.860 --> 16:36.860 We were just implementing the protocol itself and just doing whatever was needed to get to get this started. 16:36.860 --> 16:47.860 And then after a while we learned sort of ways in which we could improve the situation and that's where our own algorithm came into play. 16:47.860 --> 16:51.860 And that sort of changed a little bit our unique selling point. 16:51.860 --> 16:53.860 So take some time. 16:53.860 --> 16:54.860 So no rush. 16:54.860 --> 16:59.860 Don't worry about all this publishing on Chris so that I know and making sure that's releases. 16:59.860 --> 17:11.860 Just focus on like sort of going through all this code and going through all these algorithms and let this flow a little bit and take some time and no rush. 17:11.860 --> 17:15.860 I mean get a person going anywhere crazy so they're always not going anywhere. 17:15.860 --> 17:17.860 Don't worry. 17:18.860 --> 17:32.860 So while you're working on your projects I do have a couple of ways in which I want to take some points of attention here specifically documentation dependencies and distribution. 17:32.860 --> 17:34.860 So first documentation. 17:34.860 --> 17:39.860 Okay there's a little bit of first code here. 17:39.860 --> 17:49.860 So obviously you have this for bit missing docs and for bits and documents that say unsafe block so all your code is perfectly documented so you have your documentation in place right. 17:49.860 --> 17:53.860 You don't need anymore documentation. 17:53.860 --> 18:01.860 And you have I don't know you maybe have duct tests and written in every case so you can even see examples of how to use this code but. 18:01.860 --> 18:10.860 I would say that's fine that's that's great that's reference guide that's that's the rest of you for you. 18:10.860 --> 18:27.860 But that's not what users use because users use like a book like the programming language which is like the thing that you used to get started with rest before you look at the reference documentation before you look at which methods are available at a vector. 18:27.860 --> 18:34.860 You need to understand what this language is all about and that's the same for your project as well because users. 18:34.860 --> 18:49.860 Sort of understand the global principle of your your piece of software but they don't understand the specific implementation details and the documentation that rest of the rights is all about implementation details I'd say. 18:49.860 --> 18:56.860 So you need other stuff you need examples you need tutorials you need a high level guide you need sort of reference guides for. 18:56.860 --> 19:04.860 The actual like usage of your program and that's other documentation than just rest dogs. 19:04.860 --> 19:18.860 So that's something where I think you need to take care of that stuff to make your project like the best project it can be and also to show other people like what your project is actually doing. 19:18.860 --> 19:27.860 And then dependencies that's that's not a thing that we sort of had to find out because dependencies solve problems that. 19:27.860 --> 19:35.860 So so we don't have to do it ourselves so we can just take in a dependency and that will solve a certain problem and then we just use some code from them. 19:35.860 --> 19:47.860 And the rest ecosystem does offer a lot of libraries that we can use but they're all of varying quality and varying ways in which you like sort of know what the dependency is all about. 19:47.860 --> 19:58.860 But if you're a new project I'd say just use everything you can because you need to focus on getting your problem solved first before you're focusing on these kind of things. 19:58.860 --> 20:06.860 But then after a while you're a nice stack of boxes turns into this like horrible or library or whatever. 20:07.860 --> 20:16.860 And that also means that you have to trust all of those people and if you look at just a small project you probably have hundreds of people were sort of secrets. 20:16.860 --> 20:27.860 Collaborators with your project and yeah that there's a certain risk there. 20:27.860 --> 20:39.860 Something that you need to be aware of like can I trust these people and is this something that I want to have in my own program. 20:39.860 --> 20:43.860 So you have to take all of that into consideration. 20:43.860 --> 20:54.860 For example in in suitu we had this this password prompt library but that password prompt library was never used in a context where suitu is used where suitu runs as a set UID binary. 20:54.860 --> 21:03.860 Which is a binary that you can call and then it runs as roots or as the user that the the binary zone by even though you yourself are not root. 21:03.860 --> 21:23.860 So that's sort of a scary context to run in so you need to be aware that all those libraries that you're using are actually aware that they're running in that context and generally library authors are not aware of that because like who who's going to think that they're going to run as a set UID library no one's going to think that. 21:23.860 --> 21:38.860 That's why for at least two or us we basically removed almost every dependency that we had and we now only have four which are like log and something like lipstick or something so like very basic dependencies only because. 21:38.860 --> 21:48.860 All of these dependency authors and we can't like I don't blame them because I can't expect everyone to run in a set UID context. 21:48.860 --> 21:57.860 So that's something where our use case differ from all of those library use cases and we had to reevaluate all the dependencies that we had included initially. 22:01.860 --> 22:08.860 So dependencies trusting is nice but verifying is better. 22:08.860 --> 22:23.860 You can use tooling like cargo vet to make sure that all of those dependencies are actually audited that someone has actually looked at the changes since the last time and you can do that yourself you basically have to do that yourself. 22:23.860 --> 22:52.860 We can also sort of share the load with other people so especially the people from Mozilla do this a lot day they basically every dependency that they have they they audited and then they sort of added to their list of what it dependencies and then you can sort of say well I trust Mozilla to do the right thing and I'll pull in everything that they verified and then I can add my own verification on top of that and then I can sort of build this web of trust of dependencies. 22:53.860 --> 23:03.860 And there's another thing about dependencies and that's about the distribution story and this is where I'm sort of going off a little bit. 23:03.860 --> 23:11.860 And if you're working with Linux and one of the targets for your Linux based program is going to be deviant. 23:11.860 --> 23:29.860 And deviant chooses to package each individual dependency just one version as a source package on deviant which means that all of the libraries all of the programs that that are posted on deviant all of to share the same version. 23:29.860 --> 23:36.860 Of that specific library which means that you're sharing the same version with all of the other tools that deviant wants to grab and pull in to there. 23:36.860 --> 23:52.860 So that's something that you need to be aware of and it's not specifically to call a deviant that there are way of packaging things is weird or something because that's just the way that deviant works that's just the way that you have to do with stuff. 23:52.860 --> 24:07.860 But I'd say that's fine because like I see the distributions that eventually take apart software as sort of our contributors as well because they eventually are ending up putting their software into their distribution. 24:07.860 --> 24:15.860 It's not my distribution, it's their distribution and they have their ways of working there and we sort of have to accept that that's just the way that they work. 24:15.860 --> 24:23.860 If I want to get my user-based as large as possible, that's just what I have to deal with as a software package maintainer. 24:23.860 --> 24:35.860 And like I might think that maybe the rest way of doing things is better and maybe I do think that, but I still have to deal with this. 24:35.860 --> 24:49.860 So again that's something where you just need to be aware and just need to know that these kinds of things happen all of these distributions have their own sort of ways in which they want to do stuff and I need to accept that. 24:49.860 --> 24:51.860 This is the way that they actually do stuff. 24:51.860 --> 24:56.860 We made by just supporting the widest ecosystems so I need to support all of these different distribution. 24:56.860 --> 25:06.860 I need to support all of them because then I have the widest install base and I can get the widest usage of my package. 25:06.860 --> 25:14.860 But still you probably want to push to create so they are because lots of the things still still want to use great so they are as their source. 25:14.860 --> 25:33.860 But then whoops, my crate is not available because someone decided that NTPDRS is perfectly a great name and then we'll just register NTPDRS and then you look at the source of the package and there's just like 10 lines of code in there because someone decided, well it was just a great idea and then they dropped it. 25:33.860 --> 25:45.860 And that's sort of maybe a little bit irritating because then you're like, but I actually made it instead of you just pushing 10 lines of code but I'm just giving a lot of our name I'd say. 25:45.860 --> 25:56.860 And that can be harder than you might think because NTPDRS is a pretty generic name, it's just NTPDRS. 25:56.860 --> 26:13.860 But we tried to change the name, we tried to think of new names but that's sort of fails because we were getting into this phase where we're thinking names up by committee sort of everyone voted for their favorite name and then eventually like no one could agree on what what was then the perfect name for this thing. 26:13.860 --> 26:19.860 So we just contacted the person who owned the package name and they said sure I'll transfer it to you and the program was gonna wait. 26:19.860 --> 26:34.860 So but it helps if you have something to show because we only did this once we had like a working thing we actually could show that we had NTP so far. 26:34.860 --> 26:37.860 So in the end after all this you need to build a trust. 26:37.860 --> 26:43.860 You need to build a trust with users, with contributors, with dependency maintainers, but also with downstream maintainers. 26:43.860 --> 27:00.860 All of these people, all of these different people with all of these different goals and ideas, you all need to show to all of those people that you're reliable partner that you have the knowledge to like sort of get this working. 27:00.860 --> 27:09.860 And then like this this is something that takes time because there's no way around this you need to show that that you can do this for a longer time. 27:09.860 --> 27:20.860 And the one thing I would specifically add here is that you need to have a way to handle security issues. 27:20.860 --> 27:28.860 You need even if you just set up a simple email address that's fine or if you set up like get up advisories or something at that time. 27:28.860 --> 27:38.860 But you need to have a way to let users know there is security issue and you need to have a way to contact you about security issues without creating a public issue. 27:38.860 --> 27:42.860 So you can actually fix the thing before everyone knows about it. 27:42.860 --> 27:48.860 So that's the one thing I would really advise you to do something. 27:48.860 --> 27:55.860 So we picked that project that needed rust, rewrite it in rust treatment. 27:55.860 --> 27:58.860 We found something to focus on that uniquely identified our project. 27:58.860 --> 28:01.860 We iterated and created the best software package ever. 28:01.860 --> 28:04.860 We made the best documentation ever surely. 28:04.860 --> 28:08.860 We limited trusted and verified all of our dependencies. 28:08.860 --> 28:11.860 We distributed the software to the wideest audience possible. 28:11.860 --> 28:16.860 We've communicated to everyone so everyone's now really trust us. 28:17.860 --> 28:20.860 So what are you waiting for? 28:22.860 --> 28:25.860 Any questions? 28:34.860 --> 28:42.860 I just remind people to remind people to not get up and make loads of noise leaving until the questions are over thanks. 28:46.860 --> 28:53.860 Hello, thank you. 28:53.860 --> 28:58.860 How can the rust community avoid to run into the maintenance problems? 28:58.860 --> 29:01.860 Let's say after the height. 29:01.860 --> 29:05.860 I mean the question of course is if rust is really high for not. 29:05.860 --> 29:07.860 I'd say it's not. 29:07.860 --> 29:11.860 It's actually something that really shows that it works. 29:11.860 --> 29:15.860 But other than that this is I'd say it's mostly a funding problem. 29:15.860 --> 29:19.860 Like we're doing this as a company and as a foundation. 29:19.860 --> 29:23.860 Like we're not running this as individual users. 29:23.860 --> 29:29.860 But we're running this as like a company with more people than just one. 29:29.860 --> 29:31.860 And that's sort of our way in trying this with eventually. 29:31.860 --> 29:35.860 This is just a funding problem and I don't have the answer to a funding problem. 29:35.860 --> 29:37.860 There is a funding difference tomorrow. 29:37.860 --> 29:41.860 So maybe they have more answers to that. 29:45.860 --> 29:54.860 Everybody knows the story. 29:54.860 --> 29:57.860 Everyone should trust that it will do the right thing. 29:57.860 --> 30:00.860 But then it turned out that it didn't do the right thing. 30:00.860 --> 30:05.860 Because no one looked at it. 30:05.860 --> 30:08.860 Okay, if there's no more questions, thank you Rubin. 30:08.860 --> 30:18.860 Thank you.