Drawing a Circle on a 286
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
2:11Upgrade remedybg to 0.2.4.2
🗹
2:11Upgrade remedybg to 0.2.4.2
🗹
2:11Upgrade remedybg to 0.2.4.2
🗹
3:12egnadh Q: I remember you were asked what's the best way to draw a circle at a Microsoft job interview. What's the answer?
🗪
3:12egnadh Q: I remember you were asked what's the best way to draw a circle at a Microsoft job interview. What's the answer?
🗪
3:12egnadh Q: I remember you were asked what's the best way to draw a circle at a Microsoft job interview. What's the answer?
🗪
5:40The "free" aspects of drawing a circle on a 286: the centre and cardinal radius points
🖌
5:40The "free" aspects of drawing a circle on a 286: the centre and cardinal radius points
🖌
5:40The "free" aspects of drawing a circle on a 286: the centre and cardinal radius points
🖌
8:10Our target requirements: no floating point, wide instructions or threading; but branching is fine
🖌
8:10Our target requirements: no floating point, wide instructions or threading; but branching is fine
🖌
8:10Our target requirements: no floating point, wide instructions or threading; but branching is fine
🖌
11:10Efficiently computing the circle's arc
🖌
11:10Efficiently computing the circle's arc
🖌
11:10Efficiently computing the circle's arc
🖌
26:13Storing the error value, x and y
🖌
26:13Storing the error value, x and y
🖌
26:13Storing the error value, x and y
🖌
31:55Plotting a mere eighth of the circle
🖌
31:55Plotting a mere eighth of the circle
🖌
31:55Plotting a mere eighth of the circle
🖌
37:11Create bcircle.cpp (from "Bresenham Circle") and create a pixel grid to contain our circle
🖌
🖮
37:11Create bcircle.cpp (from "Bresenham Circle") and create a pixel grid to contain our circle
🖌
🖮
37:11Create bcircle.cpp (from "Bresenham Circle") and create a pixel grid to contain our circle
🖌
🖮
40:10Build and run bcircle to see our pixel grid
🏃
🖮
40:10Build and run bcircle to see our pixel grid
🏃
🖮
40:10Build and run bcircle to see our pixel grid
🏃
🖮
40:49Reduce the size of our pixel grid to 32×32 characters
🖮
40:49Reduce the size of our pixel grid to 32×32 characters
🖮
40:49Reduce the size of our pixel grid to 32×32 characters
🖮
41:04Check out our smaller pixel grid
🏃
41:04Check out our smaller pixel grid
🏃
41:04Check out our smaller pixel grid
🏃
41:19Implement our error-based circle drawing routine
🖮
41:19Implement our error-based circle drawing routine
🖮
41:19Implement our error-based circle drawing routine
🖮
48:44Check out our circle, to find that it is positioned incorrectly
🏃
48:44Check out our circle, to find that it is positioned incorrectly
🏃
48:44Check out our circle, to find that it is positioned incorrectly
🏃
48:51Fix our routine to plot the circle around its centre
🖮
48:51Fix our routine to plot the circle around its centre
🖮
48:51Fix our routine to plot the circle around its centre
🖮
48:57Check out our circle, one eighth of it
🏃
48:57Check out our circle, one eighth of it
🏃
48:57Check out our circle, one eighth of it
🏃
49:32Make our routine plot our eighth of the circle around the entire circumference
🖮
49:32Make our routine plot our eighth of the circle around the entire circumference
🖮
49:32Make our routine plot our eighth of the circle around the entire circumference
🖮
50:05Check out our fuller circle
🏃
50:05Check out our fuller circle
🏃
50:05Check out our fuller circle
🏃
50:11Prevent our routine from plotting the pixel grid's centre point
🖮
50:11Prevent our routine from plotting the pixel grid's centre point
🖮
50:11Prevent our routine from plotting the pixel grid's centre point
🖮
50:16Check out our fuller circle
🏃
50:16Check out our fuller circle
🏃
50:16Check out our fuller circle
🏃
50:24Plot the initial pixel
🖮
50:24Plot the initial pixel
🖮
50:24Plot the initial pixel
🖮
50:32Check out our perfect circle
🏃
50:32Check out our perfect circle
🏃
50:32Check out our perfect circle
🏃
50:39Optimise our routine, using one pointer initialised at the circle's centre in lieu of two stored Cx and Cy values
🖮
50:39Optimise our routine, using one pointer initialised at the circle's centre in lieu of two stored Cx and Cy values
🖮
50:39Optimise our routine, using one pointer initialised at the circle's centre in lieu of two stored Cx and Cy values
🖮
54:31Check out our same circle
🏃
54:31Check out our same circle
🏃
54:31Check out our same circle
🏃
54:41Consider how to remove the eight integer multiplies by the WIDTH
54:41Consider how to remove the eight integer multiplies by the WIDTH
54:41Consider how to remove the eight integer multiplies by the WIDTH
58:25Temporarily make our routine test abs(E0) < abs(E1)
🖮
58:25Temporarily make our routine test abs(E0) < abs(E1)
🖮
58:25Temporarily make our routine test abs(E0) < abs(E1)
🖮
58:46Check out our identical circle
🏃
58:46Check out our identical circle
🏃
58:46Check out our identical circle
🏃
58:55Revert that -E0 < E1 test
🖮
58:55Revert that -E0 < E1 test
🖮
58:55Revert that -E0 < E1 test
🖮
59:07See that all remains identical
🏃
59:07See that all remains identical
🏃
59:07See that all remains identical
🏃
59:10Continue to consider how to remove the eight integer multiplies by the WIDTH
59:10Continue to consider how to remove the eight integer multiplies by the WIDTH
59:10Continue to consider how to remove the eight integer multiplies by the WIDTH
1:00:15Rounin cmuratori: X<<5?
🗪
1:00:15Rounin cmuratori: X<<5?
🗪
1:00:15Rounin cmuratori: X<<5?
🗪
1:00:20Sully the WIDTH and HEIGHT so that they are not a power of two
🖮
1:00:20Sully the WIDTH and HEIGHT so that they are not a power of two
🖮
1:00:20Sully the WIDTH and HEIGHT so that they are not a power of two
🖮
1:00:51ggn2 handmade_hero Calculate the initial X/Y into a pointer and increment that?
🗪
1:00:51ggn2 handmade_hero Calculate the initial X/Y into a pointer and increment that?
🗪
1:00:51ggn2 handmade_hero Calculate the initial X/Y into a pointer and increment that?
🗪
1:01:26said6289 handmade_hero Store XWidth and YWidth pointers that you increment accordingly every run
🗪
1:01:26said6289 handmade_hero Store XWidth and YWidth pointers that you increment accordingly every run
🗪
1:01:26said6289 handmade_hero Store XWidth and YWidth pointers that you increment accordingly every run
🗪
1:02:12Ruminate on our circle drawing routine
1:02:12Ruminate on our circle drawing routine
1:02:12Ruminate on our circle drawing routine
1:02:50ggn2 handmade_hero Well, I'm thinking on 68000 terms where there were a bit more registers than x86
🗪
1:02:50ggn2 handmade_hero Well, I'm thinking on 68000 terms where there were a bit more registers than x86
🗪
1:02:50ggn2 handmade_hero Well, I'm thinking on 68000 terms where there were a bit more registers than x86
🗪
1:03:22Consider the WIDTH multiply to have potential for improvement
1:03:22Consider the WIDTH multiply to have potential for improvement
1:03:22Consider the WIDTH multiply to have potential for improvement
1:04:00Try to remove the Ep += 1 from the equation
🖮
1:04:00Try to remove the Ep += 1 from the equation
🖮
1:04:00Try to remove the Ep += 1 from the equation
🖮
1:04:43Check out our (different) circle
🏃
1:04:43Check out our (different) circle
🏃
1:04:43Check out our (different) circle
🏃
1:04:50Reinstate the Ep += 1
🖮
1:04:50Reinstate the Ep += 1
🖮
1:04:50Reinstate the Ep += 1
🖮
1:06:29x13pixels Q: Can you get rid of the "Ep += 1" line?
🗪
1:06:29x13pixels Q: Can you get rid of the "Ep += 1" line?
🗪
1:06:29x13pixels Q: Can you get rid of the "Ep += 1" line?
🗪
1:07:09Try to negate X the whole way through
🖮
1:07:09Try to negate X the whole way through
🖮
1:07:09Try to negate X the whole way through
🖮
1:08:17Check out our same circle
🏃
1:08:17Check out our same circle
🏃
1:08:17Check out our same circle
🏃
1:08:37Assess our options, with X negated, and try plotting X and Y pixels from different eights of the circle
🖮
1:08:37Assess our options, with X negated, and try plotting X and Y pixels from different eights of the circle
🖮
1:08:37Assess our options, with X negated, and try plotting X and Y pixels from different eights of the circle
🖮
1:13:31Check out our barely-plotted circle
🏃
1:13:31Check out our barely-plotted circle
🏃
1:13:31Check out our barely-plotted circle
🏃
1:13:35Try looping while X <= (R / 2)
🖮
1:13:35Try looping while X <= (R / 2)
🖮
1:13:35Try looping while X <= (R / 2)
🖮
1:14:02Check out our big X
🏃
1:14:02Check out our big X
🏃
1:14:02Check out our big X
🏃
1:14:06Continue to try plotting X and Y pixels from different eights of the circle
🖮
1:14:06Continue to try plotting X and Y pixels from different eights of the circle
🖮
1:14:06Continue to try plotting X and Y pixels from different eights of the circle
🖮
1:17:16Plotting X and Y pixels from different eights of the circle
🖌
1:17:16Plotting X and Y pixels from different eights of the circle
🖌
1:17:16Plotting X and Y pixels from different eights of the circle
🖌
1:18:41Understanding why our X / Y plotting on different eighths doesn't work
1:18:41Understanding why our X / Y plotting on different eighths doesn't work
1:18:41Understanding why our X / Y plotting on different eighths doesn't work
1:20:55filiadelski Q: I'm sorry we decided to go with another candidate because he went to Harvard
🗪
1:20:55filiadelski Q: I'm sorry we decided to go with another candidate because he went to Harvard
🗪
1:20:55filiadelski Q: I'm sorry we decided to go with another candidate because he went to Harvard
🗪
1:21:20Midpoint1 and Bresenham's circle drawing algorithm2
📖
1:21:20Midpoint1 and Bresenham's circle drawing algorithm2
📖
1:21:20Midpoint1 and Bresenham's circle drawing algorithm2
📖
1:23:22Temporarily make our routine always increment the Y
🖮
1:23:22Temporarily make our routine always increment the Y
🖮
1:23:22Temporarily make our routine always increment the Y
🖮
1:23:48Check out our circle with the Y always incrementing
🏃
1:23:48Check out our circle with the Y always incrementing
🏃
1:23:48Check out our circle with the Y always incrementing
🏃
1:24:36Revert our routine to not always increment the Y
🖮
1:24:36Revert our routine to not always increment the Y
🖮
1:24:36Revert our routine to not always increment the Y
🖮
1:24:39Compare our circle
🏃
1:24:39Compare our circle
🏃
1:24:39Compare our circle
🏃
1:24:41Increase the radius of our circle
🖮
1:24:41Increase the radius of our circle
🖮
1:24:41Increase the radius of our circle
🖮
1:24:50Check out our larger circle
🏃
1:24:50Check out our larger circle
🏃
1:24:50Check out our larger circle
🏃
1:25:17Leave further optimisation as an exercise for the reader
1:25:17Leave further optimisation as an exercise for the reader
1:25:17Leave further optimisation as an exercise for the reader
1:26:40Check out the register count of the Intel 3863 and 2864,5,6 and suggest writing this routine in x86 assembly targeted at DOSBox's emulation of a 2867
📖
1:26:40Check out the register count of the Intel 3863 and 2864,5,6 and suggest writing this routine in x86 assembly targeted at DOSBox's emulation of a 2867
📖
1:26:40Check out the register count of the Intel 3863 and 2864,5,6 and suggest writing this routine in x86 assembly targeted at DOSBox's emulation of a 2867
📖
1:31:41alex_deak Q: Hi Casey! (Sorry, it's pretty long, and has nothing to do with circles) I'm a mathematician, trying to be a graphics / engine programmer. I made some pet projects using OpenGL and Vulkan, in which I was able to make the things I wanted, but since my lack of enough experience, I had a hard time figuring out what "professional programming" is. I started watching Handmade Hero in December from day 1, and I almost caught up (currently I'm at day 520). Thanks for this amazing series, it has been inc… [sic]
🗪
1:31:41alex_deak Q: Hi Casey! (Sorry, it's pretty long, and has nothing to do with circles) I'm a mathematician, trying to be a graphics / engine programmer. I made some pet projects using OpenGL and Vulkan, in which I was able to make the things I wanted, but since my lack of enough experience, I had a hard time figuring out what "professional programming" is. I started watching Handmade Hero in December from day 1, and I almost caught up (currently I'm at day 520). Thanks for this amazing series, it has been inc… [sic]
🗪
1:31:41alex_deak Q: Hi Casey! (Sorry, it's pretty long, and has nothing to do with circles) I'm a mathematician, trying to be a graphics / engine programmer. I made some pet projects using OpenGL and Vulkan, in which I was able to make the things I wanted, but since my lack of enough experience, I had a hard time figuring out what "professional programming" is. I started watching Handmade Hero in December from day 1, and I almost caught up (currently I'm at day 520). Thanks for this amazing series, it has been inc… [sic]
🗪
1:32:29Wonder who is responsible for the message truncation
1:32:29Wonder who is responsible for the message truncation
1:32:29Wonder who is responsible for the message truncation
1:33:43alex_deak Q: Do you have any advice about starting a career in graphics / engine programming for someone, who has a very strong background in mathematics, physics, can do research, perhaps can come up with creative ideas, wants to learn ab… [sic]8,9
🗪
1:33:43alex_deak Q: Do you have any advice about starting a career in graphics / engine programming for someone, who has a very strong background in mathematics, physics, can do research, perhaps can come up with creative ideas, wants to learn ab… [sic]8,9
🗪
1:33:43alex_deak Q: Do you have any advice about starting a career in graphics / engine programming for someone, who has a very strong background in mathematics, physics, can do research, perhaps can come up with creative ideas, wants to learn ab… [sic]8,9
🗪
1:43:01ggn2 handmade_hero For what it's worth, PCem10 has cycle exact CPU cores if you want to be more accurate
🗪
1:43:01ggn2 handmade_hero For what it's worth, PCem10 has cycle exact CPU cores if you want to be more accurate
🗪
1:43:01ggn2 handmade_hero For what it's worth, PCem10 has cycle exact CPU cores if you want to be more accurate
🗪
1:43:46tshugako Q: On one of the first Handmade Hero streams you said that it was faster to work (bitwise operations) on a uint32 than a uint8. Why?
🗪
1:43:46tshugako Q: On one of the first Handmade Hero streams you said that it was faster to work (bitwise operations) on a uint32 than a uint8. Why?
🗪
1:43:46tshugako Q: On one of the first Handmade Hero streams you said that it was faster to work (bitwise operations) on a uint32 than a uint8. Why?
🗪
1:50:08toideng Q: Any opinion of Linux's way to define integer types with one letter (like u8, i16, i64)?
🗪
1:50:08toideng Q: Any opinion of Linux's way to define integer types with one letter (like u8, i16, i64)?
🗪
1:50:08toideng Q: Any opinion of Linux's way to define integer types with one letter (like u8, i16, i64)?
🗪
1:51:21flightlesshippo Q: Pug with a gun needs to be an enemy in the game
🗪
1:51:21flightlesshippo Q: Pug with a gun needs to be an enemy in the game
🗪
1:51:21flightlesshippo Q: Pug with a gun needs to be an enemy in the game
🗪
1:51:32printf_armin Q: For a program for Windows only is DX the better or OpenGL?
🗪
1:51:32printf_armin Q: For a program for Windows only is DX the better or OpenGL?
🗪
1:51:32printf_armin Q: For a program for Windows only is DX the better or OpenGL?
🗪
1:51:55saidwho12 handmade_hero What do you think of getting a college degree in information technology? Should you instead be working on hobby projects? My dad has been wanting me to get into a post-secondary school for a long time
🗪
1:51:55saidwho12 handmade_hero What do you think of getting a college degree in information technology? Should you instead be working on hobby projects? My dad has been wanting me to get into a post-secondary school for a long time
🗪
1:51:55saidwho12 handmade_hero What do you think of getting a college degree in information technology? Should you instead be working on hobby projects? My dad has been wanting me to get into a post-secondary school for a long time
🗪
1:55:37centhusiast Q: I have done lots of tools in C like a string utility, JSON parser, data visualization on Linux using X11, vector library and some other tools. Do you think these can be valuable for the CV?
🗪
1:55:37centhusiast Q: I have done lots of tools in C like a string utility, JSON parser, data visualization on Linux using X11, vector library and some other tools. Do you think these can be valuable for the CV?
🗪
1:55:37centhusiast Q: I have done lots of tools in C like a string utility, JSON parser, data visualization on Linux using X11, vector library and some other tools. Do you think these can be valuable for the CV?
🗪
1:59:32alex_deak Q: Great, thank you! Do you think it's maybe enough to have a YouTube channel, instead of a webpage? Since I have no idea how to do a webpage... Or is it very basic knowledge that I should know?
🗪
1:59:32alex_deak Q: Great, thank you! Do you think it's maybe enough to have a YouTube channel, instead of a webpage? Since I have no idea how to do a webpage... Or is it very basic knowledge that I should know?
🗪
1:59:32alex_deak Q: Great, thank you! Do you think it's maybe enough to have a YouTube channel, instead of a webpage? Since I have no idea how to do a webpage... Or is it very basic knowledge that I should know?
🗪
2:00:31Recommend The ryg blog11
📖
2:00:31Recommend The ryg blog11
📖
2:00:31Recommend The ryg blog11
📖
2:01:55joeyiswatching Q: Why were you suggesting to look at how to do it under 286? I just joined as you were talking about that
🗪
2:01:55joeyiswatching Q: Why were you suggesting to look at how to do it under 286? I just joined as you were talking about that
🗪
2:01:55joeyiswatching Q: Why were you suggesting to look at how to do it under 286? I just joined as you were talking about that
🗪
2:02:56boonetbe Q: I've been using a language with function polymorphism similar, I think, to what Jon is doing in JAI, i.e. "multiple dispatch" / dispatch on input types. I recently tried out some different languages and found this is not at all very common. How come not more languages have this? Is it hard to implement, other issues?
🗪
2:02:56boonetbe Q: I've been using a language with function polymorphism similar, I think, to what Jon is doing in JAI, i.e. "multiple dispatch" / dispatch on input types. I recently tried out some different languages and found this is not at all very common. How come not more languages have this? Is it hard to implement, other issues?
🗪
2:02:56boonetbe Q: I've been using a language with function polymorphism similar, I think, to what Jon is doing in JAI, i.e. "multiple dispatch" / dispatch on input types. I recently tried out some different languages and found this is not at all very common. How come not more languages have this? Is it hard to implement, other issues?
🗪
2:04:40flightlesshippo Q: I heard JAI is close to beta release? Will you be playing about with that or leaving it until it's matured more?
🗪
2:04:40flightlesshippo Q: I heard JAI is close to beta release? Will you be playing about with that or leaving it until it's matured more?
🗪
2:04:40flightlesshippo Q: I heard JAI is close to beta release? Will you be playing about with that or leaving it until it's matured more?
🗪
2:05:10centhusiast Q: Have you met the Amiga programmer like Bruce Dawson? It seems like they were the great programmers
🗪
2:05:10centhusiast Q: Have you met the Amiga programmer like Bruce Dawson? It seems like they were the great programmers
🗪
2:05:10centhusiast Q: Have you met the Amiga programmer like Bruce Dawson? It seems like they were the great programmers
🗪
2:06:33toideng Q: Would you use sine / cosine now?
🗪
2:06:33toideng Q: Would you use sine / cosine now?
🗪
2:06:33toideng Q: Would you use sine / cosine now?
🗪
2:07:18victorn Q: Are you going to push the circle solution to GitHub?
🗪
2:07:18victorn Q: Are you going to push the circle solution to GitHub?
🗪
2:07:18victorn Q: Are you going to push the circle solution to GitHub?
🗪
2:07:28unxx Q: Do you ever use any scripting language?
🗪
2:07:28unxx Q: Do you ever use any scripting language?
🗪
2:07:28unxx Q: Do you ever use any scripting language?
🗪
2:07:37toideng Q: Is there any computer world outside US?
🗪
2:07:37toideng Q: Is there any computer world outside US?
🗪
2:07:37toideng Q: Is there any computer world outside US?
🗪
2:19:59centhusiast Q: I saw some codes that use the array of function pointers and enums to avoid branching. enums like action type move_right, move_left and then function pointers associated with them. Do you think it is a good idea to do that?
🗪
2:19:59centhusiast Q: I saw some codes that use the array of function pointers and enums to avoid branching. enums like action type move_right, move_left and then function pointers associated with them. Do you think it is a good idea to do that?
🗪
2:19:59centhusiast Q: I saw some codes that use the array of function pointers and enums to avoid branching. enums like action type move_right, move_left and then function pointers associated with them. Do you think it is a good idea to do that?
🗪
2:22:52Understanding a Skylake core12
📖
2:22:52Understanding a Skylake core12
📖
2:22:52Understanding a Skylake core12
📖
2:33:51Branch-prediction in the context of a Skylake core13
📖
2:33:51Branch-prediction in the context of a Skylake core13
📖
2:33:51Branch-prediction in the context of a Skylake core13
📖
2:38:48Understanding the Skylake CALL instruction14
📖
2:38:48Understanding the Skylake CALL instruction14
📖
2:38:48Understanding the Skylake CALL instruction14
📖
2:45:23boonetbe Q: I saw Jon implement a compare and swap intrinsic recently for lock-free multithreading. Except for incrementing counters and stuff, what is it useful for? Do I understand it correctly that it's only useful when the thread-unsafe code / task is small?15
🗪
2:45:23boonetbe Q: I saw Jon implement a compare and swap intrinsic recently for lock-free multithreading. Except for incrementing counters and stuff, what is it useful for? Do I understand it correctly that it's only useful when the thread-unsafe code / task is small?15
🗪
2:45:23boonetbe Q: I saw Jon implement a compare and swap intrinsic recently for lock-free multithreading. Except for incrementing counters and stuff, what is it useful for? Do I understand it correctly that it's only useful when the thread-unsafe code / task is small?15
🗪
2:48:16boonetbe Q: Why aren't we using analog computing, i.e. instead of bits use frequencies. Noise?
🗪
2:48:16boonetbe Q: Why aren't we using analog computing, i.e. instead of bits use frequencies. Noise?
🗪
2:48:16boonetbe Q: Why aren't we using analog computing, i.e. instead of bits use frequencies. Noise?
🗪
2:49:17florian3321 Q: I am 50k lines into a C++ Android engine development (tried to stay away from inheritance and stuff. Note that I am still learning). Should I rewrite it the "C" way? How can I change my thinking? You at some point said that one should come to the point where OOP fails and then use non-OOP, but I think I am not really there yet. Hope this is not a dumb question
🗪
2:49:17florian3321 Q: I am 50k lines into a C++ Android engine development (tried to stay away from inheritance and stuff. Note that I am still learning). Should I rewrite it the "C" way? How can I change my thinking? You at some point said that one should come to the point where OOP fails and then use non-OOP, but I think I am not really there yet. Hope this is not a dumb question
🗪
2:49:17florian3321 Q: I am 50k lines into a C++ Android engine development (tried to stay away from inheritance and stuff. Note that I am still learning). Should I rewrite it the "C" way? How can I change my thinking? You at some point said that one should come to the point where OOP fails and then use non-OOP, but I think I am not really there yet. Hope this is not a dumb question
🗪
2:50:24garryjohanson Q: He did do a video on branch predictions, though I don't know if it's germane to what we're talking about16
🗪
2:50:24garryjohanson Q: He did do a video on branch predictions, though I don't know if it's germane to what we're talking about16
🗪
2:50:24garryjohanson Q: He did do a video on branch predictions, though I don't know if it's germane to what we're talking about16
🗪
2:52:22Recommend Fabian's entire YouTube channel17
📖
2:52:22Recommend Fabian's entire YouTube channel17
📖
2:52:22Recommend Fabian's entire YouTube channel17
📖
2:53:01Wind down
2:53:01Wind down
2:53:01Wind down