Let me introduce myself anyway. My name is Pablo Fedache. I work for Skazka. Do you know it? Do you use it? You should use it. Or even better, you should join it. We do pretty good stuff and we are hiding, so you know. But I'm not here to speak about myself or my company. I'm here to speak about the creators and mystified. And what we will try to do is try to understand what the ad symbol, what this syntactic sugar does. And to do that, actually, we're not going to talk about the creators. We're going to talk about namespaces and scopes. Because if we really want to understand the creators, we have to understand namespaces and scopes in Python. Because if you understand them, you will really understand how a decorator works. How many of you have implemented a decorator? Raise your hand. Whoa, a lot. And you understand what are you doing when you implement it? Or you just stack overflow, copy, paste, rename, replace something and cross the fingers and it works. So let's try to understand why it works. So at the end what we will do is we will implement our own handcrafted decorator. We will try to understand all the basics behind the creators and then we will implement our own decorator in a really, really simple process. You will see that at the end it's really easy, really simple to understand. But before proceeding with the cool stuff, let me show you something that we will use during the talk. In first place, this is a really simple software catch. I have an order at Dick where I store keys and then I retrieve the keys. Do you know order at Dick? Raise your hand. For the rest of you, order at Dick is a dictionary which also keeps the order in which you inserted the keys inside the dictionary. Why do I use an order at Dick? Because I can limit the size. I want to limit the size of this catch. It's really simple catch, but I want to limit the size. So you can see the pop item last equal false here. It means that Python automatically removes the oldest, the first inserted item when the dictionary is full, or when the dictionary reaches the size that they want to limit. Do you understand this catch? Yes? Pretty simple, right? Don't use it. Never use it. Please, never. This is a crappy catch. And it does not do what we would like to do usually. But for the sake of the example, we will use it. But usually you should use funtals.lrucatch since Python 3.2 or 3.3, I don't remember. But you can find the code to implement it actually. I think it's in PyPy, in PyPy, for 2.7 and 2.6 also. Use that if you need a software catch. More useful stuff for the talk. Factorial and Fionacci, do you know them? Do you remember them? Yeah? Implemented in recursive way so the function calls itself several times. In the case of factorial, only one recursive call. But in the case of Fionacci, two recursive calls. So you can understand that Fionacci is way, way more complex. Right? Cool. Is it right? Yes? No? Are we awake? However, there is one thing. Or more than one thing. What about this? Did you ever try to figure out how is it possible that you are accessing catch there? How many of you come from maybe Java or the net? Really? You're kidding. For the five of Java or the net, is it worth to do this? Access maybe here, where is my mouse here? Access maybe here, the element declared outside the function. Is it worth or not? What do you think? For the ones in Python, maybe it's like normal. Yeah, I do it every day and there is no problem. But there is something there that lets you access that name. Did you ever try to think about it? What about this? How is it possible that the function calls itself? How do you know that you are going to have this name when you are being created? I'm a function and I'm created and I want to call myself. How do I do it? There is a magic there. Let's see another example. Even simpler. We can import paths from one module. Or we can import paths from another module and there is no clash there. Well, if you do both in the same place, one overrides the other, because they have the same name. But they are declaring different modules and they don't clash. How does it work? What's happening here? Or even I can have a function with again path as one of the arguments. And again, no clash, no problem here. Compiler doesn't come, well, compiler. Interpreter doesn't come play. It works, right? It's something natural in Python because you use it and it works this way and you program and you see it and you think, well, this is the way it works, right? Why? Why is the way it works? Why is it happening? Let me introduce namespaces. Woohoo! Come on. Spaces, oops, sorry. That's it, that's it! Come on, guys! Thank you. What's a namespace? A namespace is a mapping for names from names to objects. Do you know in Python everything is a pointer? So a name is a pointer. It's a name you are giving to the pointer to an object. And that's why, well, no. Let me explain something else. Some examples of namespaces. The built-in names functions acceptance. We implement something like try accept system error in out exception, whatever. How is it working? What is the name declared? How is it possible that you are getting that without importing? Because that name is an namespace that you can access always. We'll see how this always works, how this access works, okay? But that's the built-ins. There are others. There is the global names in every module, like the cache we saw. Cache is a global name in a module or a top-level attribute, if you want to call it this way, because at the end it's only an attribute inside a module. Globals, what we call globals in Python, maybe it's a misleading name because in our language it's a global.  A global is only a top-level attribute in a module and you can only access from inside the module. So it's just to say top-level attribute, I think, or more accurate. There are also local names in a function invocation. The cache argument that I showed you. The cache argument of the function is a local name inside the function. What's this inside? We'll see it. There is also the last one, which is maybe the weirdest one, but the thing is when the interpreter runs, it also creates some top-level names that are accessible for you. They are not the built-ins, but they are there and are relative to that execution of the interpreter. But we cannot make this one. So there is no relation between names in different namespaces. That's why we can have path in one module and path in another module because they are in different namespaces and that's why they don't clash. If you use the same name in the same namespace, what would happen is that you are replacing the pointer to the object. You are assigning a new object to that name, right? Another thing, namespaces are created and deleted at different moments and have different lifetimes. Let's see more examples. The namespace is created when the path interpreter starts and it's never deleted until you close interpreter, of course. Right? What about the module global namespace? It's created when you import... No Wi-Fi, sorry.  As I was saying, the top-level attributes of a module is created for first-time the namespace when you import the module for first-time, also. And then it's there because Python uses it. If you import the same module from different places in your code, in your application, it's only... Let's say that the file is only read once and Python stores and keeps it inside the memory. So the namespace is created there the first time and that's it. Unless you do something like reload. Do you know reload? And that's the way to destroy the namespace and create it again. That's the only way you have to do it. Otherwise, the namespace will remain there together with the imported module. However, function local namespace is created every time you call the function. Actually, it's there, but it's filled every time you call the function. And why is that? What does it mean that it's filled? Well, it's because the scopes. What's a scope? A scope is an extra region of a program where namespace is directly accessible. Do you get it? So actually, it's a scope which tells you that when you are in a function, you can access the global namespace of the module where the function is declared. That's the scope of the function. And the scope is determined a static alley. It means that the first time that Python interprets that function takes the code you wrote and interprets it, Python figures out what are the accessible namespaces. What is the scope of the function? And at that moment, only at that moment is when Python computes all the stuff accessible from the function. If you have nested functions, you declare a function inside another function, inside another function inside a module, then you have different namespaces and all of them are accessible. They are used dynamically, however. Depending on where you are, or what you are executing at that moment, you have a different scope. A different scope is applied. So a different set of namespaces are accessible at every moment. Yeah, that's obvious. At the end, it's obvious, right? This is how it works. You call a function, then you have access to the locals plus all the globals. When you go out of the function, you have access to the locals of the function anymore. That's a scope. At least three nested scopes whose namespace is directly accessible. Let's see them. The innermost scope contains local names. As I said, when you are inside a function, the scope is where you can access inside the function. Then you have all the enclosing functions. Enclosing when declaring. Remember, declaring, not calling. If you call a function, and that function calls another function, you access the locals of the calling functions. That's obvious. You only access what you declare. Okay, so this only works for nested functions. Do you remember how we implement a decorator with a nested function, right? That's why I'm explaining this. After the function and all the enclosing functions, what we have is the current module global names. Current module is the module again where the function is declared, not the module from where you are calling. Okay, this is really important. A function only access the wrongly called globals inside the module where the function is declared. Okay, we have the buildings, and that's the outer most accessible namespace. Everything clear so far? Yeah? Yeah? Cool. So names asserts in nested scopes from inside out, from the inner most to the outer most. In the example of the function with an argument called path, when you send a function, you get to retrieve path, you get that local name. But if in the same module you have another function which does not have an argument called path, then Python will look in the outer namespaces. And if you were importing OS.path, then you would get that path. Or it would fail. If Python goes from the inner most to the outer most namespace, trying to get the name and it doesn't find the name, then it's when you get an attribute error. Right? From one to the other. Remember this also. The access is only for the outer namespaces. You can only change the names in your local namespace except the globals if you declare them as global. Did you know the global keyword? If you don't, you should come to the training tomorrow. Let's see a bit of codes. Yeah! This is it. In green we have the inner most scope. With the local names. All the names declared there are the names that you can access when you are inside the function as locals. So you can modify them. Then you have the globals which is the next namespace. And then you have the buildings. What happens with the names here? You cannot access them from this module. This is a module. This is a file. You cannot access the stuff in your command line or in any other file, right? So you could see it as a kind of tree. The upper most, the outer most, is the building names. That's the upper most namespace. And then in the leaves you have the locals namespaces for every function. Is it clear? Any questions? So far? Let's take this example. Let's spend one minute trying to understand what it does. I have a function which does something, forget this something, and returns an attribute. What's this attribute? Actually this attribute is another function which I create here. This is a nested function declaration. So I return the function. What does this function? It does a power, right? With x and y. Where is y? Yeah, we will see it with more detail. How it works?  Do you see how it works? Does it have sense? So where is y defined? Let's see the scopes. We have in green again the innermost scope. In red we have an intermediate scope, the enclosing function. And in blue we have the globals. And in yellow we would have here also the buildings. So where is this namespace? What happened with it? We have y there declared, right? y is declared here in this namespace with a given value. 4 in the example. So the thing is that we have a closure. This is called closure. Did you know closures? Raise your hand.  Correct me please if I'm wrong. So you can see the closure here. This is the enclosing function namespace, but only a small portion of the enclosing function namespace. Why? Because as I said, when you declare the function and Python interprets it, Python computes the scope of the function, and Python determines that the local, the innermost function will access something from the intermediate namespace. And as you will need that thing accessible always, Python creates this closure. A kind of temporal namespace where that name is stored. And that name y, letter y, pointing to an integer with value 4 is stored there. And it remains there while you are using the function here. So y raised to 4 is a function here, a valid function. We have that closure there stored. And as you can see, actually the closure is a hidden attribute inside the own function. We have also the globals. There is another funny thing in the example. And it's the fact that as I said, I declare x here, I also have a different x outside, and there is no problem. I'm not replacing one with the other. And we can see here how we have in the globals the x. Everything clear? So in better words, a closure is a reference to each of the non-local variables of the function. And again the same colors. This is the enclosing, this is the enclosing function is called the closure. So far, well, decorators, come on, what's this? I'm fooling you, no, I'm sorry. We will do a decorator, I promise you. We will manually apply a decorator. Let's go back to the functions. Remember factorial and Fibonacci? Factorial is pretty fast, right? For 35, it takes 0.00007. That's fast. However, check Fibonacci. For 35. Come on, it's almost seven seconds. 1000 times slower. Amazing, right? Such a small difference in the implementation. This is the recursive calls graph for Fibonacci of 5. And check the number of calls that we are doing. It's amazing, imagine for 35. I will need the whole walls of the whole room. So, do you remember we have a cache? Yeah? Do you know what's memoization? Let's apply it. Has sense, right? Do you know what's memoization? Raise your hand. Cool. Memoization is a technique to store the result of a call to a function with the arguments. This way, you can retrieve the same result. If you know that the call is deterministic and you will get the same result, you can use the cache result, the store result, instead of calling the function and spending all the execution time of the function. That's memoization. So, it works. The changes are... If I find my mouse, the changes are here. First thing, if it's not the base case, I check inside the cache. If I have the value stored, I use it. Otherwise, I do the recursive call and then I store the value and write on it. So, check now. It's as fast as a factorial. That's a 1,000 times improvement. It's amazing, right? We can compete even with an edge of 100 and it takes also nothing, almost nothing. However, don't repeat yourself. Come on. Why do we want to apply for factorial exactly the same trick? Do we have to implement factorial again? That's ugly. Come on. We had the function working fine and now we change its implementation for catching. Do we need two different functions? One if I won't catch, one if I don't want. No. No. We will do a magic trick. Pay attention. Yeah, I'm a magician. I mentioned in the introduction, I'm sorry. This is a trick. The function remains unchanged, completely unchanged. You see it? I key my function. I store an alternative name to retrieve my function because at the end a function is an object also. So, I have the function object somewhere in Python memory with a pointer called Fibonacci and I take another pointer called Fibonacci and then I change Fibonacci. And this is a question. This is a trick. Which function is called here? I'm fooling the Fibonacci function. The own function believes that it's calling itself and it's false. It's not happening anymore. Let's see it with the colors and just in case let's repeat the trick in a slow motion. First thing, I create the function. This is what happened. I have a global name called Fibonacci which points to an object, function object, which has this code. Then I create the real Fibonacci name, real field which points to the same object. Just a pointer. Just an alternative name to access the same object. And then here comes a trick. Check the colors, the green and the red one. Now I create another Fibonacci. What happens when I create a new function called Fibonacci? I'm replacing the name in the globals. That's why I have it in green. You can check the ID. And now I have two function objects. The second one calls the alternative name. I always swap them. That's a trick. Part of the trick is that the original function does not know it. Hacker and magician. Don't forget it. But let's make it even more reusable. Even more. Let's make it to work with any function. Kind of any. This is a star because it will work only for functions receiving one argument. That's the any. But it will work for any other function. And we create a function generator. Again, we saw that with the powers. We do a similar trick. We create a function which creates a nested function and returns that function to let you use it. Why? Because we have to provide the function to memoize, the function to remember to catch the calls and reuse the result. Because here the only thing that we do is we call the catch with the argument. In case we don't retrieve the value we call the function to memoize we store the value and we return the value. Check only the code of the nested function. And then it works. Do you get it? Is it clear? Yeah? No? And it works for Fibonacci and it works for factorial. Right? 250, come on, 250. Without memoization it would take all the conference. And finally a long last decorator. Woohoo! Let's see decorator.  We spoke about the add symbol. What is the add symbol? Pay attention. It's here. It's here. We have it. We have it. You see it? That's all the thing the add symbol does. Compare both codes. It's exactly the same. So you can use the decorator manually as I'm doing here. And the add symbol is so... There's nothing. Come on. Fair for coming and in case you have questions the slides are there in the speaker deck and I guess I will give some to the organization or whatever. Let me congratulate the organization for yesterday's party. That's great. Thank you. Hope you enjoyed. Tomorrow I'm giving a training. We will see this. You will do it yourself. You will experience it yourself on your own. And later we will see how to implement different types of decorators. We saw a really simple decorator. You can implement decorators that you can customize its behavior decorators which store statues and so on. Tomorrow at 11. So if you won, you are free to come. Questions, comments. Does anybody have questions? Really no questions? Yeah. You need decorators. That's why you don't have questions, right? Hi. I have a question. Thanks for the talk first of all. I would like to ask you basically replace names and namespaces and so on and you showed the slide what a good hacker I am. So I would just like to have a comment from you about using this technique in production code. But this technique is what you do every time you use a decorator? Not about decorators about changing the names, replacing names like the first couple slides you showed about Fibonacci and redefining the name. Yeah. No, seriously. This is what happens when you use a decorator. The decorator takes your function, writes it, how we show it, and it works because the function still believes that it's calling itself when it's called aggressively. It's really what's happening every time you use a decorator. So every time you're using Flask and you want to add a URL and you're doing the streak. Yeah. Okay. Maybe my question was a bit confused. It could look like a hack, but that's a decorator. You are taking the function replacing it or wrapping it with something you could even implement in a decorator which does not call the real function. That would be maybe a hacker. Okay. My question was not about using decorators in production code. Yes. Any other questions? No? Cool. Thank you for the talk. Will you talk about decorators, parameters on your training? Yeah. We will see this was the simplest decorator ever. We will see more advanced decorators. Different types of decorators. We'll experience this ourselves. So the first part of the training is doing kind of this yourself. And the second part is doing more decorators. Different types of decorators implemented to maybe keep an estate inside the decorator or customize the way it behaves. For instance, this decorator here is catching. Why not be able to customize the size of the catch and the time to live? We will learn how to do that. Okay. Thanks. Another question. While I run, will you cover class decorators on the tutorial? What? Will you cover class decorators in the tutorial? Yeah. I don't think we will have time. But, you should use metaclasses. I like moment classes instead of decorating classes. Personally. But we will see how to implement decorators using classes. That's what we will see. I don't think we will have time to cover all the decorator classes. I have a question about using multiple decorators on the same function. That's dangerous. How do you see the trade-offs between the complexity of having that file? That's something that today I didn't mention it, but most probably in the course I would highlight for sure. The thing is, if you have four decorators in a function, it means that the first decorator calls to the next decorator which calls the next decorator which at the end calls your function. So that's expensive. So don't do that, for instance, in your super-fast rest service. Because you are doing four calls for the same. And sometimes you don't really need them. So take care with that. It's maybe the dangerous part of decorators that it's so easy to apply a decorator with that that you forget that actually you have a function calling another function and before calling, usually you do something there, like catching or logging or whatever you are doing. And that takes time. At the end you have to call one to the other, to the other, to the other. Plus all the execution code of each of the functions which are the decorators. And do you have any tips on, for example, if you have legacy code that uses multiple decorators to refactor it, to make it faster? Maybe you could if you always use three decorators together, maybe it has to have only one. The end is, maybe it's not about decorators, but it's maybe about modularity. If you always see it as if you a lot of things that you do with decorators could be replaced with calling something at the beginning of your function. Lots of times could be replaced by the same. But you are always doing the three first lines of your functions are the same calls to all logging and whatever. Maybe you could have single handler for everything together. So it's the same, maybe you could have a single decorator for doing all the stuff together if you always do it together. Does anybody else have a question? Right, thank you Pablo. Thanks for coming.


The study found that selective licensing had a positive impact on mental health outcomes, such as reducing antidepressant prescriptions and mental health benefit receipts, as well as decreasing the number of people who reported having depression. It also showed that selective licensing had a negative impact on population turnover, suggesting that it may have contributed to gentrification. Additionally, there was no significant change in self-reported anxiety levels. This article was authored by Emily Caughton, Stephen Cummins, Laura Cornelsen, and others.


Hi everyone, Shawn with jaspyscasebreaks.com here doing 2019-2020 Chronicles basketball hangar random team number 40 Where we're giving away a spot in eminence basketball Next one of these is in the store now So 30 spots everyone gets a random team in the NBA no vet common ship at the end of the break We'll randomize all 30 customers names top name the randomizer wins a thirty seven hundred dollar eminence spot There you go pretty nice little incentive there. Here is the customer list from Gretchen back down to Gretchen and The custom or the teams from the Hawks down to the Wizards dice roll just for the hanger break itself a Four to three seven times there'll be a separate dice roll randomizer at the end of the break with the original list of customers names To give away the eminence spot. So seven times Seventh and final time from Christopher Gerard down to Gretchen Ternan Seven times on the dice seven times on the randomizer and seven times on the teams Seventh and final time from the Knicks down to the trailblazers. You see seven times there seven times in the dice So no trade window. I'm not gonna read through every single one of these since it is a filler break, but Let's go through this real quick Mavericks Luca Christopher Gerard Knicks RJ Barrett Christopher Gerard PJ Washington Jr. Brian Frank Rui for Gretchen LeBron Christopher Kobe white Gretchen job Brian Frank Zion Brian Frank Tyler hero Gretchen Ternan. There you go That's enough we get the idea So here is the hanger box itself and our final list good luck Luca Donchich for the Mavericks and Christopher Gerard Kobe white for the bowls Gretchen Ternan LeBron James for the Lakers Christopher Gerard Tyler hero for the heat Gretchen Ternan Kobe white for the bowls Gretchen Ternan John Morant for the Grizzlies Brian Frank RJ Barrett for the Knicks Christopher Gerard Tyler hero for the heat Gretchen Ternan And Yannis for the Bucks Gretchen Ternan I got to go through orders and figure it out Chicago if it's not on the schedule It will get there So that was the break itself Here is the original customer list from Gretchen down to Gretchen dice roll Name on top after six and a one seven times seventh and final time so Seven times on the randomizer from spots two down to 30. Thank you guys very much for getting in on the break And hopefully I can do better for you next time on the randomizers. There is more fillers coming up Next one is in the store already. Thank you and special congratulations to Gretchen Ternan Just one herself a spot in the thirty seven hundred dollar per spot eminence break seven times on the randomizer Seven times on the dice and there you go. That was 2019 2020 Chronicles basketball hangar random team number 40 from jaspyscasebreaks.com. I'm Sean jaspyscasebreaks.com Thanks for hanging out. I'll see you next time


Well, hopefully at this point you've read all 12 chapters, you watched the lecture videos for all the chapters, you've done all the quizzes, you've done all the post-ests and other little assignments, and you're ready to take the final exam. Let me give you a little bit of information about the final exam. Now, as I've mentioned before, it's longer than the others. That's because our course is comprehensive. So this one has 97 questions. Exam one has 66, exam two had 80. This one has 97 and it covers material from all 12 chapters of the course. So everything we learned is on there. On the other hand, I do want you to know a couple of things. Number one, a lot of people get really anxious about formulas. There's not a huge amount of calculating. In fact, there really only about 10 questions on the exam that require calculating. The standard deviation appears once, the variance appears once. You never have to do the pooled variance for the t-test. You don't have to do any expected frequencies for chi-squared. If you look at the formula sheet that I have linked on the syllabus, that's your clue to what you actually need to know for each of the exams, including the final exam. I also have study sheets there that list the things that are important. Now, you can use those to study. You cannot use the study sheets or the formula sheet when you actually take the exam. Like the others, this one, because of mandatory department policy, is closed book. You can use scratch paper. You can use a calculator. You can even use your phone as a calculator, as long as you use it only as a calculator. The best way to prepare for this is to go through each of the chapters, read the book, watch the lecture videos, and then go through the quizzes. Watch each quiz review video. Do the post-test. See what you miss on exams one and two. See if you can figure out what's going on there. And then I do have a two-hour-long review video from a live review for the final exam. You can watch that if you want. It covers the most common things, and I can tell you hypothesis testing is high on everyone's mind. In fact, something you need to know is that even though there are 97 questions on the final exam, they're not evenly distributed. If I recall correctly, I wanna say there are about 17 questions that have to do with chapter eight hypothesis testing, and there's maybe 11 or 12 that have to do with chapter 10 correlation and regression. So those ones are really important, and you're gonna wanna make sure you understand the logic of hypothesis testing when to reject, when to retain the null hypothesis, the relationship between p-values and sample size and effect size. That's all gonna matter. That said, there are again only about 10 calculating questions on the final exam. If you're gonna go completely apoplectic and get an ulcer, you can guess on them, and you can still theoretically do very well on the final exam. I also wanna remind you that the final exam is the one exam where the grade adjustment always comes into play. For each of the exams, I look to see if the highest score anybody got is a perfect score. If it's not, especially, and I remove outliers, people who are steps away from everybody else. If the highest non-outline score is in a perfect score, I add enough points to everybody's score to make it perfect. That almost never happens with exams one or two, but it always happens with the final exam. The adjustment is usually in the six to nine point range, although, actually, I decided, I made a decision last semester, it's gonna be a 10 point adjustment. You can count on that. So whatever score Canvas tells you you got on the final exam, add 10 more points to that. That will be your true score that I use, both for calculating your grade in the class and for doing grade forgiveness for the other exams. So as you prepare, make sure to go through all the other material step by step, go through each of the videos, go through the practice final. The practice final was written by the same person who wrote the regular final. This is the only thing that wasn't written by me. It was written by somebody else for the department. And I have videos that explain every question on the practice final. That can be a huge benefit to you as you prepare for the final exam. But go through each of these steps. In fact, I have a very long list. It's either 13 or 18 steps on the syllabus on how to prepare for the exam. If you go through that step by step, you can be confident that you will do well on the final exam. And don't forget also that as you're studying, you can contact me. If you need an immediate response, texting me or calling me is best. Canvas messages and email work, though I'm sometimes a little slow. And putting comments into Canvas messages, well, I can't respond to them directly given the way that I process those. So text me or call me and I'm happy to help you out. With that, thanks for making it all the way through the class and best of luck on the final exam.


Hello everyone. Good morning, good afternoon, good evening. Thanks for joining us today. Happy GIS week and happy GIS day in advance. I know we're celebrating a day early, but that's okay. We can't have enough of GIS celebrations during this week. I hope that any event or workshop that you have been attending this week has been fruitful and productive. Thanks to everyone who has joined us. Please feel free to introduce yourselves in the chat. Let us know where you're joining us from and why you're so excited about GIS day. My name is Mary M. Rabi. I'm with the UN Sustainable Development Solutions Network. I'm the head of SDGs today. And we have the pleasure and honor of being a member of the EO toolkit for SDG 11, which is one of the work streams led by the EO for SDG initiative. Today, we are going to hear from my colleagues from the GeoSecretariat, from UN Habitat, from ESRI, and from the European Commission Joint Research Center. We have a very exciting training scheduled on Earth observation for SDG 11, calculating the degree of urbanization. So before we jump into the training session, we're going to hear from our colleagues at the UN Habitat headquarters in Nairobi. I know that they have had a series of workshops and meetings related to this topic and methodology. So we're going to hear from them. Then we're going to hand it over to my colleague, Martin, from the GeoSecretariat to tell us a little bit about EO for SDG and the toolkit. Then we'll hand it over to my colleagues, Kira from ESRI, and Pietro from the European Commission Joint Research Center for the training. And please do stay with us until the end of the training, because at the end of the session, I'm going to let you know how you can get your hands on a free ArcGIS license to use so that you can then go through the training and learn paths over the next year. So five of our participants in honor of GIS Day will receive a free ArcGIS license. So stay tuned, and I'll let you know how you can win one of those licenses. Without further ado, I'm going to hand it over to my colleague, Dennis and Michele, who are in Nairobi. Over to you. Thanks. Thanks a lot. Hello, everyone. Dennis from Nairobi. Michele, come say hi. Hello, everyone. Michele. We are here with a big team of about 30 people, that is something people from different countries who are working with us this week to share experiences from implementation of the de-globanization that we've been supporting the last three years across 13 countries. And of course, this relates to the global need for harmonized city definition. A journey that we started in 2016 at the Habitat Conference in Ecuador. And we've been working with multiple partners, of course, including the European Commission to support the adoption of a globally harmonized method that can help us to measure urban trends in a more consistent and harmonized manner. So we're really excited that activities have implemented through the years which started with global consultations in 2018-2019 with about 85 countries on the feasibility of having a globally harmonized method to define cities and urban areas, which then led to the adoption of degree organization by the UN statistical commission for global adoption and application for measurement of the STGs. It's really a journey that has been quite interesting and we've engaged with different countries and seeing how this de-globanization manifests and shapes the local context. So the adoption of the method in 2020 came also with a request to us, Habitat, the European Commission, World Bank, ILO, OECD and FAO who are the sub promoters of this concept of harmonization to support countries to actually be able to implement the method using their data. So from this is where we started another process of supporting countries directly to implement the de-globanization using their own data and national processes that build on enhancing collaboration and partnerships between national statistical systems but also other relevant agencies at the national level. So the first phase we've supported 13 countries which I will pass here today, I'll pass them screen over around so that you see who is here. 13 countries here, we have Kenya, we have okay, let me see how this goes. We have Kenya, we have Egypt, we have Philippines, we have Tunisia, we have Ecuador, we have Chile, we have Kazakhstan, we have Indonesia, we have Peru, we have Nepal, we have Mexico and Azerbaijan. Did I see Kenya? Okay, so we have two representatives coming from each country, majorly from the statistical system but also the ministries that are responsible for human development. And we've been really having very interesting last two years to work with them and also many other multiple partners at the national level to apply this method. So this week we are really having these countries share their experiences on what has been the outcome of applying de-globanization as the recommended global standard for measuring urban and rural trends but also the intersections between these different urban rural continuum manifestations. So we are happy that we've had a very successful three years with countries and we're looking forward to continuing this because we are just rolling out another phase of support to another 40 countries in partnership with UNICEF and UNEPF and we really look forward to hopefully looking or rather seeing the application of the de-globanization based on the training we're going to have today. And thanks a lot to S3 for of course supporting this lesson on application of de-globanization for ACATGIS Pro and some of the countries I know have been asking us say this is available and I'm happy also European Commission has really made it possible to have these tools available for ACATGIS Pro for all the countries. So Mario if you allow me I will quickly show you who is in the room and we will stop our intervention and get back to our session for the day. Sure sounds good. Thank you. Okay. I hope you're visible uh I'm what are you saying? Yeah I'm not my hand is now I'm visible. Hi this is Amir from Egypt. You are Amir, how are you? How are you? I'm from Egypt. Amir from Kenya. Salam, also from Egypt. Salam, Samira from Tunisia. Oh, okay. Hello, from Philippines. Hi, I'm from Philippines. Amir from Egypt. Gracias. Hey George, you're an habitant. Hey Jasper, you're not that good. Hi, Marlon, Ecuador. Hello, I see. Hello, muchaus, from Malawi. Hello, thanks for Malawi. Amir? Hi, Nepal from India. They're having their coffee. Hi, from Masafacha. Yeah, hola. Saludos. Hello from Mexico. Okay, last two. Hello again from Egypt, Hasan. Hola, saludos, Francisco Moreno, from Mexico. Okay, Mariam, that's it from us. Thanks for allowing us to say hi and truly wish all the best in the session today. I look forward to also seeing the results from the global application by the different people who will be part of the training. Great, thank you so much Dennis. It was so lovely to see everyone in the room. Thanks for joining and we look forward to learning about all the great work that you're doing and leading in your countries. Great, so without further ado, I am going to hand it over to my colleague Martin Clark from the GeoSecretariat to tell us a little bit about the EO4STG initiative and the EO toolkit for STG11. Over to you, Martin. Thanks, Mariam. And afternoon or good morning, everybody. I'm just going to share my screen, if I can. Here we go. Yeah, thanks for the opportunity to speak. I won't waste any precious time because I'm sure you're all eager to get on with training itself. But just to give you a bit of context, a bit of background to kind of where the EO4STG initiative came from or is framed by and specifically what the EO4STG human settlements toolkit is all about. So I am the Urban Resilience Coordinator at the Group on Earth Observations. I'm based here in Geneva with the rest of the GeoSecretariat team. Geo, for those that weren't familiar, is an intergovernmental partnership. We've around 115, 120 national governments and then 160 plus other organisations, private sector organisations, civil society, NGOs, etc. All working together to try and promote the use, uptake, application of Earth observations as a public good. So that really means ensuring that Earth observations data, information and insight is open equitably, you're publicly accessible and is being put to use to address some of society's greatest challenges. I think that is best framed by the sustainable development goals, which you find referenced or reflected throughout a lot of the work that Geo does, but also some of these other major global policy initiatives like the Paris Agreement, New Urban Agenda and the Sendai Framework for Disaster Risk Reduction. Geo is largely funded through in-kind contributions from its members, from the participating organisations I mentioned. And we have a work programme which is around 40 activities in that work programme, which covers all sorts of engagement priorities, we mentioned climate change, urbanisation, SDGs. EF SDG is just one of those activities. And it's a very central one and we find that it's not only, it's focused on the SDGs, but it works across all the other activities on our work programmes, as well as engaging with organisations external to Geo. So at the moment, I mean, it was established in 2016, it's currently co-chaired by both NASA and JAXA, the Japanese Space Agency. And the general purpose of this initiative really is to organise and realise the potential of Earth observations and geospatial information to advance the 2030 agenda. So we're at the midpoint now and it's still of major relevance. There are three goals really, or aims that the initiative seeks to achieve. And that's really in the demonstration of how EO Earth observations can actually contribute to monitoring and implementation of the SDGs, increased skills and capabilities of those wanting to or using Earth observations to further SDG activities and achievements and then to raise awareness of, I guess, the importance and the use of Earth observations in support of the SDGs themselves. We've got a board that's been established with 100 plus affiliates and a variety of organisations that support the implementation of this project. There are sort of four SDGs that we currently cover. Six on clean water, 11 on sustainable cities, 14 on life below water and 15 on life on land and there's around 24 individual indicators that we can use Earth observations to measure. And monitor, that's not to say that there are other targets and indicators throughout the SDGs that we can contribute to, but these are the ones with the greatest opportunities, at least in the first instance. The one that we're going to hear about today and the focus of one of our sort of offshoots, if you like, the EO toolkit for sustainable cities and human settlements. There's about seven indicators in that SDG that Earth observations can be very useful for. And I suppose I'll just talk a little bit about what we actually do. So it's all about sort of developing and promoting standards like the degree of urbanisation that Dennis referred to before, getting the use of those standards written up and detailed in policy briefings and other publications, running events like we've got today, capacity building trainings and awareness raising activities, as well as showcasing some of the interesting applications uses of the projects themselves through an annual awards programme, which in fact, we just concluded last week in Cape Town, where I know some of you are present. As you can see, there's a wide range of organisations that contribute in some way to that activity. And I would urge you to, for those of you with the kind of urban leaning focus, I would urge you to have a look at our toolkit on sustainable cities and human settlements. There's lots of resources in there, links to data, descriptions of tools and methodologies, as well as a number of use cases detailed that demonstrate how these tools and methods have been put to use in real life and some of the impact that we've realised from that. Anyway, I'll cut it short there. Do feel free to reach out if you've got any questions on the toolkit on geo more generally, and I think we'll share some email addresses afterwards, but I'll hand back to you now, Marie. That's very much. Thank you so much, Martin. We're having some technical issues with one of our speakers, if you give us a moment, we're going to have my colleague Kira Morish from Esri join us for the next segment of the webinar. So please just give us one moment. Yes, in the meantime, maybe I can comment and thank the connection from Nairobi event. I think it's really nice to see how this is becoming a global endeavour and how countries are committed to the implementation of the degree of urbanisation worldwide. I think it's really amazing the way we've gone through and how people are now able to disaggregate statistics by degree of urbanisation, especially with regards to sustainable development goals. I think this is a very powerful tool and also a success story for people who work in GIS. And also you show the, we've seen the power of capacity building exercises stated by the partners in the degree of urbanisation and implementation, you an habit at the European Commission. I think there's really space for everyone to get to learn how to produce statistics by urban and rural areas. So it's again, I think this one, an occasion to show that really everyone can, with some free data and tools, calculate a bit of the progress towards sustainable development goals. Thank you so much Pietro. Maybe Richard, if you could make Kira a speaker, that would be great. I think she has joined as an attendee. That way she can enable her mic and camera. Unfortunately, I cannot see her in the attendees list. Okay, so maybe what we'll do is Pietro, we can start with a training session and then once we're able to get Kira online, we can have her present a little bit more about the learn lesson. So once again, thank you, Martin, for the introduction and Pietro, over to you for the training. Yes, thank you. Okay, then I will start to share my screen here and thank you through this journey in the degree of urbanization application on Esri tools. So we thank again our colleagues at Esri for producing this nice learn lesson. If you are not on this page, then I advise you to find it on Google. You can also Google it easily and find it by searching Esri training degree of urbanization. Or if you click on this link, you will land on this page where there is this nice step-by-step procedure on how to apply the degree of urbanization to your own data anywhere in the world.  Then you also need the global human settlement, the GURBA toolkit, which is a bunch of software tools we have produced at the European Commission explicitly for the production of the degree of urbanization. You can have it by clicking here on the proposed link. Then if you scroll down a little bit, you find this section here with the degree of urbanization. Then you can download the ArcGIS version online. It does the online and offline version, but the online one is fine. It just needs to connect briefly to the internet to check that your system requirements are satisfied and download a bit of the backbone code. Otherwise, you can also download an offline version, put it on a USB stick and use it later. The standalone version is a standalone interface that does not work with ArcGIS. It is then an independent interface that you can run without having the need for ArcGIS installed, but today I'm going to demonstrate the ArcGIS version. I'm going to download this one.  The other thing we need to run this training is to download the package, of course, the dataset package that is here at step number one. I'm going to click here and save it somewhere, let's say here. I have saved it already, but I'm going to overwrite it. It's a lite file, so it's only 1.9 megabytes. Then I will navigate to the folder in which I have saved my file and double click it. This will open ArcGIS. I am under a proxy server, so I need to enter a password to access the internet. This is my company policy. Sorry for this. It's going to happen only once. Okay, here is the main interface of ArcGIS that many of you should know already. Here you see the content of the dataset. Today we're working on a case study in New California, which is a faraway country for me because it's on the other side of the planet in Oceania. The dataset contains what could be called a census map. This is how it looks like. It contains the polygons of the administrative areas or the enumeration areas counting the population. I can also rename this map as a census. This will help maybe because later we are going to produce more maps. Okay, let's call this census. We can see the attribute table, of course, to check what's inside.  Here we are going to use the population attribute to first produce a population grid and then classify each of this polygon by degree of urbanization. This is the ultimate goal of this training. Then we can use this classification to produce and break down statistics in each of these polygons by its class in the degree of urbanization. Let's say we can first label our features maybe so we see their name appearing and maybe we can also change the symbology here to something a bit nicer in order to see the population growth, the population distribution across the different districts here. With this color scale we see immediately how where is the capital city which is Nomea here and the surrounding areas that are also quite populated here. We could also of course normalize this by the area but we are not doing it now for brevity. This is the first thing that the dataset contains. Then you see there's another dataset which is called GHS build. This one is actually the built-up surface identified on satellite imagery for this area. It's a raster dataset so it contains the beta squares of built-up surface in each pixel encoded as meter squares so it goes from 0 to 10,000 because it is actually at a 100 meter resolution. We can check this in the raster information properties and you see that it's 100 meters. We can also symbolize it better maybe we can mask zero values and zoom in a bit to see how it looks like. Maybe I can also use another color scale that is maybe clear. We see again how the area of the capital city contains the highest land surface occupied by built-up. We're going to use this built-up surface to specially desegregate the population that we've seen in the census. We're going to distribute the population that is lying in each of these polygons based on where the buildings are. We use this proxy variable of built-up as a desegregation variable. Okay we can keep the census here shown. The good thing that I also wanted to mention is that in this training the GHS built layer is preloaded but if you go to our website the GHS global human settlement layer website which is at this link we've seen it before to download the tools. We can also download the data so if you are interested in another area of the world you can click here on data and tools download the data and you will be sent to this page. You see there is a tiled globe so you can download from here the built-up area you're interested in. Here we are in New Caledonia it's this area here. We are going to use the built-up surface so again the meter square of buildings encoded at pixel level but we may also download the volume information because recently my team the global human settlement layer team has produced a global volume information layer which contains the cubic meters of built-up volume. It is made by extruding the surface times the height so from here you can as well download the volume information and bear in mind this is a multi-temporal information layer so you can download the data set for any of the time slots proposed. Okay let's go back here at our New Caledonian case study and now we need to import the library with the tools that I downloaded previously so I need to go here in the catalog and on toolboxes and click on add toolbox then I have I am sent here automatically to the directory where I have downloaded the tools but you may need to navigate to the folder where you downloaded it. There is details about this operation in the website of the training on azure web page. So when I import this toolbox I have a list of tools and as I said before what I want to do here first is the desegregation of population on a population grid. Let's create the first and output folder I'm going to create it here in this let's say home directory that I have dedicated to this scope I will call this output okay and then I will open my ghs population to grid tool is the tool dedicated to the special desegregation of population from sensors to build up and I am sent to this interface first thing I need to do is to select an output workspace I'm going to add a new connected folder here maybe I'm just navigating to the actual place so where I've saved the where I've created my output folder just give me a moment I need to find it here this pc x gis week and output folder I'm going also to add it here in the connected folder because it's going to be useful also later so here it is gis week okay let's go back to the population to grid interface here I am asked to enter an output projection by default it would be this world more wide which is an equal area global projection because we are doing we're dealing with population distributions and possibly computing population densities so it is needed that the projection is an equal area one then here I need to load my population polygons layer it's they're those ones so I'm just going to drag them here and from the attribute table of this population census I need to select the population attributes that we saw before being this population 2019 the other fields are to optimize the computation this one is a stepwise field that is used to optimize the computation or we have the option to load a point layer in case your senses is not structured in polygons but in point features I don't have this case here so I just need now to load the built-up raster which is this one remember again and I'm dragging it here so this one is going to be used for the disaggregation of population then I'm going to run the tool it's going to take a moment in the meantime I can create a new map that I'm preparing to visualize the results I'm going to name this one as population grid and then I'm going to dock it then this one is pointing to Italy which is the place I'm connecting from but of course I want to link it with the the new caledonian case study so I'm going to click on link views with center and scale and it's going to show me new caledonia however the projection is different because by default the projection used is not this equal area I was mentioning before but the standard global marketer projection so I'm going to go here click on the properties and then in the coordinate system select the mole wide one if you don't have it in the far in the favorites you can simply search 54 009 which is the psg code for world mole wide and it will appear here I'm going to click okay and you see that the present the projection now matches good and I see also that there is the population to grid completed so I'm going to open the output folder it is here output folder and you see that there is a file in here it's a raster file as expected because we have a population grid I'm going to create the pyramids to ease the visualization and I'm going to act a bit on symbology for example I'm going to set this color scale for example I'm going to visualize it as a minimum maximum and edit the min max values ranging from zero to let's say 1500 which is usually a good value at one kilometer resolution and then I'm going to mask the zero values good so this is how my population grid looks like and we can zoom in to the area of the capital and we see how the population has now been allocated to the capital which with much higher precision compared to the census here we barely see any difference in terms of population distribution between these three departments here like pita dubia and montore or numea and then we actually see that on the population grid most of the population is actually lying in in the capital is actually living here in the capital so we can even click on pixel and visualize the number of inhabitants that has been distributed here based on the built up surface so we've used the simple meter square of buildings of built up area in in this region to distribute the population that appears as an attribute in the population census good now we can we can pass now with the second tool and to do so I'm going to open the degree of urbanization grid to double click here and this one is intended to create another grid which holds a categorical value standing for the degree of urbanization classes this requires an output workspace as well I can select the output folder just as before and a population raster which is the one I produced at the preview step so I'm going to go here and select my population grid at the thousand meter resolution I'm going to use the reduce urban center fragmentation which uses again the built up raster to actually avoid having urban centers scattered in many fragments and pieces around my map so with this option I'm going to have a more rather more compact urban centers I'm going to load the built up raster here and leave the rest of the options as default I'm running the tool now and in the meantime just as before I'm creating a new map appearing here I'm going to dock it at the bottom of my screen actually in this corner here I'm going to name this one I'm going to change the the projection of this map as well to worldwide and I'm going to rename it also as degree of urbanization great okay and then the output files have been produced so I will navigate to the output folder and I see there are plenty of things all these are let's say the features the feature files in shape file format corresponding to the different classes but there is also a raster file with the classes in categorical values I'm going to open this one the level two classification of the degree of urbanization ArcGIS asks me to calculate statistics and pyramids I'm going to say yes and this is my map so the colors that you see here correspond to different urbanization categories I'm going to list them all by changing the label here in the symbology so then is the value that corresponds to water then 11 stands for very low density rural grid cells 12 stands for low density rural grid cells then 13 is for rural clusters so a bit denser like villages and then 21 is for suburban and very urban grid cells and then we have 22 which is for semi dense urban clusters 23 which is for dense urban clusters and 30 which is for urban centers good but this legend we can zoom again at around the area of the capital city and see how the capital city is an actual urban center so it's a city as expected it is surrounded by a bit of suburban and very urban areas there are also some villages or rural clusters there is also a semi dense urban cluster here a dense one here it seems pretty nice and then the rest is more or less rural with some villages or rural clusters here and there you can check on our methodology the thresholds of population size and density used to produce this classification but I'm not touching it right now because I want this session to be very practical okay now the last step I want to perform is the creation of the classified territorial units so I want this starting map here with the census units to be colored according to the degree of urbanization categories so I want to assign to each of these units a degree of urbanization class in order to do that I open the degree of urbanization territorial units classifier again I will have to click on an output folder and I select the usual one I will need to load the territorial units from the starting census in shape file and then I can set up this stepwise field to optimize the computation and group units together by province or by district and then the tool will iterate over each group of features but I don't need this because it's a small file and with a relatively small area so I'm going to leave that one blank I just need to select the population attribute here which is this one then there's the option to input a cross tabulation field in case I already have my national urban and rural classification for each administrative area then the tool will produce a comparison between urban and rural classification according to the national definition and the degree of urbanization definition I don't have this field in my census attribute table so I will leave this one blank as well I just need to load the population roster from output produced the before so I'm going to go to the output and select the pop2g output so the population grid at 1000 meters and the degree of urbanization roster so this one I'm also to select this one level one or level two is is the same if you select level one you will only produce level one now if you select level two you will produce level two and level one level two contains more classes they're the one I listed here level one contains fewer classes let's select level two and run the tool in the meantime I'm also creating a new map here as usual I'm putting it here and then here I'm going to the properties rename it as classified territorial units units and change the coordinate system to worldwide okay here it is and now in a moment we will see the results so I think it's also nice and convenient this feature of ArcGIS pro which I love personally to have multiple maps synchronized and in this way it's easy to visualize data sets that needs to be compared that need to be compared to complete it it's going to be called just like this input shape file which is NC 2019 population I'm going to find it here and see 2019 population plus there and then and then there is a suffix which stands for the tool so GHS DUTUC territorial units classifier here's the shape file I can drag it here to my map I have this monocolor map so I need to import a symbology for this one and to do so I go to the symbology tab then click on import symbology and the symbology layer is going to be here in the output folder so you have multiple options you can either visualize level one or level two I suggest you visualize level two because it's the one we've been visualizing in the grid so let's select level two and then run and here it is so what you have here enlarging the legend here what you have here is a classified census with the territorial units assigned with a class from the degree of urbanization level two let's zoom into the area of the capital city so you see here that this area of the capital city is classified as city and then this area here it's slightly dense because the suburban area is dense down and also a semi dense down so in the end it inherits a class which is dense down and this class is attributed by majority of population so based on where the majority of population lives across these cells in the rural in the degree of urbanization grid and here this one is classified as a village because the majority of population in this polygon lives here in the cells of rural clusters so here it's how it looks like there's the rest of the island is classified pretty much as rural there is only this district here which has you see quite some population concentration it is classified as rural clusters in the degree of urbanization grid and then it inherits the village categorization under the territorial the classified territorial level good so I think this is it for this training remember you can look at it again step by step on this website if you want you can also access a thought of a version of the training at this link that I'm going to show now it's the U academy degree of urbanization this one is a free and open course which contains all the information you need to run the tools this one is for standalone version of the tools so it it's not the one in ArcGIS but it contains also a lot of theory and background information so if you go to this link and then unroll you can access all the different modules if you're interested in knowing more about the methodology of the degree of urbanization you can also google your stat degree of urbanization manual and you are going to be directed here to this methodological manual to define cities towns and rural areas for international comparisons there is a version in English one in French and one in Spanish you can download so once you have produced this output it's very easy to disaggregate statistics of your sustainable development goals indicators by urban and rural categories and then it's much nicer to produce insights or your key partners like UN habitat or even to disseminate the results to the public and remember this definition is intended for international comparisons so it might differ a bit from what you expect at national level but it's common to everyone in the world so that's why it's great because everyone can produce the same statistics with a common definition thank you so much I have I've come to an end so I thank you and let you intervene if does cure our someone again yeah so thanks again so much for that training session and thank you Thomas from the GRC for also responding to the questions and sharing the links in the chat um we'll share our email at the end for anyone who would like to um ask more questions we'll direct it to each of the other different speakers but for now we'll hand it over to Kira Morish from Esri to tell us a little bit about the learn path before we conclude the session Kira over to you thank you um Pietro thank you so much for presenting that lesson as well so the lesson that Pietro walked through is really from the European commission they've done all the hard work and we have translated it into um the the Esri software so if you're using ArcGIS Pro this is a great platform for you to be able to step through the processes that Pietro just showed no problem thank you very well done and um Carmel is here as well if you wanted to say anything thank you so much um Kira and I think Carmel is sharing the link to the learn path in the chat for anyone who would like to learn more and follow and as I had promised uh the beginning of the session um I will now share my screen just to give you uh our contact information so as I mentioned in honor of GIS Day Esri has given us five ArcGIS licenses to share uh with um our participants so if you're interested to go through the learn path or to explore ArcGIS for any other projects um feel free to email us at scgstoday at unsdsn.org share a short paragraph on as to how you're going to use the ArcGIS license for a specific project and we will randomly select five of our participants and follow up with instructions on how you can access the license so again feel free to email us with any questions or requests to win the opportunity to access one of the licenses at sdgs today at unsdsn.org and feel free to follow us on any of our social media accounts we'll be sharing recording of the session in the next couple of days thank you all for joining us it's lovely to see people joining us from all over the world thanks for sharing uh and introducing yourselves in the chat unfortunately we don't have time for a Q&A session but as I mentioned feel free to reach out with any follow-up questions and we'll connect you with uh with the different speakers uh happy GIS week happy GIS day um thanks for joining us and have a lovely day bye everyone


President Biden was asked about inflation again and had to admit, yes, inflation is up, but who could have known that would happen? Um, sorry about pulling the plug on you and all, who could have known you'd pull through? I mean, just like a month ago, nobody even knew what inflation even was, man. Live for another five decades. Who is my face red? No, I'm serious. No, I'm serious. I mean, it's like with that COVID thing.  But don't point fingers, you bigot, because China did everything right. No, you think I'm kidding, but no, I'm serious. No, I'm serious.  She's a little crazy. She thinks the monkey is the Sultan. And like white paper stuff growing straight out of the wall, man. It's a strange place. I'm telling you. Now come along. Time to go see the doctor. Oh, hello, doctor. How are you? No, no, no, not that one. Anyways, luckily to combat this new thing called viruses, I came up with and implemented a bold strategy of wearing cloth masks and invention cloth masks never before seen in the history of the world. I mean, sure, they don't do anything productive, but whatever. Yep. Well, so they don't really do anything, right? No, I'm serious. You think I'm kidding, but no, no, I'm serious. The government's invention of cloth masks will surely revolutionize the world. Beautiful, isn't it? Took me half a lifetime to invent it. I'm sure you've discovered my deep and abiding interest in pain. I mean, they're so effective after three years, we don't even know what they do yet. Just like all of our policies, you know, you have to do whatever we say before you get to see the amazing, unknown results of doing whatever we say. But we have to pass the bill so that you can find out what is in it. I don't even get me started on the supply chain thing. I don't even want to get into the supply chain because nobody had ever even heard of a supply chain before like our current economic issues, especially railroad union workers. 10 years ago, how many knew what the hell the supply chain was? How would they even know what a supply chain is? I mean, not even our Secretary of Transportation knew what a supply chain was like a week ago. No, I'm serious. And if anybody would know what a supply chain is, it would be him because he's gay, which clearly is a characteristic automatically making him qualified for, you know, any number of positions.