Chad Chad guys, it's me. It's me I'm here. I'm here chat W's in the chat W's in the chat W's in the chat W's in the chat W's in the chat Guys It's nice to see you again Whoops. I don't know why but I always forget that Trey's here sometimes Everybody say hi. Is everybody say hi and bye to Trey real quick No more chair No more Trey.  Okay.  All right. I'm drawing your spider-man designs. All right I was sad Okay, I need something to distract myself.   I'm not even gonna fucking.  I'm messing with this dream real quick. Oh Shit already got a dono from from PBP spider girl. Thank you so much for the donation Damn, I see you in my Twitter replies all the time. This is a dedicated motherfucker right here. All right, let's I'm okay. Wait, let me let me Let me say who this son is from real quick. This is from I Believe that I believe they go by spider move, but I guess right now it's Venom move I've been saying that I wanted to draw their spider sona for so long and I just keep forgetting I keep seeing other sonas.   I'm trying to think of the pose I want to do I'm trying to think of the pose. I want to do You know what? Let's just let's just do some good old classic spider, man.  Thank You Nora. My favorite soda is is got to be crushed I like orange soda Can you draw my spirit dear sona next? I have no clue which one is yours I feel so bad for people who donate and asked me to draw their their sonas because I have no I Am not sure I am I am I never have any idea Like there's no there's no way to like go straight from the dono into like which Sona They want drawn. I lose it every time hmm Okay, maybe not classic spider man. I kind of want to pose where you can see both Where you can see both spider logos on the suit because you notice there's one on the on the side Wait a minute Okay, that is a boob. Okay. You see one on the side boob there and then one on the one on the Whole year, let's go. Oh shit today also genuinely Thank you so much for always being there for me and helping me with everything you mean a lot to me I love you Thank you. Maybe Spidey. I love you, too. It's good to have you here. I appreciate you sticking around Discourse on two dollars knock knock open up the door.   I Was gonna say bitches, but that's disrespectful Gotta get those titties right boy.      You know what I'm talking about You know what I'm talking about chat.  I want to have that Drake energy, bro I'm trying to have that Drake energy. I need the max we W's in the chat W's in the chat Chat bro, bro is not Drake guys stop stop.  I'm trying.   And they're like what?   Damn, they are banging down my door, bro Thank You Alex. I I'm not sure what Oh, no question absolutely Lover content are the best. Thank you so much for the dough.    Thank you. Thank you. Fantastic spidey. Thank you so much for the 10 quid.   You know what I mean? I was like, bro That was supposed to be my clout. I have no clout, but now I'm like a hundred K youtuber.  It's okay You know, I got my bag. You know what I'm talking about? I got my clout So I don't I it's okay if you guys don't want to credit me in your in your Uh in your bio if you if I draw one of your sonas and you guys use it as a profile picture You can credit me if you want If you want to credit me you absolutely can But if you don't want to that's also completely fine if you're feeling a little lazy Lethal company together when home slice Uh, I gotta I gotta figure out What my because I kind of want to I've been kind of thinking about like Doing doing those like lethal company streams more often, but I used to I used to have a thing Where I would I would pay the guests on my stream because like they were here On the stream with me, but I I don't know if I Necessarily feel like comfortable with that anymore because I don't want to feel like anybody's Like superior. I don't want to be I don't want to feel responsible for somebody else's like Cash, you know what I mean? So I think I want to rework like how I Approach multiple guests on a stream and I think That that lethal company stream was a test run I don't know when I'll be in the mood to play lethal company live again But um I will you know what nor you will be the first on the list. I swear I swear But I think in the future If I if I go live with someone I think the the the incentive in the future is just going to be like clout Or whatever you can get from being on the stream Like I'll put I'll put your links in the description I'll I'll put up like anything I want But I think that's just how it's going to go in the future.  I just I'm I'm reworking it right now Will you make a video on the 70s slash 80s first mcu? The huh Will you make a video on the 70s 80s first mc? Oh um I've been I've been I've been looking for a gateway to like talk about things other than spider-man So I would love to talk about uh, I would love to talk about like other Marvel characters, but I don't know if That would be via That old thing. I know you're talking about though, of course, but I appreciate the suggestion.  Sometime maybe maybe sometimes people just discover shit and they they don't tell people how good it is or whatever But I don't know all I don't want to say I'll look into it, but if it peaks my interest upon like an accidental stumbling Into it all I'll debate doing a video on it for sure.  That's philly spidey in the chat. What's up, man? Despite our 22 turkish liras. Hi chi. Can you draw my sona? My nick is spid4 tk underscore You know what? I'll give it a look actually I'll give I'll give it a look and I'll see I'll see if I like it Well, I don't want to say if I well, I'll see if I want to draw it. Oh, I'll take a look at it.  I'm sorry. Oh, man I think the the last time I streamed it was playing lethal company like Yeah, I already mentioned this earlier, but I don't remember when exactly that was I think that was like I know it was a couple days ago But I don't remember the exact date It was like for Yeah, it was like four days ago. That's when that was Right one dollar and ninety nine cents Twitter didn't work. Okay. If send to him will instead um I don't know if I have an email that's currently open. I'm sorry Uh But I was saying anyway, I was saying because like I don't know why but I It feels like I've been Away from this shit for a while But I think really that feeling is is me being away from from drawing Live for a while I feel this way like every time I get on stream like I always for some reason I always feel like I've I've been away from it for like eons But no, we're back at it. We're back at it Dang this one this one's getting like super Squished in the pose that I'm gonna have to have it in here I want to make sure I get the the the legs right Let me let me say a quick. Thank you to everyone Who's donated so far. I feel like I haven't been doing good reading out the dough. No Thank you fantastic spidey alex the animator toddy sw Spidar simply dan Sin voice network mr. Bee man. Thank you for so much for being a member for so long.  What's outsider your door kai? There's nothing outside my door There is nothing outside the door.    It was like a different one I love the I love those little cuties.  I think I know what I'm gonna do. I'm gonna light.  Thank you for the five Kai, can you check again? All right, I'll check on the homie Spider real quick.  I've seen in a while All right here. Let me look at our 22 turkish liras. Kai, can you check again? Okay? I'm checking. I'm checking I see I see I see I like the I like the color palette on this one. Like I like that he has like a mostly Like mostly yellow is like the color that pops out. It's like on black and everything But then he's shaded with like red and blue red blue and yellow. That's nice. That's nice The logo's good. I don't know if I want to draw him But this is a good spider sona. I at least want to do you the dignity of like giving him a a bit of a review But this is pretty good Not bad Thank you Kai has always been good at drawing women. Y'all are just hating. Okay. Now that is false I'll have some sections that are just straight up light blue. Why not? Why not?   You know what? It's just it's an apology It's an apology really to spider moo For for the amount of times I said that I've wanted to draw Their spider sona and then just completely forgetting Because I saw something else.     So I'm assuming She might just be pink. I'll make my own sona after this.  Um Yeah, I hope to I hope to see it later and I hope I hope to draw it later Oh, here's another dono. I'm gonna feel bad about It's another person asking me to look at their spider sona design without showing me where I couldn't find it Ms. M o o two dollars You're forgiven Thank you Thank you Oh, I've been saved from my sin I feel like I've been baptized I'm gonna put some I'm gonna put some real texture in the hair too Just just some scribbles, you know, give her give her some real strands of hair in there New underscore a different four dollars and ninety nine cents Hey kai, can you check out my sona's symbiote rage design and five dollars? I've sent in my spider sona a critique would be nice if you have the time Obviously zero pressure Oh god guys If you guys are gonna ask me to look at your sona With the dono you guys have to show me where I can find it.  They're coming Stop stop.    They're coming. They're coming and I'm like stop They're not coming They are not coming Philadelphia spider-man one dollar and ninety nine cents good stuff broski. I think I did it drawn in disc two I think I I think I did it this time. All right. I did it all new underscore a different one dollar and ninety nine cents It's on the thread. Sorry. No, no, it's okay I drew moose sona Also, there's no need to apologize. You're donating. Thank you so much Let's give it some let's give it some stringiness.     We have to go find the next one Next sona, baby Next sona, baby.  This was inky. I can tell I wanted to say it was jam, but no, this is this is inky, right? This has got to be inky But I really like this design I think I I'm not sure whether I'm not sure which one I like more. I don't know if I like the way inky did it or the The the the way it looks in the concept, but I'm Because I like the way the hood looks on inky's drawing because with the the hood on this one It feels more like a hood and less like a mouth But this one like that's unquestionable that straight up looks like Venom's head and spider-man is poking out of it or a spider Spider gal's head is poking out of it.  I I already drew a one Oh, never mind. This design is so good.  So maybe later I need to warm up. I need to warm up with like a A goddamn I need to warm up with some spider-man Like I need to warm up with some with some good ol Perfect perfect perfect and and this is this is relevant to the community This is maybe spidey sona chat. You guys know maybe spidey.  Let me look. Let me make sure no one's out here being a misogynist in my chat After I said I hate women because I was kidding. I was kidding, but I need to check if some of y'all weren't Okay Okay, you guys passed you guys passed You guys passed the test. It's time. Maybe spidey. It's time It's time It's time sinful entity $10 It's not a spider sona, but I was wondering if I could DM you on twitter some redesigns I did a few weeks back namely an early year spidey mysterio and electro Uh, I'm willing I'm willing to draw anything today Well anything spider-man I I specifically said spider-man design on twitter So if you guys want to send in your spider-man designs, I I'm completely okay with with Like I'm drawing anything today. I wanted I wanted to make him a little Love watching your vids and streams with my partner your vids have helped me while I am designing spider sona related shenanigans. Keep it up Thank you.   See you streaming again. I injured my left me on a woods fire Oh, dude has helped me look through it.    I hope you're okay. This is a good pose.     This is epic. I'm sorry. I'll never do that again Sketch $5 Hi-hi if you end up drawing my sona I suggest you draw the cosmic variant. I think that one looks the best also ben reilly is best boy Realist should I ever heard I'll be the judge of which one is the best? Forgot to say I just wanted critique. Oh, but I also thank you sketch um I'll look at that sinful. Hey want to check out my spider sona You can find a dax edge quasi to there is also a okay these things to look at are piling up. I might I might I might withdraw Why for an empire five dollars? Why you always streaming while I'm at work and can't send what I've been cooking smh I'm sorry please Philadelphia spider-man nine dollars and 99 cents You're inspiring me to draw our enbrowski. Keep it up. Hope philly spidey can be drawn In one of these streams bro. We have such a dope unique art style Thank you philly Alex the animator one dollar and 99 cents Kai can you pls draw my spider sona or pls? I I don't know where it is If I don't have a I don't have an email that that's currently open for it Because I know you I know you can't send it on twitter.  I will have that sona done and finished But I wonder if there's like I wonder if I've done any like crazy times.   I love your style and try to replicate it regularly However, you have also helped me make my own style. So I wanted to say you're amazing. Thank you.   Uh, I'll I'll see if I can look into that I'm sorry chat.  Like I'm not even memeing.   I have for sure Pulled a scam maroonie right like the proof is there Put me on the cross.   That man was just like me.  And then when he blew up Shit didn't matter to him no more, bro.  Half the voice actors died.  That's why I did the crypto gambling No, i'm kidding. Um That's a joke.   I I absolutely There there's a couple of things you should feel guilty about You should feel guilty about like not making your fans money worth it And you should feel guilty about milking your fans But I don't think there's anything wrong with doing youtube With the with the hopes of money Involved as long as you're not Doing anything actively bad.  It's not your fault.    I ever heard Okay, am I off of percozoid?   It's about capitalizing, right?  I feel like the the Thing we should be focused on if there's like a way to market our society It shouldn't be on or not market our society, but like run markets in our society It shouldn't be based on making The most money. I think it should be based on what's best for the people Like especially with the way it's working right now Like look at rent dog.     This man probably gifted you a sub and you never noticed Give it up. Give it up for this young man.     I have pictures of spider-man for you guys Well, I have footage of spider-man. I'm planning on I either want to use it for like a a suit showcase kind of video where like there's literally no commentary There's nothing like that. It's literally just shots of me running around in the in the spider-man costume I decided to wear that day or whatever I'll I'll show you guys. I just got some some random footage of me as spider-man on some roofs So I'll show you guys in a sec Oh, we're almost at the 30 minute minute mark guys. That means the sona is almost done like clockwork Well, I'm also taking off how many ever minutes I took to start up the stream So we're I think I think we're we're just a couple seconds behind Or we'll be a couple minutes behind by the time we're done. I think it's peaceful man I don't know why For some reason I feel I feel a deep inner peace right now I think it's the music dog.   We're good. We're chillin. We're chillin We're chillin Also kfc. Thank you so much for the don't know. I I didn't I didn't see that one come up. I really appreciate that or key fc I'm sorry I don't hear music. I just realized there's no background music where I can't hear it my bad chat. I have to turn it I have here You hear those rain sounds boy You hear those rain sounds boy Well, it's supposed to be silent hill music.  I don't know where the track is. Hold on There we go Bitches bitches hoes hoes I'm not even on rhythm right now.  Oh, there's key fc first time. I'm donating Love your stuff. You inspire me. You don't have to put on my community tab I posted my spider Sona and wanted you to rate it Okay, well, it will all right if I just have to rate it if I just have to rate it I'll take a look at it Going take them back to the club going straight to the community tab Oh my god Oh my god, I love her I love her Dude cute girl spider Sona's have my heart. I can't Um, all right. I have to rate her. I have to rate her I kind of like the yellow shoes Because I I think it like fits into the color palette. Well, but at the same time I kind of wish there was like a little bit of yellow Somewhere else. I think the eyes would be a really easy choice Just make the eyes yellow But I think without the converse I I still really like this Suit even if a lot of the iconography is is a little random like this glove design here But I don't not that being said I don't dislike it. I still really like it. I like the logo too All I will rate her an eight The design I like I'll rate her an eight The design I'll rate her an eight I like her a lot though that being said she's great Very good.   It's a disgrace to his legacy Is that a Twitter app?  I was going to limit it to like only a couple of pages But honestly, I kind of feel like I can put another one out here Or like a fourth one in this row Nah, I'll give myself a room I think It's under your alt-tweet on mygetmalki underscore lane Uh, okay, let me I don't want to get caught up looking at too many things But Alex Triplet has sent a lot of donuts And he really wants me to look at his stuff So I'll... Let me check that out real quick Alright, let's look at Alex Triplet Let's see Ooh Okay Okay I'm not going to lie, I'm kind of digging it I'm kind of digging it Did he say I have to rate it? Okay No, he didn't say I have to rate it But I like the...  I'm not done with maybe spideys I want to put some webs on the back Because it doesn't make any sense if he's just like sitting like this I gotta put some webs behind him I'm trying to make these like more profile pic presentable So like if he's got a profile pic He can have some nice webaroonies going on in the back You know what I mean?  Okay that doesn't look right Chat, chat that doesn't look right Hold on I'm gonna... I'm just gonna have him sitting on like a web base or something Like just a regular good ol...  If you lose in the Spider-Man costume just... Oh yeah you're so right, you're so based for that Actually I don't know why but I was suddenly like reminded this morning That I fuckin... I fuckin...  God damn it I hate when I pull up my discord on the main screen You know what this is this is this is specifically For Uh...  Has he showed up in my chat before?  Juno in the chat Said You the one that left it all behind And his overwhelming Intensity What? I'm so lost I'm worried that Juno Might be off the percozoid Okay Tango Oh Oh Tango just sent me The Spider-Man design I thought he was gonna send me a classic suit This is like Way more redesigned than I thought Not gonna lie it's better than Spider-Man 0 Did he say Rate it?  He's a thief!   Like Kiss Spider-Man?


YouTube team keep it clean. What's going on? It's engraving here with another video before we get into this video special shout out to my guy Ray Fari and his son Braylon. I really appreciate y'all to watching the videos Thank you for supporting team keep it clean. Thank you for being a part of team keep it clean much love to y'all man Shout out to you and your entire family, man. So Jocina Anderson She's a reporter that I'm sure a lot of you all are familiar with especially any of you that are on Twitter Because and one thing that I like about her reporting is that she takes it an extra mile And she has something that a lot of these reporters don't really seem to have with the players and that's a special relationship and What I mean by a special relationship a lot of these reporters they'll report on these players getting new deals players getting traded players Getting cut and whatnot, but they won't actually sit down and have a conversation with the players See a lot of the reporters they keep it strictly business and not even that you have in a conversation with the players means It's not strictly business, but Jocina. She actually talks directly to the players not to the agents Not just to the teams, but she talks directly to the players to get their perspective on things And that's something that I really really appreciate about jocina Anderson But she yesterday she spoke with Ravens Upcoming free agent Ravens pending free agent Matthew Jude on and Matt Jude on amongst Ravens fans. It has just been a back-and-forth for years now for years When it was coming up to where he was on the last year of his contract and some people saying oh Resigned they need to resigning to a big day. Some people saying oh, no, let him walk and then Ravens franchise tag them Oh, that started a whole nother war with Ravens fans were some ravens fans like oh He not worth the sixteen point five mil someone saying a Raven need to keep them and it just It was all of that. So then at the end of this year Jude on he started off a bit slow, but after that second half of the season Jude on showed up a he showed like hey What's up? And especially with where you need can God quay opposite of him that helped him out a lot And and then in the playoffs he plays some phenomenal football So shout out to Matt Jude on who it's a good thing that he's made his case And made it so hard for a lot of Ravens fans to decide whether the Ravens should keep or let him go But anyway, she said she spoke with Matt Jude on and let's see what she said he had to say She said just spoke with impending free agent Ravens outside linebacker Matt Jude on on where he'd like to end up And again, that has been a big question like what's gonna happen with Matt Jude on next Where's he gonna go? Who is he gonna sign with? This is what she said he said Just somewhere I can win some games clearly. I don't mean just three or four I mean you love to be wanted. Hey, I also may be a Raven for a lifetime And I don't even know yet, but we have to see So Matt Jude on in classic Matt Jude on fashion He was just being himself sounded like he was having a little bit of fun with it too, which we can all appreciate We know Matt Jude on we will see more than Humphrey his post game Instagram videos And we will see Matt Jude on his Instagram videos and stuff the stories and all that Always having a good time always poking fun at something poking fun at poking fun at somebody Always just having a blast Keeping that positive energy going And it seemed like nothing really changed here in this quote So let's just go piece by piece He said he wants to go somewhere just somewhere. I can win some games and clearly I don't mean just three or four So this cat what this lets me know and I'm not trying to be inch high private I anything like that. I'm not trying to be super detective. I'm not trying to be inspector gadget But what this lets me know for Matt Jude on is that it's not all about the money That's what it doesn't know. It's not all and now he's trying to get paid He's trying to get paid, but he wants a good combination of both. It sounds like he wants some balance To where yes, he gets paid. He makes a nice chunk of change. He makes a lot of money He wants that but at the same time He doesn't want to sacrifice winning Just to be the highest paid or just to be a top three paid or anything like that That's what it sounds like to me That he wants to get paid But he just he doesn't want to get paid by a losing team And it sounds like he may be willing to accept a little bit less a little bit not not no crazy Not less, but it sounds like he may want be willing to accept a little bit less if he can remain Or go on a new winning team Because you got to think about it Matt Jude on All he knows is winning That's it Well besides the playoffs and stuff with the Ravens, but ever since Matt Jude on has been on Ravens their winners their winners He does not know what it's like to lose and from that quote. He doesn't want to find out So I can't blame him He wants balance a balance between pay and and great play of a team So no problem with that at all And then he says, I mean you love to be wanted You love to be wanted and hey, I also may be a Raven for a lifetime And I don't even know yet But we have to see So that was clearly just a straightforward Comment about Baltimore And you know he loves Baltimore he loves the Ravens he loves the team He wants to be there a lot of people want him to stay there a lot of people want him to remain there Will he remain there? We got to see how the business works itself out Now this this reminds me of when um when we spoke to uh to Sarah Ellison when she was on On the channel and she made a really good point about this year's salary cap with it Taking a significant drop um a Lot of players who may be expecting to get paid the big bucks a lot of players who may be Expecting to really cash in and free agency. They may not be able to cash in like that They may not be everything that they hoped it would be and it's no fault of their own It's just that timing continues to be everything and with time in continuing to be everything The timing of being a free agent right now. It's not the best in the world Not saying that they can't get paid because clearly it's dudes are still breaking records with the contracts and all of that And I'm still sure they are They're gonna be paid significantly and they're gonna get significant raises But it may not be all that is cracked up to be this year So some guys could potentially sign like one year deals with teams Just to be on a new team and have that potential and then really cash out next year So with this statement about you just you love to be wanted I mean, yeah, of course, who does it who wouldn't want to want to be wanted? Everybody loves being wanted But the follow-up I also may be a Raven for a lifetime and I don't even know yet But we have to see So that lets me know that he's still leaving that door open for the Ravens to go ahead and make that move He's still leaving that door open for the Ravens to be like, okay, you know what Jude on Let's work something out Let's work something out Let's let's let's let's see what we can get done Now do I expect it to happen? Hmm, I think it's possible. I don't expect it, but it is certainly possible Especially if he was worth to do something like that to take a one-year deal Something significantly smaller.  It should I think it should actually be coming out this week Because I'm recording this on Tuesday, February 16th. I believe it's supposed to be coming out this week We're supposed to get some clarification on exactly what it'll be. So we'll stay on the lookout for that But with Matt Jude on it's just it sound like his options. His options are not wide open Because again, he doesn't want to go to a franchise desk. That's about losing But um, he he also wants to he wants to cash in as well so We'll wait and see like Matt Jude on we just got away and see what happens like he said So team keep it clean appreciate y'all I love y'all and just like we really don't know what Matt Jude on is gonna be with the Ravens or not I'm out


This is the Natural History Museum in Rotterdam, the Netherlands, where I work as a curator. An ordinary day at work can pass without much excitement, but on June 5, 1995, a loud bang against the window changed my life and ended that of a duck. When I heard this bang, I looked out of the window and I saw this. This was the duck. It died because of the collision with the glass, but next to it was a live duck, and please pay attention, both are of the male sex. Then this happened. The live duck mounted the dead duck and started to copulate. Well, I'm a biologist, I'm an ornithologist, I said to myself, this is something wrong. One is live, one is dead, and must be necrophilia.  So I sat down, took my notes, took pictures, and I could do so for about 75 minutes. Then I got hungry, I wanted to go home, but before I did that, I really had to collect the duck for the collection of the museum. And of course, I checked the sex of the dead duck, and here's a rare slide of a duck's penis. So it was indeed of the male sex. So what do you do when you see something new to science? You publish it. Well, it took me about six years to decide to do that, because I couldn't explain this behavior. I could tell the story in a bar at the birthday party at the coffee machine, but I couldn't share it with my peers. In the end, I did it. The first case of homosexual necrophilia and the male duck. So here's the situation again. A is my office from where I heard the bang. B is where the duck hit the glass. C is from where I watched it. About six people read my paper. But then I got a message from Mark Abrams from Harvard University telling me, you've won a prize. You've won the Ig Nobel Prize. I said, the Ig Nobel Prize? Shouldn't these messages come from Stockholm? No, it came from Cambridge, Massachusetts. And the Ig Nobel Prizes, they honor achievements that first make people laugh and then make them think. And the goal is to make more people interested in science. So I said, yes, that's a nice prize. So I went to the ceremony and the ceremony is very special because real Nobel laureates, and you see about 12 Nobel laureates here, give the prizes to the Ig Nobel Prize winners. And you get 60 seconds to say something. And here's the duck. There you go. Winning this Ig Nobel Prize changed my life. People started sending me all kinds of duck related things. I have a huge collection. But more importantly, I became a kind of specialist in remarkable animal behavior. And if somewhere on this planet a bird or a mammal behaves badly, I know of it. First, there are the mistakes. This is a moose trying to mate with a bronze statue of a bison. This is in Minnesota, 2004. This is in the Netherlands last year, April, a frog trying to copulate with a goldfish. And now this is serious science. This is the first ever victim of homosexual necrophilia in a ground squirrel. The specimen was collected in 1959 and still kept in the Bell Museum in Minnesota. Here are barn swallows, a roadkill in Hong Kong, 2004. Turkeys in Wisconsin. And if you take a look at the other pictures, you see the famous turkeys of the experiments they did in the 50s in the U.S. Which concluded that turkeys copulate with almost everything, including a detached head. But look here. What's wrong with this picture? The position. These are cane toads in Australia, by the way. And these came in just a month ago from the Netherlands. Take a good look. You see the position of the female is lying on its back. And the missionary position is not done in birds. Besides, the duck was dead for two days. So there was my theory. I thought, well, death has to be sudden and in the copulatory position to have necrophilia possible. I don't know where this will end. Well, to end this now, a more serious matter. You're all invited to join me at June 5th, 5 to 6 for Dead Duck Day. We do it every year. We congregate at the Natural History Museum in Rotterdam to remember the bird that hit the window. And to discuss new ways to prevent birds from colliding with glass. Because that is one of the major causes of death in birds worldwide. When that's over, we go to a local Chinese restaurant. We have a six course duck dinnered. I hope to see you next year on June 5th. Thank you.


People are better connected than ever before, but the gap between the technology haves and have nots is still huge. A subject that was top of the agenda at today's WISIS Forum, where delegates grappled with how to bridge the digital divide. So we have several programmes in order to help the people from the rural area to use the ICT services. For example, for farmers to exchange merchandise and to sell their products, how to cultivate their plants etc. Getting 3G networks to rural areas in low income countries remains a big challenge. In 2015 only 29% of the world's rural population was covered by a 3G network. Vimplecom has 200 million mobile customers, providing cellular services to 10% of the world's population. In our markets still, two thirds of the people don't have access to the internet. It's 10% more than the global average. So there's still a lot to do in that regard, and that's why we continue investing in our mobile networks, including rollout of the 4G technologies, so that networks reach everyone, call to networks fast. But connectivity is not just an issue in the developing world. The digital divide actually is not just a bridge, it's very complicated, and the digital divide that exists is actually broadening, not just in the least developed countries, but also in developed countries. I have the opportunity living in the UAE, London and Nigeria, and I see this occurring everywhere in the UK. We are leaving behind the elderly people, people with special needs, and I think governments have to look internally before saying this needs to be done in developed countries. Bridging the digital divide was one of the topics that exercised minds at WISIS. The other was how ICT can be used to promote peaceful and inclusive societies. Sustainable Development Goals 16. This is exactly the reason for which UNESCO chose to move away from the information society concept. The message here was clear that building a knowledge society will help people share information and raise awareness to combat poverty and justice. The WISIS Forum is first and foremost a multi-stakeholder platform, but it also gives an opportunity for ministers to meet to discuss national approaches to ICT for development, and look at how ICTs can strengthen the implementation of all 17 Sustainable Development Goals. The high-level track of WISIS 2016 has now ended, but there's still two days left of the forum. Tomorrow we'll be at the International Telecommunication Union, where we'll be hearing from the heads of UN agencies, non-governmental organisations and the private sector, on how they use the power of information technology to power development.


Welcome back to intracranial bleed. In this section, we will discuss the investigations. The investigations of intracranial bleed starts with a non-contrast CT scan of the head. On a non-contrast CT head, acute bleeding will be white. Let's see what the different bleeds will look like on CT heads. First, epidural hematoma. An epidural hematoma, as you might remember, is on top of the dura. Since the dura is deeply attached to the inner table of the skull, the blood will look lentiform. On a CT head, it will look like this. The white is the epidural hematoma. You may also notice that the contour of the skull is uneven here, suggesting a skull fracture. Notice also how the ventricle on this side is completely obliterated. That is due to the mass effect of the epidural hematoma. Next, subdural hematoma. Since the blood is now underneath the dura, it has more of a crescent shape. On a non-contrast CT head, it will look like this. Which side is the subdural on? This is the subdural hematoma. When you look at the lateral ventricles, you would also notice that there is mass effect from this hematoma, causing a shift in the midline. Traumatic subarachnoid hemorrhage will be seen in the subarachnoid space. On a CT head, it will look like this. Can you spot the traumatic subarachnoid hemorrhage? What about a subarachnoid hemorrhage that comes from an aneurysm? Since most aneurysms arise from the circle of Willis, when there is an aneurysmal rupture, the blood will be around a circle of Willis on the CT scan. Like this. You can see the blood outlining the circle of Willis and the CSF space around it very well. Let's move on to parenchymohematoma. For trauma, the parenchymohematoma will occur where the trauma is. On a CT scan, it will look like this. That is the parenchymohemorrhage. Do you see another type of bleed in here as well? What about this bright white line? It's bright, so it's likely to be fresh blood. It lines the inner table of the skull, forming a crescent shape. This is a small, subdural hematoma. For non-traumatic parenchymohematoma, it is usually caused by hypertension. The bleeding tends to concentrate on a few areas. The thalamus, basal ganglia, the pons, and the cerebellum. Those tend to be the area where the non-traumatic parenchymohematoma occurs. On the CT head, it will look like this. As you can see, this parenchymoblead is in the basal ganglia. Even though CT is the first investigations in patients with potential intracranial bleed, it has its limitations. It is related to the age of bleeding and the amount of bleeding. As you have seen before, fresh blood is bright white on CT scan. However, as it ages, the fresh blood will become less and less white and eventually become isodense as CSF at around two weeks time. That makes the diagnosis more difficult, as it is harder to appreciate the bleeding on the CT scan. That phenomenon is often seen in patients with subacute subdural hematoma. Remember for subdural hematoma, since the bleeding is venous, it tend to be slow. With the gradual accumulation of blood, the patient may not be investigated until much later after the initial bleeding has occurred. Therefore, if you were to investigate a patient who have had a two-week-old subdural hematoma, the CT scan might look like this. You can appreciate that we do not see any bright white. However, on the left side, there is a much larger CSF space. This is the subacute subdural hematoma that is likely at least two weeks old. If you look in the right frontal area, there is also likely a subacute subdural hematoma as well. You can see how them can be tricky to diagnose. The second limitation has to do with the amount of blood. When the amount of blood is quite small, it is simply very difficult to see on CT. This is especially relevant in patients with subarachnoid bleeding from aneurysms. Remember that in some patients with aneurysmal subarachnoid bleeding, before the aneurysm rupture, they can have a warning event, a leak of the aneurysm, also known as a sentinoblide. That sentinoblide tend to be in very small amount. Therefore, if you see a patient and you're really worried about a sentinoblide from the history, you would first order a CT scan. If the CT scan is negative, often we will do a lumbar puncture. That gives us samples of their CSF. In the CSF, we will look for red blood cells and xanthochromia, helping us to diagnose whether there is any blood in the CSF. In a patient that we're working up for a sentinoblide, if the CT scan is negative, when should we do the LP? There are different studies in literature that will shape our management. It has to do with the onset of the symptoms, how good the CT scanner is, and who's interpreting the images. In the patients that has extremely high risk for a subarachnoid bleed, a lumbar puncture remains the gold standard. It is best to discuss each case with your attending physician to decide on management. To diagnose a non-traumatic subarachemorrhage, either the patient would have a positive CT scan, or if the initial CT scan is negative, a positive LP. In summary, we discussed the CT findings of patients with intracranial bleed. Based on the kind of bleed, the location and the shape will be different. We also talked about the limitations of CT scan based on the age of the bleeding and the amount of bleeding. We also discussed how we might want to do a lumbar puncture in a patient with subarachnoid bleed when the CT scan is negative. We hope you find this useful. Thank you for watching.


Hi there and welcome to another edition of Tuesdays with Corey. I'm here in my office sitting with Gabe who just launched an exciting new capability on Azure, a new scenario, new feature called AKS. This is a managed Kubernetes offering on Azure. It takes care of updates, it takes care of scaling, it takes care of a lot of really cool stuff. It spins them up really fast and we pay for the control plan. So you actually don't have to pay for anything except for the nodes that you're spinning up for your workload. But instead of me talking about it, why don't we have Gabe here in this office, show you a little bit of what this looks like, talk a little bit about it, and show you a demo. So Gabe, over to you. Hey, thanks Corey. Excited to be here. Excited to talk about AKS, new managed Kubernetes service from the Azure Containers team. So the thing about Kubernetes is that it's really great to take over the world by storm with containers, but it's not really the easiest thing in the world to operate, especially in production. So it's gonna be a little tricky to get up and running with it. So those are really the two things that we focused on. We're making a Kubernetes experience that was easy to stand up, easy to use, but also easy to operate over the long term. So I wanna show you a little bit about what that looks like, so let's go ahead and dive right into a demo. So here you can see, I'm gonna go ahead and use the Azure CLI to show, actually list the AKS clusters that I've got running. And you can see we have a cluster deployed right now into East US running version 1.77 of Kubernetes. Now, spinning up a cluster takes about somewhere between four to five minutes or so. I'm actually pretty quick to get up and running. Now, once you have the cluster, what you can do is AZ AKS install CLI. And what that's gonna do is it's gonna go ahead and download the Kube CTL command line client. You may or may not have this client on your machine, but if you don't, this is a really easy way to get it. And the last thing you need to do to just get up and running is AZ AKS get credentials. And if we specify the name of my cluster, which is my Gavra TV handle, and the name of the resource group, which is AKS, what's gonna happen is we're gonna go up to the cloud and we're gonna pull down the Kube config credentials. Now I can use my Kube CTL command to get the nodes and take a look at my cluster, which has been up and running for a little while. Now we can see we got three nodes of AKS running version 1.7.7. This cluster is good to go. We can deploy workloads. We can get what we need going here. And yeah, it was really easy, just three steps to get going. So yeah, what'd you think? Pretty impressive, huh? All right, you ready? All right, cool. So the next thing I want to show is, I think the thing that I'm most proud of, which is the upgrade and maintenance of the cluster. So I mentioned before I wanted to make this easy to use, which we've done, but we also want to make this easy to operate. So what I have now is a new environment. And I'm gonna here show that we're running 1.7.7, but what if I want to modify the version of this? I can do a AZ-AKS get versions on my Gavra TV environment. And we can see here what versions are available. Oops, let me output that to table. And we can see here that with over running on 1.7.7, the master and the agent pools have different versions available for me to upgrade to. So I can upgrade to the latest in this case, which is version 1.8.2. So let's go ahead and do that. It's gonna be very simple, AZ-AKS upgrade. Name on my cluster, name on my resource group, and specify the target Kubernetes version. Let's go all the way up to the latest, which is 1.8.2. So we'll go ahead and do that. Now, for the moment, we do take a very, very momentary outage. This is something that's only in the preview. We're gonna be, you know, exposing a very zero downtime upgrade going forward. But I'll say yes. And this can take a little bit. So while we're waiting for this, one thing I wanna show you is one of the most common questions we get is why is this service, and how is this service different than ACS? What's the difference between ACS and AKS? Well, I think the most important thing to consider is that ACS is a hosted service. So if we take a look at the terminal here, we can see at the top we have an ACS cluster. And this ACS cluster includes three master nodes for highly available configuration. Now, these masters are servers that you have to worry about. You gotta patch them. You gotta monitor them. You gotta care and feed for them. You also have to pay for them. And if you take a look at the bottom down here, you can see an ACS, sorry, AKS cluster with three nodes. And these nodes are actually, you know, just the Kubernetes that you want, right? There's running your workloads. It's really just the value that you're getting out of the service, right? So it's really great with AKS that we don't actually have to, you know, bother with a lot of that master infrastructure and that control plan is hosted for customers. Now, what you also notice is that the upgrade is actually running through here and we can take a look at this first node and you can see that this node is now ready, running version 182, which is what we asked the cluster to upgrade to. And the second node here is now not ready. This node is currently falling out of the cluster. We're actually draining carefully all workloads off the cluster, rescheduling them onto the other nodes in the cluster and making sure that we can do the upgrade but do it in a way that doesn't have any downtime. So with AKS, you know, we're really proud of this, that, you know, we have this automated upgrade capability. The control plane is self-healing. Everything is really easy to use, really get up and running, really easy to operate. And most of all, you don't have to pay for those masters. So it makes it a lot cheaper for you. So yeah, really excited about the service. And yeah, Corey, great to be here with you, I must say. And yeah, thanks for having me on Tuesdays with Corey. Thanks, Gabe. That was really fantastic. And especially because I could see it here in person. And thank you so much for enjoying this wonderful Tuesdays with Corey. We've got many more things coming, lots of demos that I'm going to show you here in the coming weeks. So stay tuned. Questions, comments, feedback, ideas. Hit me up at hashtag azureTWC. And with that, have a wonderful Tuesday. And goodbye. See that? Almost forgot. Almost forgot. All right. It's been so long. Hi there, and welcome to another edition of Tuesdays with Corey. I am here today sitting in my office with Gabe Monroe. And we are here to talk about the recent relaunch, relaunch, the recent... Okay, we're going to start this over again.


Go search the land and search the sea then come you home and sing with me Let's take the poet's advice and make the trip everyone dreams about a freighter trip around the world Find our sailing point on your globe the great city of New York We thrill to the harbor sounds as we board ship bound for Plymouth, England 3046 nautical miles away There's the tugboat whistle We're on our way Before long we're sailing the mighty Atlantic following the northeast route on your globe Our ship heads for the Grand Banks off Newfoundland through one of the greatest fog areas in the world Here warm air above the Gulf Stream meets cold air rising from the icy Labrador current and thick fog hides the sea and sky Put your finger at the spot where our mileage is shown from here for about 500 miles We'll be crossing mountains that lie on the bottom of the sea 5,000 feet below our ship This underwater mountain range called the mid-atlantic is longer than any on earth's surface a few days later Seagulls come out to meet us and we know land is near We enter the choppy waters of the English Channel to land with great excitement at Plymouth and see the very dock Where our pilgrim fathers boarded the Mayflower? Soon we're on a train on the way to London big Ben greets us We spend a few days seeing the sights West Minster Abbey Buckingham Palace Piccadilly Circus, which isn't a circus at all, but a circle of busy streets We enjoy a boat ride on the River Thames to the Greenwich section of London All east and west distances in the world are measured from the imaginary line running north and south through Greenwich This main street on your globe is called the Prime Meridian There's time to visit Paris if we go by air What a view as we circle Orly Field The famed Eiffel Tower pierces the sky There's the Cathedral of Notre Dame on an island in the winding River Seine Seeing Paris on foot is the way to enjoy its excitement its tree-lined boulevards and glittering shops Dinner at a sidewalk cafe is a special thrill Now it's goodbye to Paris and on to meet our freighter in the port city of Brest Find it on your globe and follow our route south along the Bay of Biscay The wind is rising fast The captain warns us that high tides and northwesterly winds often bring sudden storms to the bay Gale winds lash our ship Tremendous waves pour over the deck and were ordered to our cabins We watch the roaring storm for hours until it dies as suddenly as it came We sail around Spain and Portugal and through the narrow Gibraltar Strait There like a mountain rising out of the sea towers the mighty rock of Gibraltar every inch of British fortress Huge guns hidden in caves stand guard on the rocky heights We're all on deck to watch our entrance into the Mediterranean Once the very heart and center of the old world The word Mediterranean means middle of the earth Some of the earliest cities in history were built on its shores and for hundreds of years ships travel only within the limits of this inland sea The weather is delightful just like our climate in southern California While our ship plows serenely along its route our global view shows us Italy shaped like a boot stretching into the sea Rome its beautiful capital once ruled the world Her splendid palaces Churches fountains and statues are the work of the greatest artists of all time The magnificent dome of st. Peter's the world's largest church was designed by Michelangelo Across the beautiful Bay of Naples lies Mount Vesuvius the dreaded volcano In the year 79 it blew its top and buried two cities under ashes and lava as Globe travelers we have a special interest in Greece The ancient Greeks were the first people to realize the world was round 1600 years before Columbus the first globe of the world was made by a Greek scholar named Cretis to the people of ancient Greece We owe much of our knowledge language and culture in the glorious city of Athens Visitors climb a broad hill called the Acropolis to see Greek temples 23 centuries old whose beauty and perfection have never been equalled Let your eyes travel across the Aegean Sea to Turkey the country that lies in two continents In the narrow Bosporus Strait that cuts Turkey in two parts Europe and Asia meet Move your finger to Turkey's eastern border There's Mount Ararat where it said Noah's Ark came to rest Along the eastern shores of the Mediterranean Let's find Jerusalem a holy city to three great religions a Stone wall divides the old city from the new In the old city which belongs to Jordan. There are shrines to the Christian Jewish and Muslim faiths The new city belongs to Israel where arid deserts have been transformed into useful land At port side we begin an exciting trip through the great Suez canal that slices through the Egyptian desert for a hundred miles Before this man-made waterway was opened in 1869 Ships sailing between Europe and Asia had to go all around the southern tip of Africa No wonder Suez is called the world's most important shortcut An Egyptian pilot who speaks seven languages comes aboard to assist our captain We travel slowly with a long convoy of ships single file for 12 hours Near our entrance into the Red Sea is Mount Sinai where Moses received the 10 commandments The Sun is scorching as we cross the Tropic of Cancer shown on your globe as a broken line running east and west We're in the tropics now the only places on earth where the Sun ever shines straight down To our left is the great desert country of Saudi Arabia where oil is more plentiful than water We see ships of all kinds even the billowing sails of graceful Arab dows Carrying cargoes of dates dried fish and pearls Our freighter stops to refuel at Aden and we go ashore to stretch our sea legs This British colony which guards the southern entrance to the Red Sea lies sweltering in a bowl of volcanic rock From the Gulf of Aden we sail across the wide Indian Ocean bound for Melbourne, Australia Now find that famous imaginary line the equator running east and west around the middle of the earth It's the other main street on your globe the one from which all distances north or south are measured It's an old seafaring tradition to initiate people crossing the equator for the first time King Neptune wearing a silver crown and rope like beard a member of our crew in disguise Charges us with a long list of imaginary crimes We're sentenced to have our faces dobbled with soap socks and shaved with a big cardboard razor When the fun's over King Neptune gives us each a certificate proving that we are now trusted shell backs In the ancient order of the deep Days are calm and clear nights brilliant with stars Now and then the school of dolphins swims beside us in pursuit of flying fish leaping from the waves Our ship seems like the only island in this empty ocean and you wonder how the captain can tell where we are Just before noon one day you find out when the first mate looks up at the sky through an instrument called a sextant He's shooting the sun waiting for the exact second it reaches its highest point in the sky Using the nautical almanac he can tell from the sun's angle exactly how far south we are To find how far east we've traveled he reads the chronometer an accurate clock which keeps Greenwich time We reach the end of the tropics where our route crosses another broken line the tropic of Capricorn We're approaching the island continent of australia and here's something surprising It looks like the united states upside down and it's almost the same size There's Perth near the southwestern tip the city which gave astronaut john glenn a friendly lighted welcome land ahead We crowd the rail to watch our entrance into melbourne sunlit harbor A high spot of our visit is a trip to the immense stadium where the olympic games were held in 1956 Something else is upside down in this country that northern people call down under When we have summer they have winter although it's milder than ours because they're closer to the equator Australia is a land of contrasts with vast deserts broad grasslands and tropic jungles We even see snow cap mountains as we fly to sydney Let's go to sydney's famous zoo and see fascinating animals found only in australia There's the tall kangaroo covering 20 feet in one jump And here's the odd-looking platypus Half bird half animal The cuddly koala bear looks like a live teddy bear listen That's the lyre bird he can imitate the call of any bird in the country bark like a dog Or toot like a motor horn But here's the funniest bird of all the kukabura His laugh is like a donkey's bray and his chuckles are almost human From sydney's magnificent harbor. We start our voyage across the world's biggest ocean Have you ever dreamed of living on a south sea isle? You'd have many to choose from Thousands of them dot the pacific small coral ones Some too tiny to be mapped and large ones like the hawaiian chain Which are the peaks of volcanic mountains rising up out of the sea Our course takes us near the fiji islands a chain of steep-sided mountains green jungles and coral reefs The fijis are an important trading center, but many old island traditions remain One of the strangest is the fire walking ceremony in which men walk barefoot over red hot stones and come out unharmed Now look at your globe. We're crossing that blue and red line called the international dateline And a startling thing has happened. We've gained a whole day Long ago all countries decided to make this the place where a new day begins Crossing the line going west you lose a day But going east the direction we're traveling you gain a day Here and there the dateline jogs so some places can have the same date Once we've crossed the equator We feel we're really homeward bound as we sail toward our nation's new estate the enchanting islands of hawaii On the dock at Honolulu. We're greeted with a friendly hawaiian welcome a garland of fragrant flowers First thing on our tour is a swim at the famous beach of Waikake What excitement as we paddle out half a mile against pounding surf in a big outrigger canoe Then let a huge wave zip us back on a mountain of rolling water In the shadow of diamond head Honolulu's famous mountain We enjoy a real hawaiian feast called aloo wow Soon it's aloha and we're sailing toward san francisco on the last leg of our trip It's a joyous moment when we catch sight of golden gate bridge and the shores of our own land Mr. World is a big place Mr. World is wonderful We've journeyed far but there are still so many wonders left to explore As globe travelers the whole wide world is ours to enjoy in a never-ending adventure


Take it away Sandy. Thank you. Can you hear me? Yes, Sebastian. Can you hear me? So I'm Sandy Metz. I'm from Duke University. I know that you guys some people think of the as as universities as being just like the enterprise except with lower standards. There's a little truth in that. Honestly, there's a little truth in that. But also universities are places where we get more freedom to do to to be out on the leading edge of software and because of that at Duke, I'm sorry, they told me to stand back here in the light. At Duke, we've been writing small talk apps since the early 1990s. So I have 10 years of experience of small talks. There's if this were a weekday, there would be someone in my office doing maintenance on a production application that's written in small talk that does grants management at Duke University. They would be working on it right now. We're a little bit different than a lot of you in that we don't have millions of users. We don't have high transaction rates. We don't have huge piles of data. But what we do have is applications that have been around a long time and that get changed really every day. So the apps that I write, I don't actually use myself. So you can't really say that we eat our own dog food, but I look at leftovers every day and I have for a long long time. But enough about me. Let's talk about you. Because you're here, I'm guessing that you've written an application. And even though I've never seen that app, there's something I can say about it. It's going to change. And when it changes, what will happen? The experience that you have when your application changes depends on its design. For example, your application might look like this. It might be rigid. Rigid applications. In a rigid app, everything is connected to everything else. And when you make a single change over here, it changes this thing and this thing and this thing. And it's attached to the thing at the far ends of the app. Any change you make, no matter how small it is, causes a cascade of related changes. Or your app might look like this. It might be fragile. Now fragility is a lot like rigidity. The difference between fragility and rigidity is fragile apps are rigid, but you can't tell by looking. So in this case, what happens if you move a wire? You can't predict. This application is both rigid and fragile. Or your application might be immobile. Now immobility is that quality where you'd like to reuse some code somewhere else. But you can't extricate it from where it is. And so what you end up doing is you copy a section of code and you take that same section of code and you put it somewhere else. You don't actually have reuse. You have reuse through duplication. Now just in case you find this image a little wiggling, let me assure you that no dolls were harmed in the making of the conjoined twin mummy. You do have to wonder about the guy who made the doll took the photo and put it on flicker. Anyway immobility. And finally there's viscosity. Now viscosity is when it's easier, when you want to make a change and you can tell how the original designer wanted you to behave. But it's easier to do the wrong thing.  And you try not to pay attention when the door opens and stuff falls out on the floor on someone else. And you pretend that that didn't happen. So how is it that your app is rigid and fragile and immobile and viscous? It didn't start out that way. In the beginning your application was perfect. It was perfect. It was like a beautiful flower. It was a joy to work on. And then it changed. And that's all that happened. It changed.  And I'm here today to talk about how design can save you. Ooh that was fast. Okay I'll slow down. This is a picture from Martin Fowler's website. Across the horizontal axis is time. The vertical axis is accumulative features. And this is a picture, there's two lines plotted on this graph. The red one is good design and the blue one is when you write code and you don't do design. And as you can see there's a point where those two plotted lines cross. And what this graph illustrates is that as time passes and you add features, there's a point in time when you're better off to have done design. Design was like TDD, right? Early on design takes time and tests take time. And at some short interval in your app you can get more done feature wise if you don't spend time on those activities. However, and actually this graph suggests that you should skip design if you plan for your application to fail. But if you think it will succeed, it's going to continue to cost you money and design will pay off. And actually the interesting thing here is if you get to the point where you're in a parent success and you haven't done design, you push enough features out the door in a short period of time, you can guarantee that you'll fail later when they ask you to change it. Because at that point you'll be unable to do so if you have not done good design. So today I'm talking about the solid object oriented design principles. This is an acronym that was made up by Robert Martin. And the four terms I just used to describe rotting software, rigidity, fragility, immobility and viscosity are directly from this paper of his called Design Principles and Design Patterns. It was written like in 2003, the early 2000s, he didn't make up all this object oriented design stuff. He didn't make up some of it, but not all of it. A lot of what he did, he's rightfully, he's famous and rightfully so for taking a lot of ideas that were floating around and giving them all names and making it so that we could talk to each other about them. So he deserves a lot of credit for that. The acronym that they use, the principles that he made form an acronym that they've called SOLID. And so here they are, the five solid design principles. Now you've probably heard of some of them, but I doubt that you've heard of all of them. I'm going to run through them and give you a brief definition of each and then we're going to come back and talk about them a little bit. S is for single responsibility. There should never be more than one reason for a class to change. O, open, closed. A module should be open for extension and closed for modification. It's interesting, on the face of it that seems impossible. It should be open, you should be able to change it without actually changing it. L is for Liskov substitution which is about subclassing and in case you're confused there's this handy formula to make it more clear. I is for interface segregation. That seems total gibberish. I completely agree. D is for dependency inversion. Dependency inversion says you should depend upon abstractions and not concretions. Okay, there they are, the five of them. Now, they seem so academic, right? How can this help? Like so much of the stuff that we talked to you about, these things tell you a state that you should be in when everything is right. But they don't give you much guidance about how to get there. I'm going to turn them around and talk about it. Well, actually, let me say one more thing. They seem like they're all about different things. Some of them seem orthogonal to each other, right? Open, closed is a goal. Single responsibility and dependency inversion are coding strategies. Liskov is that confusing formula. And interface segregation doesn't even seem to apply to us. But they share a common theme and they're about managing the dependencies in your application.  Everything that we do design-wise is really about dependencies, no matter how people talk about it. If you're entangled with another object and it changes, you have to change. These entanglements are what makes your code rigid and fragile and immobile and viscous and it's a death spiral. If you get caught where things are tangled, it's very difficult to make changes without those changes cascading throughout your entire application. These are words, actually, these are not Robert Martin's words. These are Steve Freeman and Nat Price's words. And it's just another way of describing this exact same goal. These guys say that your code should be loosely coupled, highly cohesive, easily composable and context-independent. Now these are just different ways of saying the solid design principles. Loosely coupled is about dependency and injection. You should inject dependencies. Highly cohesive says a class should all be about the same thing. It should have a single responsibility. Easily composable and context-independent, it's exactly more talk about dependencies, right? Your app should be made up of a bunch of context-independent objects that you can rearrange to get new behavior without changing the actual code. Oops, sorry, here, wait. So all of this is just about strategies, actually, we're going to move on. All of it's about strategies to achieve independence. So I'm going to rearrange them so that we can talk about them. And I'm going to talk about them from the bottom up. And fortunately for you, we're going to throw some of them out right now so we can just skip them. Interface segregation is something that you care about if you're statically typed language. If you're writing C++ or you're writing Java, when you have to deal with another class, you have to deal with an instance of that class and have an interface.   The language itself, in this language, your dependency on another object, you depend on the signature of the method you're calling. And otherwise the object is a duck. And so dynamic language is by their very nature, obey this principle in the most extreme way possible. So we can just quit talking about it. Oops, sorry, over here. Sorry, too many clicks. There we go. We're not going to talk about it again. ListGov is about subclassing. Now tell me, I would be interested in knowing who in here has written a class that they then created their own subclass of. This is outside of the active record stuff. Somebody wrote a domain object, some kind of a model object, so a few of you, but not very many. Right, less than half of the people here. Okay, ListGov talks to you. What ListGov says is if you make a class foo and you create a subclass foo-ish, any place you use a foo, you ought to be able to substitute a foo-ish. Simple as that. If you don't do that, if you subclass it and then you return like different things from the method calls such that your callers have to say is kind of to figure out what to do with the object they have, you have violated ListGov and you've created a dependency. Is kind of is your code smell in that case? Don't do it. If you subclass objects and you find that they have to violate the contract that the superclass has, what you're saying is it's not really that kind of thing. And so you should think about your design more and avoid that problem where else you can hang dependencies on yourself that are going to ripple through your code and make people say is kind of in order to know how to deal with you. But that's all we're going to say about ListGov because I don't think you guys mostly don't do subclasses. All right. So mostly today what we're going to talk about is open close, achieving open close through applying single responsibility and dependency injection. So we're going to write some code. Now I'm sure this is going to, this strikes fear in your heart because I know you can't see the code. It's unfortunately, I think we all had an idea, a vision of how big that screen was that was wrong. So I've flung all my code samples up on a website this morning. And if you follow that top URL, you'll get to the page that we're on now. Okay. So it's on, if you look at the tag for Gruco on Twitter, that link is on there so you can click on it.  Stay with me now. All right. I know what you're going to do now that you can see it. So I'm going to make a few ground rules about this code. I was tormented about whether or not to show you an involved code sample because we're going to look at code now for 20 minutes. But I really believe that it doesn't help you to have me talk to you. It doesn't matter. You can be telling you how it should look once you're done with it doesn't really help. We're going to take some code and refactor it using these principles and try to get to the point where it's open closed. Some ground rules. And there's, I'm just going to state what they are and not really defend them. But smarter people than me and people that know more about mocking and subbing than I do will have better defenses of these rules. But I'm going to do this. I'm only going to mock classes that I own. And I'm only going to stub in the object under test. All right. And I'm happy to have a discussion with anybody about that who thinks there's a different rule out there. But these are my rules. And so we're going to obey them in the test that we write today. This is the app that we're writing. There's a FTP server somewhere that has a CSV file on it. We're trying to get that file over, parse it, and throw it in a database on our side. The data involves patents. And so I'm writing a thing called patent job. You're going to see this data in the slides. There's a little file of test data. There's an FTP server that has some configuration information that'll let us get to it. And there's an active record target. You can tell I've been, I'd had a long bicycle ride the day I was working on this presentation. I was really tired. I wanted the NAP compressor badly. Okay. So let's write the spec for patent job. It should do these two things. It should download the file. And it should store it in the database. I'm going to just drive through the spec in the most naive way possible. It seems like job ought to have an API that includes download file. It seems like job ought to have a method that says run. I know that I have more than one assert here, but I would assert to you that they're all for the same feature and that I'm allowed to do that. And here's the class. The simplest possible implementation. It says run, which calls a few more methods. Okay, let me stop for a second. Can everybody either see the screen or see the code on their PCs? Yeah? Tell me if you're, okay.  I see heads nodding. I like that. So here's the class. If I expand the download file method, you'll see that it calls net FTP and passes all those arguments. This slide you probably can't see, but it's, this is the entire class. So I just put it up here to give you some sense of how much code was involved. This is my entire application at this point. And it works. It passes those tests. The tests run green. Here's what the app looks like. Just what we said when we started with. And now I guess we're done. Well, I don't know. Maybe we're not done, right? I don't know how you feel, but I don't really like that code very much. It works. It does exactly what it's supposed to do. It's probably the simplest possible implementation. My tests run green, but I'm uneasy. This code won't tolerate change. And I have to download the file every time I run the test. So there's a bunch of things that could happen that would cause me to have to go in the source code and edit this code. Maybe I'll never write another job. Perhaps you should quit now. It's possible, right? Use your best judgment. Just because I can refactor this doesn't mean I should. However, it's also possible that if you refactor it, you'll find something that you didn't know is true. And it's like TDD in that way. Design is emergent when you follow the object-oriented principles, just like features are emergent when you follow TDD. So I don't like some code smells about this, and I'm going to change them just because I don't like the code smells. And here's the first lesson. Resistance is a resource. In your personal life, with your spouse and your children and your dog, right? It's information you didn't have. You can push back or you can listen to it and try to hear what it's really telling you and fix it. In this case, I want to listen to the code smell even though I don't really know what's wrong. I can't articulate what's wrong and I don't know where I'm going. But I know that something's not right and I believe in the rules. Also, if testing seems hard, there's something wrong with your design. That's the bottom line. If you reach the point where you don't know how to test what you're trying to test, your design is incorrect and you should examine your design in order to make your test simpler. In this case, well, so tests depend upon the design of your code. They reference the names of the classes of your code, the order of the arguments of your code, and they also reference the body of things that a class does. If you find your test has a lot of setup or is unduly complicated, the class that you're trying to test has too much stuff in it and is not well-factored. If you can't write the test, the code is wrong. So in my case, well, actually here's one more thing.  And if you're new to TDD and new to Ruby and you find that you're having a very difficult time writing test, it does not mean you should stop writing tests. It means you should learn more about object-oriented design. It will help you. So I want this to be open for extension and closed for modification, and that's just a goal. That's a far-off goal and I don't know how to reach it, but there is something very specific and concrete I can do right now. I can apply the single responsibility principle. Oh, sorry. Damn it, I get that wrong every time I practice this too. Okay, here, let's look at this. So we've been taught that you should write tests that are red, write code to make the test run green, and then refactor. And at the point of refactoring, the question that they always tell you to ask is, is it dry? Does it not repeat itself? I want to suggest to you that you ask yourself a few more questions at this point. I want to know whether the class has just one responsibility. I want to know whether everything in the class changes at the same rate, and I want to know whether the class depends on things that change less than it does. So ask these four questions every time you reach the green refactor point. The correct answer is yes to every one of them, and if you find that the answer is no, you should go change something in your code. In this case, when I look at the patent jobs spec, I find that I would read this as it should know how to download the file and it should know how to, whatever it says, it should know how to update the database. That AND is the code smell that says it has more than one responsibility. If I read that and said OR there, OR is even worse. OR says it has more than one responsibility and they're not even very related. All right? When I read this and it says AND, what I know is that I need to refactor this and pull a responsibility out of that class. Perhaps I should have been smart enough to recognize this to begin with, but the beauty of this is you don't have to be smart to start with. You just have to know the rules and you can apply them and dig yourself out of these holes. So I'm going to move the downloading code out of the job and put it in a class by itself. Now, now I can mock. And when am I allowed to mock? I'm not allowed to mock behavior that's in myself, so I couldn't mock this before I was stuck downloading the file, but now I have a virtual other object that I can define as a role and mock in my system. It's going to have the API of download file and I can use it in my patent job class. This is the perfect place for a mock. It will make your tests faster without making your system more fragile. If I had 10 jobs, they could all use the mock. When I write the actual download code, I can write a real test that runs against the real external resource and I can use something like Micronaut by the Relevance Guys to have a class of tests, the long-running slow tests that are sanity tests that really do check the external resource but they don't have to run every time I run my big batch of tests. So the first thing I'm going to do is mock out this in the patent job class. This was the second test that was originally in that spec. Now I'm going to create a mock and put in there. Now this mock, it's just a mock. I'm mocking a role, right? Had I been smart, I could have done this to begin with but I didn't know it then. I didn't recognize it then. So now I'm going to put a mock in there and it's going to be a stand-in object, be a stunt double that sits in at this place in the diagram and I'm going to use dependency injection to get that behavior back in the original object. So you notice when I get a new instance of patent job, I'm going to pass in the mock downloader just like in real life. I'm going to pass in the real object. The code used to look like this when we originally wrote it. Now at this point, if I wasn't injecting the dependency, you might be tempted to do that. I used to call the download file method that was my own method. Instead I can go change just that one line of code and say get me a new instance of this other class whose name I know that I now am making a dependency on and the download file method is over there. Instead, you should do this. I'm going to inject an instance of the new class with the other responsibility back into the original calling class. Right? I got an accessor. I injected it and I took a default at injection time so that this class doesn't have to create one and my tests will all run any place I want to use it. Any place that I want to use it can take the default but I can also inject the mock in from the test without going in and changing partial objects. Now, you could make an argument, quite a successful argument, that this code is shorter than this code. And if you're only going to have one job ever in your life, maybe you don't want to do this. But let me ask you, do you expect your application to succeed? Because if it succeeds, you're going to want to change this later and if you don't inject the dependencies now, you're going to be unable to add behavior to this without changing the code later. All right, so now we need to write this new class, right? We mocked it in the test a minute ago but now I need to create this object.  I actually wrote this upload test file method here but other than that, this code is just completely ripped out of the other class. The spec is an exact copy of the old spec. The code in the class is an exact copy of the code in the old class. Resist the temptation to do more than you need to. Refactoring in this way is just like writing code with TDD.  Just follow the rules and see what happens. So now we have an application that has, where I've separated the downloading responsibility out of the patent job. And so I guess we're done. Oh, you know, the thing I meant to say, we're going to do this four times. And I always imagine in the next slide that that man is swimming. Surely he is. Those boats can't be stable. Okay, so now that we're back to green, let's ask these questions again and do this exact same refactoring. Is it dry? Yeah, it's dry. There's no duplicated code in either one of those classes. Does it have one responsibility? Well, probably. Does each class contain only things that change at the same rate? Class, again, it's hard to find words for these when you haven't done this very much. This class makes me uneasy. It's unlikely that net FTP will change, but it's pretty likely that the login or the path or the file name will change. This class seems to be a combination of completely static, very unlikely to change things, and pretty dynamic, pretty likely to change things. And I just hate that. I hate having the strings right in the method.  The chance of me having to edit this class to change that value is almost 100%. So the code smell is just that feeling of unease and the sense that everything in the class is not going to change at the same rate.  And we're doing this pattern of refactoring that happens over and over again. You identify the responsibility that you want to remove. You make a new spec in a new class that has that code and no other code in it, and you take that code and you inject it back into the original class. You just follow this pattern over and over again until you get to the point where you don't have any more responsibilities to take out. Do the simplest thing possible.  Okay, so in this case, I'm going to pull the configuration data out and put it in another object. The last time I did this, we mocked at that scene. And I know it can be really confusing to know when to use that whole mock everything that was a big idea for a while, right? And I don't know if anybody followed that path, like I followed that path for a little bit, and you can really ruin a bunch of code by trying to mock everything. You can make your code really fragile by doing that. In this case, I won't mock config in Downloader. There's no reason to do it. Config is not an external resource. It runs really fast. It's a value kind of object. It's really just a container for static data that it's not going to change during the life of my code. There's no reason for me not to use the actual production object here. And so instead of mocking at this scene, I'm at a point now where all my tests run green, I'm going to just go write the config object. And when I sit down to write this back, I realize I didn't have a test for this. It didn't make any sense to put this in my other test. It seemed far too detailed for the granularity of the test I was on, but it's actually something I probably should be testing, and I didn't know it until I drove through this cycle a couple of times. Now, and it also turns out, this is a conundrum often in tests. When I'm in the test environment, I have a test path, but mostly the reason I write tests is to make sure that my production environment will be okay, and it's different. So sometimes while you're in test, you need to pretend that you're in production so that you can make sure that it will really be okay in production and not just in test. So in this case, I injected the environment back into this class. Now, probably this is wrong. Probably it's wrong. If this ever changes in your real production code, you should inject it. If this is never actually going to change in your production code base, you should stub it in your test. Now, I kind of need that argument, so we're going to pretend for today that it is reasonable to expect that I might someday change the production environment while I was actually using this code. But what about that? This is an if statement, and if another environment appears, you can bet your bottom dollar I'm going to have to change this code. It is a code smell in any object-oriented class if you have an if statement. I realize, and sometimes if makes sense. But I contend to you that I'm an object. I ought to know what kind of thing I'm in. I ought to know what kind of thing I am, and I ought to do the right thing because of what I am. And when I have to start implementing this, no matter how well it's hidden, this is a code smell that says the design of the object is not yet correct. But that's okay because right now it passes that test. The bigger problem I have with this code is that now I'm starting to feel like if I had to make another one, if I needed some other configuration information that was environment-based, what would I do? Well, I'd just copy this class and change everything in it and make another one just like it. There is no abstraction here, and it's starting to feel to me like the idea of a configuration is a useful abstraction. Here's the next big point. You don't have to know where you're going to successfully refactor. Lots of times if you haven't done this very much, if you're new to Ruby or you're new to object-oriented programming, you can look at really nicely factored code and your immediate reaction is to give up. You think, I could never do that. Look how beautiful that is. I don't know how they thought of it. And the cold hard truth is they didn't think of it. They just wrote some crappy code to begin with and refactored it until it looked really good. You have the exact same ability to write really great code. Don't expect that it's going to spring full-blown from your head like Zeus, right? I mean, it happens because you know the rules and you have faith in them and you apply them over and over again. And then you end up with a good code. So I'm going to go back and scratch the itch about the strings that are the names of code. It feels more like it's something like this. It looks like my database you handled to me. Like that's the thing where I can put data that's configured based on environment. I sort of want to rip all this code out and put it someplace where I can change it and have it be in a text file. And if I were to do that, then I end up with this. Now, my tests are still running green, right? My tests have been running green all the time.  It reads the ammo file. I mean, I got the data out of it. And now we're back to something. I've refactored far enough so that I've arrived at a place that I recognize is not dry. Like now I'm failing on that first question. This code's not dry. And what's not dry about this code? This is where, okay, don't be intimidated if you don't know enough for Ruby to do this. This is the most reachable piece of metaprogramming you can do in Ruby. The way my YAML looks is a hash of hashes, right? And you see all this code, the method names and the names of the keys are the same thing. Let's do this. There's the whole class. Don't worry about it for a minute. I need to read the file. I'm going to push two arguments into the initialize method. Now, this is the same thing that took the Rails environment as an argument a minute ago, and it was an argument that had a place, right? Argument 1 was the envy. Now you see I'm taking a hash. And you can see the first two lines of code in initialize are to take the Rails environment and to take the name of the YAML file that I'm reading. The order of arguments in your method calls is a dependency. As soon as you hit resistance, when I got here I had to change my test because I wanted to change the order of the defaults. As soon as you hit resistance about your argument orders and you're trying to say, well, I need the default when the first one works. You don't know what order to put them in because you don't know what the defaults are. Believe me, it's a hash. Give up and make it a hash at that point. Once you make it a hash, you remove the dependency both from your tests and from all the code that calls it. And if you don't like writing those two lines of code, I'll tell you, you'll learn to love them. You'll learn to love them because they will save you so much trouble later. Do not resist at this point, right? If you look at well-written code in any framework, you'll find out that they have given up and they take hashes for all the arguments. They give you order independence and you don't want to be bound to that dependency.  Now, if you don't understand what that means, this is the code on the left writes the code on the right. And this is no longer a patented config class, it's a config class. This is a class that will take any environment-based YAML file that you can write, and it will dynamically generate an instance of a class that will have methods in it that return the values at those keys in your YAML file. Any kind of configuration in your system that you want, now you can write a YAML file and the Ruby code never needs to be tested again. You can absolutely rely on it being correct. That's so cool. I had no idea we were going to end up here. I just followed the rules, right? Everything that smelled bad, I fixed. And I fixed it over and over again. And then, you know, we arrive here. So that slide, I'm sure, meant something. Oh, so now I have to go back and inject config into PatentDownloader. It's easy. It used to look like this. And now I just inject it. And then I use it. And now here's my app. But wait, there's one more thing in this refactoring. Now I realize that PatentDownloader has nothing to do with patents. And all of the code in it just uses the configuration data out of its config. So I'm just going to change its name. I'm not going to assume anything else, but I know it's generic enough so that it ought to have a name. The name change is a dependency in my tests. As soon as I recognize I'm going to have to make that name change, I'm going to change everything in the system that depends on it while there's just a few of them. And now this is beautiful, right? There we go. And it really does feel like I should be done. But let's go back and check one more time with the rules. Is it dry? Right? Does it have one responsibility? Does everything in it change at the same rate? Or does it depend on things that change less often than it does? And so let's just look at the initialized methods of the classes that we wrote. Job depends on Downloader. Downloader depends on config. And Downloader also has this reference to the YAML file. Is that right? So here's how you decide. Put your object on a scale. Things that change from things that change a little bit to things that change often, right? The likelihood that they are to change, left to right. And you should depend on things on the left. That's all there is to it. It might not work in here, but it works in your code. Here's why. If you hang a dependency on it, there's always an object to scale about how likely it is to need to change. And low numbers are good, right? Low numbers mean your objects are loosely coupled, highly cohesive, easily composable, context-independent. You want everybody to have a low number. Unfortunately, something has to know about something else in order for your app to work, right? So there's always objects. Some objects are going to have to change more often than other objects. You want to change, and you hang a dependency on it of an object that is more likely to change. You raise its score. You can screw up a perfectly good object, an object that will never, ever have to change. You can screw it up by hanging a dependency on it for somebody that changes more often than it does. You want the dependencies, you want highly changeable objects to depend on objects that don't change much, not vice versa. And it's easy to do, right? You don't have to understand this what you have to do is inject your dependencies. Because if you don't inject your dependencies, you're screwed at this point, but if you have injected your dependencies, you can just go back and fix them. So what's wrong here? Now that you've looked at that other graph, what's wrong here is that that's wrong. That downloader file, FTP downloader, shouldn't know about that patent. As a matter of fact, now that I have this idea in my brain, I realize it shouldn't take a default at all. It's a very generic class. It shouldn't know this stuff. Pat and Job should know this stuff. And all it had to do was just put them on the chart and you know who should point each other and you can go move them around. So how am I going to fix Pat and Job? It takes two arguments in its hash. It provides reasonable defaults to those arguments. And I've created a dependency here about the order of these things and that's okay with me. It'll break right away in development if you get that wrong. It does not have bad consequences. So now my app looks like this. I have a reusable config class that I can use anywhere. I have an FTP downloader class that can download any file for a config that I inject into it. And I have a Pat and Job that's the most changeable thing in the system. So now, surely, I'm nearly done. Oh, I have three and a half more minutes and we can do this. What's left? What's left is things change. Things change, right? Now I've got 10 jobs. I've got a couple of different kind of downloads, right? Some are SFTP, some are FTP. I've got one that's a mechanized script that scrapes a website. I've got one that gets a database connection. It turns out I only have 10 jobs because I made this abstraction and when they came to me with the next thing, I said, oh, that's just like that other thing I did. I have an empire now in revealing hidden data. I've got a lot of times to have that. So now what they tell me is that some of the jobs that are using FTP are going to have to switch and use SFTP and we can't really tell you when. So I have this new requirement that says we don't know what the requirements are. Now you're probably all familiar with that requirement, right? And when you hear that requirement, you don't say, well, I can't write your system because I don't know what the requirements are. It's a feature of your app that is adaptable in the face of unknown requirements. And here, I don't know the name of that class. That's what they just told me. But I'll just put it in my config file and we'll use it dynamically to create the class at runtime that I should use for a downloader. Now, so the architecture of my app didn't just change, but the flexibility did. So here's all the code. This is the original job class. This is the new job class. It's about the same size as the original. But the initialized method is there and the downloader method isn't. Here's the downloader class. You can use it for anything, right? You can download any stuff you want. Here's the config class. You can make any kind of ammo file in your system and create an object that can answer all the values in it. So now we're done. So what does this all mean? What it means is that test-driven development is good, but it's not enough. It's not enough. BDD is great, but it's not enough. Dry? It's an excellent thing, but it's not enough. When you first came to object-oriented programming from whatever language you came from, those things seemed incredibly intimidating, but they're training wheels. Now you've reached the point. Now that you know those things and you're trying to apply them and use them in your daily life, you're more with design. If you follow the design principles, you'll find that your code remains flexible, easy to change, and fun to work on, 10 years from now. It's as fun later as it was to begin with, and then you get to keep your jobs and they keep paying you. All right, here he goes. Look at her credits. You should read both of these papers. They're excellent. They're really excellent. All right, thanks for hanging in there with the code. Appreciate your attention. Two minutes. Questions? I beat y'all to death, didn't I? You really did pay good attention, I have to say. I was quite impressed, yeah. Does metaprogramming somehow contradict with liscoff substitution if you're generating new methods and things like that? Oh, I'm sorry. He asked about metaprogramming and if it was somehow a violation of the liscoff rule. I said no. And here's what I would tell you. If you're designing code that other people are using and you're following these principles, what you're going to find is your code gets pushed into greater levels of abstraction. And it becomes black boxes that people ought to have a well-defined API and people don't need to understand the code to use an API. As a matter of fact, it's better if you do that. There's tension between having an easily, really incredibly straightforward code, which is just a long stream of procedural code and well-factor of abstractions. Well-factor of abstractions are what's easy to use. And so it's perfectly fine with me if you want to do the most, well, pretty extreme metaprogramming, as long as you hide it well. You have a clearly defined API and if you subclass it, the class is a Bayless call. Don't make me say it's kind of to use your code. Bad, bad, bad.   You know, it's not that Ruby's bad. It's that if you write code and you end up doing those things, it means it's not well-designed. And if you don't know how to fix it, it's perfectly okay to not know how to fix it, but there are people in the community that can help. And you should go find help, ask them the use groups about how to fix those problems and get your code to where you can, it's easily composable and changeable later. Okay? Anything else? Yes? Cross-off interfaces. You actually need interfaces in order to do dependency injection. Same thing? He said, I crossed off interfaces. He said, I crossed off interfaces and asked if I needed interfaces to do dependency injection. You do not need interfaces to do dependency injection. That interface segregation rule says that if everybody knows something about Java, like, so if you have a Java interface, you can either put, like, 200 method signatures in the interface and then make everybody dependent on it, or you can make a bunch of different interfaces each that have sort of, you can group it maybe in sets of 10 or sets of 50. That's just about breaking up big interfaces into smaller related interfaces so that you don't have to recompile your whole system when you do it. Dependency injection is a different thing. Dependency injection says, and here's my 30-second spiel about dependency injection, if you're going to name a class and get a new instance of it, but in your initialize method, and if you've done it in your initialize method, you may as well inject it as an argument and provide that new class name dot new, say, inject it as an argument and say equal class name dot new. If you do that, you can change it later. If you don't do that, you're stuck.  You think you know what use is going to be made of your code, but you don't know. These are all easily composable objects. Somebody will do you the favor of reusing your code later, and if you're getting new instances of helper classes inside it, they can't change them, right? Inject the dependencies and give the guy that follows you a break so that they can reuse the part of your code that you want to use while injecting some other behavior into it. We're done. Thank you.