Hello. Good afternoon, everybody. I am Aditya from Sony. Today, I'll be talking about advanced xip file system, that is AXFS. So the agenda for today will be, we'll be looking into AXFS overview, profiling feature, its implementation, and about its performance. So just to give you a background about this talk, we recently pushed AXFS into 3.4 LTSI tree. So we think that AXFS is more powerful than its counterparts, like CramFS and SquashFS in many aspects. We think that AXFS deserves more wider users than it currently has. So in this talk, I'm going to give you some insight into AXFS so that more people can start playing with it and maybe include it in their products. And we can make it even better. So about embedded systems. So as we know, the cost, power and size and other constraints in embedded system make for the root file system compressed and read-only as an ideal choice. So commonly used file system in embedded systems like CramFS and SquashFS are also read-only and they support compression. Compression and read-only are basically very important in an embedded system. SquashFS supports compression of files in the file system and CramFS supports compression as well as XIP. CramFS supports execute in place at a file granularity. That is either the file can be an execute in place or it can be a compressed file. AXFS is a read-only file system which supports execute in place for page granularity. That's the main point about AXFS. So each page can either in a file, each page can either be compressed or it can be an XIP page. So we'll start with the introduction of what XIP is, what we mean by XIP. We'll look into the advantages and disadvantages of XIP approach. We'll look into AXFS file system image format and we'll take a short dive into AXFS source code. So what we mean by XIP is, XIP means execute in place. So wherever the file system image is, we basically directly execute from that place. So it's only possible in a memory mappable device which are byte addressable such as NOR, ROM and RAM, system RAM. So for XIP to be practical, it's very important that the speed of the device should be comparable to the system RAM for it to be practical. So what happens is the process virtual memory is directly made to map to the physical address of the XIP media on which the image is there. So we don't need to load the code pages from the media into the page cache in the system RAM. So basically this diagram summarizes what XIP is. So when we have a executable in the file system image, if we don't do it the XIP way, then basically we load the code and the data to the system RAM and then that pages are mapped into the address space of the process. The XIP way of doing thing is that we load the data of course but as for the code pages, executable pages, we directly map from the file system image, from the media. So there are some advantages that XIP gives us. XIP reduces the boot time and the launch time of the application. It is so XIP is faster because it does not load pages into the memory from the secondary memory. That saves a lot of time. The second thing is that it reduces cost. So it reduces the requirement for system RAM. It frees up system RAM. We can use it for some other purpose. On the other hand we can include less RAM into products. It reduces power consumption because less energy needs to be spent on refreshing the bits and the RAMs. And it helps reduce cost. XIP also has some disadvantages. One that stands out is that XIP is not suitable for pages which are hotspots in the system because generally the north flash is slower than the system RAM. So we really cannot put pages which are accessed in a loop, in a tight loop, or basically are very critical for performance. So those type of code do not go with XIP way. And yes, it would be cached. But if we have cached eviction, then in that case, again it has to be fetched from north. So usually, I mean if it's a very tight loop, then yes, it will always be accessed from cached. But if it is not a very tight loop, but something in an intermediate, then yes, there are chances that it will get evicted and you again have to fetch it from the north. So those kind of things are not generally suitable with the north. Yeah, yeah. So XFS is basically a 64-bit file system. That's very important because that differentiates it from CramFS and SquashFS. CramFS has size limitations as we know. It is a big Indian and it's a read-only file system. And as I told you, it allows XIP at a page granularity and that's very important. And it supports compression in sizes of 4kb to 4gb and it can directly mount from an empty device. So the main advantage of XFS is that the XFS image can be split into multiple devices. So this allows the XIP part of the image to be put on or flash and the non-XIP, the compressed part on the NAND flash. So what happens is that if we can split the images into two devices, then we can only have that much north as the number of XIP pages we want in the system. And the compressed pages can go into NAND, which is of course much more cheaper than north. So this device spanning though is only possible if the first device that is a north or wrong or whatever is memory mappable. So if the first part is XIP, then only this device spanning is possible. It's not possible in the reverse way that the starting of the image is NAND and the later part is north. This feature, as I told, helps in making the products more economical. And as we can see, the XFS can directly interact with the MTD layer or it can go through the blocked layer. So what is XFS profiling? So basically, XFS profiling is how we decide which pages should be XIP and which pages should be compressed. That's very important from system performance point of view. So how do we go about XFS profiling? So basically, the overall thing is that we typically, we run the applications, the general applications, the typical applications and the use case with the non-XIP XFS image. And we take the log of the pages which turn out to be executable during that profiling run. And that data we take and we feed it into the second step of building the image. So the image builder takes that log and takes the directory of course and gives us the XIP image. So this is a little detail of how we go about it. We build the image, the normal image. We take a directory and it gives us the output image. Then we run the typical application test cases. And then when we have the profiling data with us, we feed that into the image builder and we get an output image. So as I said, XFS profiling gives us the pages that should be XIP. So profiling to be effective should basically cover all the important aspects, all the important use cases of the application. So XFS for this purpose contains an in-build profiler. We can turn that on by a config option in the kernel. So after the profiling, we have a log which is fed into the image builder. So now XFS is a 64-bit file system. And yet it can have a very compact file system image. So how is that possible? So basically XFS byte tables is a scheme of things which makes XFS have very low overhead for supporting 64-bit offsets. So what byte tables is that each byte table, first of all byte table is a sequence of bytes. So each byte table entry contains only that many number of bytes that are required to hold the maximum number of the value that we are going to hold. Say for instance, if we are going to hold an offset, then the maximum value of the offset, we can only have that many number of bytes which can hold the maximum value of the offsets. The number of the bytes in a table, in an entry of the table is called the depth of the byte table. So let's say we need to store less than 256, a number of magnitude of less than 256, then we can have a byte table of depth only one. So in one byte, we can represent of course all the, from 0 to 55 of the value. And say for example, we need to store a number which has a maximum of 500, then we need a byte table of depth 2. So as I said, byte table scheme is the key scheme which allows AXFS to have 64-bit offsets in a file and still be pretty light. So following is the code snippet which basically sums up how the AXFS file system driver uses byte tables. Here we basically give the depth of the byte table we give the virtual address where the table is stored and the index into the table. And as we can see, it does a sort of pretty simple calculation and gives us the output of the byte, the value of the entry of the byte table. So of course the AXFS driver code only has, only deems with 64-bit numbers. So in the AXFS code we have 64-bit numbers and in image format, in the AXFS image, we have byte tables. So this is the format of the AXFS image. So we have super block, we have what we call as region descriptors and then we have a list of regions, contiguous regions. So region is a contiguous segment in a file system, in an AXFS file system image. Region descriptors are the descriptors for that contiguous segment of file system image. Basically they store the location of the segment and some of it attributes. The attributes stored include the size of the region, whether the region is compressed or whether it is XIP. And also if the region contains byte table, then it contains the byte table depth. So following is the on-media representation of the region descriptor, the region in the AXFS image. So we see we have offset which describes where the region in the AXFS image is located at, the size, the compressed size and so forth. So what are regions? Basically regions contain data as well as metadata. Basically they contain anything that file system holds. So most of the regions which contain metadata, they contain metadata in form of byte tables. Region which contain actual data are XIP regions, compressed region and byte aligned region. So XIP and compressed region contains the XIP pages and the compressed pages respectively. Bite aligned region contains a special type of data that is the data which does not compress properly. So if we don't get a good compression or maybe even get a negative compression, then we do not compress those data. We keep them as it is and they are kept in byte aligned region. So we have three types of region, XIP, compressed and byte aligned. So within a region, the data is stored in chunks of chunks called nodes. So these nodes are usually 4 kilobytes in size. These are basically the pages from the files, the data, the pages from the files. If it is an XIP, it will be as it is. If it is compressed, then of course it will have two, three blocks of data compressed together. And nodes in the region have types. So either they are XIP compressed or byte aligned. This is a super block structure for AXFS. We have various offsets stored. So I'm going to talk a little bit about a few of the regions in AXFS images in AXFS image. So we have string regions, node index region, node type region, inode array region. So string region, strings region basically contains the names of the files. And basically it is the only metadata that is not in form of a byte table. The offset within the strings region for a file name is pointed to by inode name offset region. The inode array index region contains the offset into node index region for each of the file. So basically node index region has the index into actual data. And inode array index points to the node index region. So following are the functions which access these regions from the file system image. So as we can see it takes a super block and the index of the inode. So here as we can see it gets the offset from the inode name region. And this contains the virtual address in the memory where the strings region is there. It adds and returns as the string. So we have node type region and node index region. So this is basically how do we get the data out of the, how do we interpret, how do we, how the file system driver gets the data from the image. So node type region basically contains the type of the node that it is pointing to. And node index region points to the index of the node. So basically index is index into one of the data nodes. And the type determines what type it is. So for example index of an xip type of node is just the page offset into the xip region, into the compressed into the xip region. And index for byte aligned type of node is an offset into a byte table of region which contains the actual offset into the byte aligned region. So it's a double pointer. So index into compressed type of node is a little complicated. It basically, the index for a compressed type of node basically is an index into two separate type of regions. One type of, so one region is C block offset region and another region is C node offset region. So what is C block and C node is basically, so C block is the compressed, is the compressed block of data. So how is C block prepared is that we have various and C node is the uncompressed data. So we have various x number of C nodes. We compress them and that becomes the C block. So basically C block is a compressed version of concatenated C nodes. We can put it that way. So when we uncompressed the C blocks, we get basically the concatenated C nodes. So basically the index into a compressed region has an index into C block which is taken out from the image. It is uncompressed and then the index into the C node that we had is utilized to find which C node in the C block is our data. So this is just a snippet of code that does the, that implements this index into two different nodes and gets the data. So let's talk a little bit about the AXFS performance. So we measured AXFS performance on following hardware. It's known as Navi Engine Board. It has an NEC SOC. CPU is ARM v6. It has four cores. We used 20 MB of memory. It has 32 kb of Alvin cache, iCache and dCache. It does not have an L2 cache. We used 3.0 kernel for performance measurement and we had 64 bit of North Flash and 4.5.1 is the GCC that we used. And the file system image was mounted on the North Flash. So basically these are the performance parameters that we covered in our performance of testing, performance evaluation of AXFS. We measured the application launch time, the application boot time basically. And second parameter was we measured total flash used by the memory, total flash used by the file system image, which is basically the size of the file system image itself. And third parameter, performance parameter was the RAM footprint of the file system. So before going into performance numbers, we also thought about some other ways to improve the AXFS performance. So one of the techniques that we played around with was following is the technique that we used. So we used it in combination with AXFS. So the technique was basically about improving the code locality of the program. So basically what we did was we implemented a tool which records the calling order of the functions in a program. And then the tool generates a linker script which basically places those functions together and in that order so that it gives us a better performance. So improving the locality of the code gives us less number of page faults. And basically the less number of page faults is very important because when the code falls in a file system such as AXFS, so we have to fetch the page from NOR flash which is a little bit costly. So this really helps improving the number of page faults in the system. So basically it improves the application speed and reduces the total RAM that will be used when the application is running, basically the RAM footprint. So this is the description of the tool that we implemented. Basically a simple tool that, so if you have any application, we just compile it with instrumentation option of the GCC. So the application is run and we have a tool implemented which attaches to the application. It traps the function calls and basically spits out a log of the order of the calling of the functions. This order of calling of the functions log is then given as an input to a linker script generator script. So this script gives us a linker script and so now we can rebuild the application and now basically the application will run faster. Okay, so coming back to the AXFS performance thing. So basically the application that we use to measure the performance is our basically dummy application. It basically simulates large number of page loading during the launch, during the launch of the application. So to give you details, we had around 500 functions called in pseudo random number order. So basically as you would know, pseudo random numbers are numbers which are produced in the same sequence if you give the same initial seed. So each function had around 1600 bytes of size. Mostly they were knobs and a few memory access instructions. And this application, we used it because of some constraint, we used it as an init process of the system. So we measured timing by basically embedding the calls to record the value of the clock at particular given position in the program. So calls were embedded just before the kernel spawns the init process and just after executing 500 functions. And we measure the difference between the clock time between the two calls as a performance measurement. So basically the measurement goes like this that currently we will have four file system images. One is the AXFS which is without the AXIP profile pass. A plain AXFS compressed image will have an AXFS XIP image which is generated after, as I explained, after getting the profile data and feeding it back into the image builder. Then we have the code locality improved program on top of the compressed AXFS image. And finally we have code locality improved program on top of AXFS XIP image. So in this measurement, we measured the application launch times. So application launch time basically is a difference between the just before launching the init process and just after finishing those pseudo functions, 500 pseudo functions. And so we just measure the time duration it takes to launch the application for all the four images. So basically this is the numbers for the launch of the application. As we can see the compressed AXFS takes the largest amount of time. The locality improved AXFS takes little less. And as we can see the benefit of XIP that it takes the least amount of time. Though locality improved AXFS and the normal XIP AXFS are almost have the same performance number. So basically this shows us the improvement that XIP gives us in terms of the application launch times. Next measurement that we did was for the total size of the AXFS image, the total size that it takes to store the images. Again we have four images. We have the compressed, sorry for that. So we have four images. We have AXFS compressed image. We have AXFS XIP image. And the other two locality improved on top of AXFS compressed and AXFS XIP. And the measurement is basically the total size of the file system image. So as we see in this parameter in this dimension the compressed AXFS is the best as it is supposed to because it is compressed. So XIP gives us a little larger image and then the locality improved images. The third performance parameter that we tested was system RAM footprint. Again we have four same images. And so what we mean by system RAM footprint, so the actual definition of system RAM footprint is the total size, total memory used by the application when it is running. We, however, here mean a little different, we mean it different when we say system RAM footprint. What we mean is that the total RAM used in the total system when the application is running and not just by the application but all of the RAM used by the system when the application is running. That includes all of the memories. So basically we measure the total memory used in the system while running our application. So it's fair as our application is the only process that is created in the system during that time. So since it's the only process, so it's a fair measurement. So as we see the total memory used is the total RAM footprint is lowest for the XIP AXFS. And it's a little more for compressed AXFS image. So key point of AXFS is that it allows XIP at page granularity. Though it requires a profiling pass and another important thing that AXFS gives is it can span multiple device. We can use it over the MTD layer. And basically mostly suitable for ports that are boot time that are launched, which are launch intensive are not very suitable for hotspots in the system. Any questions?


Hey everybody! I'm recording this video at night for the debut of Night Force on this channel. I'm also trying to conceal myself. I'm reviewing Outback again, and last time I reviewed Outback, things got a little out of hand. Since this is my channel now, maybe I don't feel like talking about G.I.G.A. I feel like talking about something else, like RainbowBright channel, RainbowBright all the time. I don't want to have another RainbowBright takeover of this channel, so I'm gonna make sure RainbowBright can't find me. Fortunately, I learned perfect night concealment techniques from Night Force. I think it's safe to start the review. Hello everybody! HoodedCoverCommander788 here. It's time for another vintage G.I. Joe Toyer review. Can you see me right now? I'll bet you can't. That's because I've mastered perfect night concealment. This is the best way to introduce Night Force. Night Force is a popular subset of G.I. Joe with collectors because they are rare figures and they're also pretty awesome. They took already awesome figures and changed their colors for night missions. What can be cooler than that? I figure it's safe to do this review in hiding. When I review Outback, RainbowBright tries to take over the channel and I'm not gonna let that happen. RainbowBright is the opposite of Night Force. Can you figure out where I'm hiding? If you can spot me, I'll give you a no prize. This is a review I've been looking forward to doing since I got the figure. Night Force HCC788 presents Night Force Outback. The 1988 Night Force Outback. This is version 2 of Outback, G.I. Joe's survival specialist. This figure was first available in 1988 as part of the first wave of Night Force figures. There was a second wave of Night Force figures in 1989, but I am unclear about whether the first wave of Night Force figures was also available in 1989. All Night Force figures were available in two packs. Night Force Outback was packaged with Night Force Crazy Legs. They were also exclusive to Toys R Us, so they weren't widely available at retail. All Night Force figures were reissues of earlier figures, but with new color schemes. They were mostly in darker colors than the original, but not always. Night Force Falcon, for example, his colors are less Night Attack ready than his original figure. The first version of Outback was released in 1987 and was still on the pegs in 1988, so these figures were available at the same time, but of course you could only get the Night Force Outback at Toys R Us. There were a couple later versions of Outback released in 1993. They were wildly different from the first two versions. Yojo.com lists these as versions 3 and 4, but I consider them to be variants of the same version. Comparing version 1 and version 2, one problem I always had with version 1 of Outback was the white shirt. It was inappropriate for combat. The rest of the figure was perfect, but his shirt didn't quite fit. Version 2 fixes that. The most obvious Cobra counterpart to Night Force would be the Night Viper, released in 1989, the year after this figure. The direct Cobra counterpart for Outback would be the Range Vipers from 1990 who had wilderness survival training like Outback. The practice of recoloring old figures and releasing them as subsets became popular in the late 80s. In 1988 they issued Tiger Force, which was entirely made up of reissued figures. Tiger Force is better known than Night Force since it was more broadly available. In 1989, Python Patrol and Slaughter's Marauders used reissued figures. The accessories for version 2 of Outback are the same as version 1, but the colors of most of them have changed and for the better. They are black, which is perfect for night missions. Let's take a look at Night Force Outback's accessories starting with his rifle. I have his rifle carefully slung across his chest and over his shoulder. I do not put this rifle in his hand and there's a reason for that. This rifle, as far as I can tell, is the same as the one that was issued with the original Outback figure. If there's any difference, I have not been able to spot it. It has this strap that goes from the front to the very back and that is very fragile. Also, it connects to the back of the rifle very close to the grip. So it's impossible to put the rifle in the figure's hand without putting strain on this connection for the strap. This one, in fact, is just barely holding on, so I try not to put any more strain on it than absolutely necessary. This rifle appears to be a modified version of the Heckler & Koch HK-53. In the first Outback video, I think I had this pegged as a G3, but upon further reflection, I think it looks more like the HK-53. The next accessory is his flashlight. The flashlight is very small. It is black. It has a red dot painted on it for the lens. The paint application is a nice touch and it's an upgrade from the version 1 flashlight which was green and did not have any paint color on it. Because of the size of this flashlight, it is often missing. It pegs onto the action figure. There's a hole on the action figure's left leg and it just pegs into there. It actually pegs in pretty solidly. I don't usually worry about it falling out. Outback's next accessory is his backpack. It is very large, but that's appropriate for Outback's specialty. He's a wilderness survival specialist, so he would carry a lot of survival and camping gear in it. It is the same backpack as version 1, but doesn't it look superb in black? Even though this backpack is quite large, it doesn't seem to put the figure too much off balance. He still stands perfectly well with the figure stand. His final accessory is his web belt. The belt goes around his waist and over his shoulders and around the back of his neck. This would be the load bearing equipment for his backpack. We didn't get this kind of accessory very often in GI Joe and it's nice that they gave us this for Outback. It's nice to have straps for the backpack. Usually the straps were just sculpted onto the figure, or sometimes they were omitted. The belt connects in the back with a buckle and it is a tight fit. It just has a tab that fits into a loop that can very easily be removed. The belt itself has some nice detail with a stitching pattern for the belt and pouches. With the accessories out of the way, let's take a look at the articulation on Night Force Outback. He had the articulation that was standard for figures in 1988. He could turn his head from left to right and look up and down. He could swing his arm up at the shoulder and swivel at the shoulder all the way around. He had a hinge at the elbow that allowed him to move at the elbow about 90 degrees and he had a swivel at the bicep that allowed him to swivel his arm all the way around. The figure was held together with a rubber O-ring that looped around the inside. That allowed him to move at the torso a bit. He could move his legs apart about so far. He could bend his leg at the hip about 90 degrees and he could bend at the knee about 90 degrees. Let's take a look at the sculpt design and color of Night Force Outback. And of course, they did entirely reuse the mold from version 1 of Outback. They even still have the copyright 1987 stamp on the inside of the leg. On his head, he has ginger hair, kind of long hair, a full beard, red eyebrows and black eyes.  The knot is there in the back. His hair color is pretty close to the same as version 1. But on version 1, that bandana is green. A lot of collectors think this face looks like Chuck Norris. And I think that's what they were going for. He bears a resemblance to Chuck Norris in missing in action. It's not a perfect likeness, but it's close enough. On his chest, we have the most significant difference between this figure and the original. He is wearing a green t-shirt instead of the white t-shirt that was on the original. But he still has survival printed across his chest. The source of this survival motto was printed on the file card for version 1. It is not on the version 2 file card. It is an excerpt from the US Army Ranger Handbook 1969 edition. Survival stands for S. Size up the situation. U. Undo haste makes waste. R. Remember where you are. V. Vanquish fear and panic. I. Improve your situation. V. Value living. A. Act like the natives. And L. Learn basic skills. The color change for this shirt is the best upgrade from version 1. Outback looks battle ready. I see this figure as Outback's combat uniform, whereas his version 1 figure seems more like a training uniform. Moving on to his arms, we have the biggest flaw on this figure. He's wearing short sleeves, green. He has a muscular build. He has black gloves, and he has a black watch on his right wrist. And the odd thing is, the sleeves are a different color green than the rest of the shirt. The shirt on the chest is kind of a dark olive drab green, whereas the sleeves are more of a kelly green. There's no good reason for this. This is the only place where this green color appears on the figure. Doing it the right color would not have required another paint spray. They just did it the wrong color. It's distracting. On his waist, he has a black belt, a couple pockets in the back. His belt buckle has a sculpted eagle on it. On his legs, he has green trousers, the same color as the green on the chest. He has a black pocket on his right leg. On his left leg, he has an unpainted pocket. And of course, he has the hole where the flashlight pegs in. He has a sculpted stripe that goes down both legs. On his left ankle, he has a black knife. He has a strap that kind of goes around his left shin. Then he has black, pretty standard-looking combat boots. Obviously, the only difference between this figure and the original is the color. So that's what we're looking at. But this is night force. The obvious color that they could have gone with would be black. But they didn't. They went with a dark green. And I think that's really smart. The green works well with this figure, and not just for night missions. You can use Outback on any mission in this color scheme. Let's take a look at the file card. This file card is partially the same as the original. The biographical and specialty information is the same. We have his faction as G.I. Joe, and there is the night force logo there. We have a portrait of Outback, and as you can see, they did try to reflect the different colors of the sleeves in the portrait. It just doesn't look right. His name is Outback, and he's the survivalist. His file name is Stuart R. Selkirk. Primary military specialty is infantry. Secondary military specialty is survival training instructor. Birthplace is Big Piney, Wyoming, and his grade is E-5. His first paragraph is mostly the same as the original. It says, Outback was an instructor at both the survival school and jungle warfare training center. He has had extensive experience in Central America and may or may not have participated in clandestine operations in the Middle East. Most people are intimidated by the wilderness, and here's where we have a difference from the original. On the version 1 file card, they had a typo there. Well, they fixed that on version 2. It says, they do not feel comfortable in an area where there is no sign of human life for miles. Not Outback, exclamation point. That's another change on the version 1 file card. It's just a period. He believes in being part of his environment, not its adversary. This bottom paragraph is entirely different from the version 1 file card. The version 1 file card of course has the survival acronym from the U.S. Army Ranger Handbook. It says, a covert team that functions at night and lays low during the daylight hours has its own peculiar survival problems. A nice cozy spot to set up an ambush could also be a preferable nesting place for poisonous snakes. A dry stream bed might be an inviting place to pitch a shelter if one didn't know about the possibility of flash floods. It's Outback's job to get the night force team to their target intact and healthy. This night force file card is really good. It's an update from the version 1 file card. It doesn't just copy and paste. It also vividly describes Outback's role on the team. It's well written. It's gritty and realistic. Taking a look at how Outback was used in G.I. Joe Media, he didn't appear in the animated series at all. He was only animated for commercials. Looking at the G.I. Joe comic book series published by Marvel Comics, Outback first appeared in issue number 59, but he had more important appearances later. In issue number 61, he took part in a mission with Stalker, Quick Kick and Snowjob in the fictional country of Borovia. The mission went badly. Stalker, Quick Kick and Snowjob were captured. Outback was the only one to make it out. Special missions number 6 tells the story of Outback's escape from Borovia. He has to use his wits and survival skills to escape the pursuit of the evil Colonel Ratnikov. Outback had a few scattered appearances later in the series, but he didn't have much impact on the story. Looking at night force Outback overall, this is easily a top tier figure. It isn't perfect though. Miscolored sleeves are a problem. They're not so badly miscolored that you can't overlook them, but they're still wrong, and there's no good reason for them to be wrong. We also lose the camouflage from the original figure, making this figure mostly monochromatic. The good points far outweigh the minor flaws. Going with dark green was not an obvious choice. You would expect them to go with black for night force. I'm glad they went with the green though. They gave us an Outback that is ready for any mission, not just a night mission. The black accessories are absolutely perfect. It's not easy for a reissued figure to make it to the top tier, but this is how you do it. This adds something special. The color change makes the figure more functional for his job. I honestly can't decide which I like more, the original or the night force version. Not every night force figure is as great as this one, but I am a night force fan. It's a great idea for a sub team. It makes more sense than Tiger Force. That was my review of Night Force Outback. I hope you enjoyed it. And I'm sure no one was able to see me in my night concealment, so nobody gets a no prize. But someday, you may need to hide in the dark, so I will reveal to you my secret night hiding technique. I was standing behind the camera. That is the secret. If you need to hide from your enemies in the dark, simply stand behind the camera. They will not be able to see you. If you liked this video, please give it a thumbs up, leave a comment, and subscribe. You can find me on Facebook, Twitter, and Patreon. And I have a website, hcc788.com, where you can find all of my G.I. Joe reviews. Thank you for your patience when I was sick. My illness took me out of commission for almost two weeks, at a time when I really needed to be working on videos. But I'm back up to speed now and I'm catching up on my work. I'll see you all next week for another vintage G.I. Joe toy review. Until then, remember, only G.I. Joe is G.I. Joe. I better hide again. Susan, I wanted to talk to you a minute about my favorite special memory, Rainbow Bright. Rainbow Bright is a doll that came out in 1983 by the Hallmark card people. And her first episode came out in July 27th, 1984. And that's a very special date because in 1984, that was my very first memory. You know how when you don't remember anything or you have what you think of the dreams, but you're not really sure, but you have little snippets, but you're just not sure. Well, mine was Rainbow Bright. And on December 25th, 1984, I distinctly remember having a nightmare of a pirate ship in a pirate map. And I woke up and I was like, that was really scary. I don't ever want to see that ever, ever again. But keep in mind, I was sharing a room with my sister in an attic. And when you're four, everything's really huge and it was dark and I was scared. And so I went downstairs, but I was also thinking, oh my God, I'm actually seeing things. I'm not really aware of what things are and where to go. It was just weird to me. But the lucky thing is when I was going downstairs, I saw a big Christmas tree and it was Christmas. And I was like, yes, awesome. Well, I go downstairs and I'm doing opening up stuff. But this was my very first memory, my very first gift I ever opened. And I screamed and I freaked out. I was so happy that I got this. But not only this, I got starlight and I got some star spreads that I don't have anymore. And as I grew older, this was the very last thing that my mom packed up and gave to Goodwill because that's what she always did, just to get rid of kids stuff. So it's very special to me. It just brings back so many good childhood memories. And I just wanted to take a minute and take over Brian's channel and to review it like I promised you guys that I would. But this will not be the very, very bright channel. This is Brian's and he's letting me use it just this one time. So I hope you enjoyed and I hope I fulfilled your curiosity because I know some of you have been. So this will not be the very, very bright channel. This is Brian's and he's letting me use it.