diff --git a/example/command-log.jsontag b/example/command-log.jsontag new file mode 100644 index 0000000..ea79b3e --- /dev/null +++ b/example/command-log.jsontag @@ -0,0 +1,5 @@ +{"id":"f551ba01-7668-4964-9918-06a1117a2aab","name":"addPerson","value":{"name":"Some Stormtrooper","gender":"male","homeworld":"http://swapi.co/api/planets/1/"}} +{"id":"d6a9161d-9c7b-4e33-af23-51cc25d97c71","name":"addUnknown","value":{"name":"Some Stormtrooper","gender":"male","homeworld":"http://swapi.co/api/planets/1/"}} +{"id":"4ea25598-7c22-4a5a-a958-f1d0b72a0e27","name":"addPerson","timestamp":"2024-03-19","author":"someone","value":{"name":"Dave the Stormtrooper","gender":"male","homeworld":"http://swapi.co/api/planets/1/"}} +{"id":"99bb60ad-8052-42ae-95ef-dee8c09cec89","name":"addPerson","timestamp":"2024-03-19","author":"someone","value":{"name":"Dave the Stormtrooper","gender":"male","homeworld":"http://swapi.co/api/planets/1/"}} +{"id":"369eb47b-87cf-47a2-8c24-82e325596636","name":"addPerson","timestamp":"2024-03-19","author":"someone","value":{"name":"Dave the Stormtrooper","gender":"male","homeworld":"http://swapi.co/api/planets/1/"}} diff --git a/example/command-status.jsontag b/example/command-status.jsontag new file mode 100644 index 0000000..5273b98 --- /dev/null +++ b/example/command-status.jsontag @@ -0,0 +1,10 @@ +{"command":"f551ba01-7668-4964-9918-06a1117a2aab","code":202,"status":"accepted"} +{"command":"f551ba01-7668-4964-9918-06a1117a2aab","code":200,"status":"done"} +{"command":"d6a9161d-9c7b-4e33-af23-51cc25d97c71","code":202,"status":"accepted"} +{"command":"d6a9161d-9c7b-4e33-af23-51cc25d97c71","status":"failed","code":404,"message":"Command addUnknown not found","details":null} +{"command":"4ea25598-7c22-4a5a-a958-f1d0b72a0e27","code":202,"status":"accepted"} +{"command":"4ea25598-7c22-4a5a-a958-f1d0b72a0e27","status":"failed","code":null,"message":"The requested module '@muze-nl/od-jsontag/src/serialize.mjs' does not provide an export named 'stringif'","details":null} +{"command":"99bb60ad-8052-42ae-95ef-dee8c09cec89","code":202,"status":"accepted"} +{"command":"99bb60ad-8052-42ae-95ef-dee8c09cec89","status":"failed","code":null,"message":"FastJSONTag.setAttribute is not a function","details":null} +{"command":"369eb47b-87cf-47a2-8c24-82e325596636","code":202,"status":"accepted"} +{"command":"369eb47b-87cf-47a2-8c24-82e325596636","code":200,"status":"done"} diff --git a/example/data.jsontag b/example/data.jsontag new file mode 100644 index 0000000..0c7405b --- /dev/null +++ b/example/data.jsontag @@ -0,0 +1,270 @@ +(1365){"people":[~1,~2,~3,~4,~5,~6,~7,~8,~9,~10,~11,~12,~13,~14,~15,~16,~17,~18,~19,~20,~21,~22,~23,~24,~25,~26,~27,~28,~29,~30,~31,~32,~33,~34,~35,~36,~37,~38,~39,~40,~41,~42,~43,~44,~45,~46,~47,~48,~49,~50,~51,~52,~53,~54,~55,~56,~57,~58,~59,~60,~61,~62,~63,~64,~65,~66,~67,~68,~69,~70,~71,~72,~73,~74,~75,~76,~77,~78,~79,~80,~81,~82,~83,~84,~85,~86,~87,~269],"planets":[~88,~89,~90,~91,~92,~93,~94,~95,~96,~97,~98,~99,~100,~101,~102,~103,~104,~105,~106,~107,~108,~109,~110,~111,~112,~113,~114,~115,~116,~117,~118,~119,~120,~121,~122,~123,~124,~125,~126,~127,~128,~129,~130,~131,~132,~133,~134,~135,~136,~137,~138,~139,~140,~141,~142,~143,~144,~145,~146,~147,~148],"films":[~149,~150,~151,~152,~153,~154,~155],"species":[~156,~157,~158,~159,~160,~161,~162,~163,~164,~165,~166,~167,~168,~169,~170,~171,~172,~173,~174,~175,~176,~177,~178,~179,~180,~181,~182,~183,~184,~185,~186,~187,~188,~189,~190,~191,~192],"vehicles":[~193,~194,~195,~196,~197,~198,~199,~200,~201,~202,~203,~204,~205,~206,~207,~208,~209,~210,~211,~212,~213,~214,~215,~216,~217,~218,~219,~220,~221,~222,~223,~224,~225,~226,~227,~228,~229,~230,~231],"starships":[~232,~233,~234,~235,~236,~237,~238,~239,~240,~241,~242,~243,~244,~245,~246,~247,~248,~249,~250,~251,~252,~253,~254,~255,~256,~257,~258,~259,~260,~261,~262,~263,~264,~265,~266,~267,~268]} +(1426){"name":"Luke Skywalker","height":"17200","hair_color":"blond","skin_color":"fair","eye_color":"blue","birth_year":"19BBY","gender":"male","homeworld":~147,"films":[~152,~153,~154,~149,~155],"species":[~191],"vehicles":[~197,~205],"starships":[~236,~240],"created":"2014-12-09T13:50:51","edited":"2014-12-20T21:17:56","desc":"Luke Skywalker is a fictional character and the main protagonist of the original film trilogy of the Star Wars franchise created by George Lucas. The character, portrayed by Mark Hamill, is an important figure in the Rebel Alliance's struggle against the Galactic Empire. He is the twin brother of Rebellion leader Princess Leia Organa of Alderaan, a friend and brother-in-law of smuggler Han Solo, an apprentice to Jedi Masters Obi-Wan \"Ben\" Kenobi and Yoda, the son of fallen Jedi Anakin Skywalker (Darth Vader) and Queen of Naboo/Republic Senator Padmé Amidala and maternal uncle of Kylo Ren / Ben Solo. The now non-canon Star Wars expanded universe depicts him as a powerful Jedi Master, husband of Mara Jade, the father of Ben Skywalker and maternal uncle of Jaina, Jacen and Anakin Solo.\nIn 2015, the character was selected by Empire magazine as the 50th greatest movie character of all time.[2] On their list of the 100 Greatest Fictional Characters, Fandomania.com ranked the character at number 14.[3]"} +(1913){"name":"C-3PO","height":"16700","hair_color":"n/a","skin_color":"gold","eye_color":"yellow","birth_year":"112BBY","gender":"n/a","homeworld":~147,"films":[~150,~151,~152,~153,~154,~149],"species":[~190],"vehicles":[],"starships":[],"created":"2014-12-10T15:10:51","edited":"2014-12-20T21:17:50","desc":"C-3PO (/siːˈθriːpi.oʊ/) or See-Threepio is a humanoid robot character from the Star Wars franchise who appears in the original trilogy, the prequel trilogy and the sequel trilogy. Built by Anakin Skywalker, C-3PO was designed as a protocol droid intended to assist in etiquette, customs, and translation, boasting that he is \"fluent in over six million forms of communication\". Along with his astromech droid counterpart and friend R2-D2, C-3PO provides comic relief within the narrative structure of the films, and serves as a foil. Anthony Daniels has portrayed the character in all nine Star Wars cinematic films released to date, including Rogue One and the animated The Clone Wars; C-3PO and R2-D2 are the only characters to appear in every film.\nDespite his oblivious nature, C-3PO has played a pivotal role in the Galaxy's history, appearing under the service of Shmi Skywalker, the Lars homestead, Padmé Amidala, Raymus Antilles, Luke Skywalker, and Leia Organa. In the majority of depictions, C-3PO's physical appearance is primarily a polished gold plating, although his appearance varies throughout the films; including the absence of metal coverings in The Phantom Menace, a dull copper plating in Attack of the Clones, a silver lower right leg introduced in A New Hope, and a red left arm in The Force Awakens.[1] C-3PO also appears frequently in the Star Wars Canon and Star Wars Legends continuities of novels, comic books, and video games, and was the protagonist in the ABC television show Droids."} +(1464){"name":"R2-D2","height":"9600","hair_color":"n/a","skin_color":"white, blue","eye_color":"red","birth_year":"33BBY","gender":"n/a","homeworld":~94,"films":[~150,~151,~152,~153,~154,~149,~155],"species":[~190],"vehicles":[],"starships":[],"created":"2014-12-10T15:11:50","edited":"2014-12-20T21:17:50","desc":"R2-D2 is a fictional robot character in the Star Wars franchise created by George Lucas, who appears in the original trilogy, the prequel trilogy, the sequel trilogy, and Rogue One. A small astromech droid, R2-D2 is a major character and appears in all Star Wars films to date. Throughout the course of the films, he joins or supports Padmé Amidala, Anakin Skywalker, Leia Organa, Luke Skywalker, and Obi-Wan Kenobi in various points in the saga.\nEnglish actor Kenny Baker played R2-D2 in all three original Star Wars films, and received billing credit for the character in the prequel trilogy, where Baker's role was reduced, as R2-D2 was portrayed mainly by radio controlled props and CGI models. In the sequel trilogy, Baker was credited as consultant for The Force Awakens, however Jimmy Vee also co-performed the character in some scenes. Vee later took over the role beginning in The Last Jedi.[1] R2-D2's sounds and vocal effects were created by Ben Burtt. R2-D2 was designed in artwork by Ralph McQuarrie, co-developed by John Stears and built by Tony Dyson."} +(1941){"name":"Darth Vader","height":"20200","hair_color":"none","skin_color":"white","eye_color":"yellow","birth_year":"41.9BBY","gender":"male","homeworld":~147,"films":[~152,~153,~154,~149],"species":[~191],"vehicles":[],"starships":[~237],"created":"2014-12-10T15:18:20","edited":"2014-12-20T21:17:50","desc":"Darth Vader, also known by his birth name Anakin Skywalker, is a fictional character in the Star Wars franchise.[1][2][3] Vader appears in the original film trilogy as a pivotal antagonist whose actions drive the plot, while his past as Anakin Skywalker and the story of his corruption are central to the narrative of the prequel trilogy.\nThe character was created by George Lucas and has been portrayed by numerous actors. His appearances span the first six Star Wars films, as well as Rogue One, and his character is heavily referenced in Star Wars: The Force Awakens. He is also an important character in the Star Wars expanded universe of television series, video games, novels, literature and comic books. Originally a Jedi prophesied to bring balance to the Force, he falls to the dark side of the Force and serves the evil Galactic Empire at the right hand of his Sith master, Emperor Palpatine (also known as Darth Sidious).[4] He is also the father of Luke Skywalker and Princess Leia Organa, secret husband of Padmé Amidala and grandfather of Kylo Ren.\nDarth Vader has become one of the most iconic villains in popular culture, and has been listed among the greatest villains and fictional characters ever.[5][6] The American Film Institute listed him as the third greatest movie villain in cinema history on 100 Years... 100 Heroes and Villains, behind Hannibal Lecter and Norman Bates.[7] However, other critics consider him a tragic hero, citing his original motivations for the greater good before his fall to the dark side.[8][9]"} +(2385){"name":"Leia Organa","height":"15000","hair_color":"brown","skin_color":"light","eye_color":"brown","birth_year":"19BBY","gender":"female","homeworld":~88,"films":[~152,~153,~154,~149,~155],"species":[~191],"vehicles":[~205],"starships":[],"created":"2014-12-10T15:20:09","edited":"2014-12-20T21:17:50","desc":"Princess Leia Organa of Alderaan (also Senator Leia Organa or General Leia Organa) is a fictional character in the Star Wars franchise, portrayed in films by Carrie Fisher. Introduced in the original Star Wars film in 1977, Leia is princess of the planet Alderaan, a member of the Imperial Senate and an agent of the Rebel Alliance. She thwarts the sinister Sith Lord Darth Vader and helps bring about the destruction of the Empire's cataclysmic superweapon, the Death Star. In The Empire Strikes Back (1980), Leia commands a Rebel base and evades Vader as she falls in love with the smuggler, Han Solo. In Return of the Jedi (1983), Leia leads the operation to rescue Han from the crime lord Jabba the Hutt, and is revealed to be Vader's daughter and the twin sister of Luke Skywalker. The prequel film Revenge of the Sith (2005) establishes that the twins' mother is Senator (and former queen) Padmé Amidala of Naboo, who dies after childbirth. Leia is adopted by Senator Bail and Queen Breha Organa of Alderaan. In The Force Awakens (2015), Leia is the founder and General of the Resistance against the First Order and has a son with Han named Ben, who goes by the name Kylo Ren.\nIn the original Star Wars expanded universe (1977–2014) of novels, comics and video games, which are set in an alternate continuity, Leia continues her adventures with Han and Luke after Return of the Jedi, fighting Imperial resurgences and new threats to the galaxy. She becomes the Chief of State of the New Republic and a Jedi Master, and is the mother to three children by Han: Jaina, Jacen and Anakin Solo.\nOne of the more popular Star Wars characters, Leia has been called a 1980s icon, a feminist hero and model for other adventure heroines. She has appeared in many derivative works and merchandising, and has been referenced or parodied in several TV shows and films. Her \"cinnamon buns\" hairstyle from Star Wars (1977) and metal bikini from Return of the Jedi have become cultural icons."} +(395){"name":"Owen Lars","height":"17800","hair_color":"brown, grey","skin_color":"light","eye_color":"blue","birth_year":"52BBY","gender":"male","homeworld":~147,"films":[~150,~152,~149],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-10T15:52:14","edited":"2014-12-20T21:17:50","desc":"undefined"} +(400){"name":"Beru Whitesun lars","height":"16500","hair_color":"brown","skin_color":"light","eye_color":"blue","birth_year":"47BBY","gender":"female","homeworld":~147,"films":[~150,~152,~149],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-10T15:53:41","edited":"2014-12-20T21:17:50","desc":"undefined"} +(377){"name":"R5-D4","height":"9700","hair_color":"n/a","skin_color":"white, red","eye_color":"red","birth_year":"unknown","gender":"n/a","homeworld":~147,"films":[~149],"species":[~190],"vehicles":[],"starships":[],"created":"2014-12-10T15:57:50","edited":"2014-12-20T21:17:50","desc":"undefined"} +(1155){"name":"Biggs Darklighter","height":"18300","hair_color":"black","skin_color":"light","eye_color":"brown","birth_year":"24BBY","gender":"male","homeworld":~147,"films":[~149],"species":[~191],"vehicles":[],"starships":[~236],"created":"2014-12-10T15:59:50","edited":"2014-12-20T21:17:50","desc":"Rogue Squadron is a starfighter squadron in the Star Wars franchise. Many surviving members of Red Squadron, the X-wing attack force that Luke Skywalker joins during the Battle of Yavin in Star Wars Episode IV: A New Hope (1977), later join Rogue Squadron. The squadron appears in The Empire Strikes Back (1980) as Rogue Group. In the 2016 film Rogue One, Rebel fighters on a suicide mission to steal the plans for the Death Star self-identify as \"Rogue One\", a possible precursor to Rogue Squadron.[1]\nRogue Squadron is prominently featured in the comic book series Star Wars: X-wing, the ten-volume novel series Star Wars: X-wing, and the video game series Star Wars: Rogue Squadron. The unit is depicted as consisting of \"the best pilots and the best fighters\".[2]"} +(1126){"name":"Obi-Wan Kenobi","height":"18200","hair_color":"auburn, white","skin_color":"fair","eye_color":"blue-gray","birth_year":"57BBY","gender":"male","homeworld":~106,"films":[~150,~151,~152,~153,~154,~149],"species":[~191],"vehicles":[~211],"starships":[~251,~254,~262,~263,~266],"created":"2014-12-10T16:16:29","edited":"2014-12-20T21:17:50","desc":"Obi-Wan \"Ben\" Kenobi is a fictional character in the Star Wars franchise. Within the original trilogy he is portrayed by Sir Alec Guinness, while in the prequel trilogy a younger version of the character is portrayed by Ewan McGregor. In the original trilogy, he is a mentor to Luke Skywalker, to whom he introduces the ways of the Jedi. In the prequel trilogy, he is a master and friend to Anakin Skywalker. He is frequently featured as a main character in various other Star Wars media.\nSir Alec Guinness's portrayal of Obi-Wan in the original Star Wars (1977) remains the only time an actor has received an Oscar nomination (Best Supporting Actor) for acting in a Star Wars film."} +(1959){"name":"Anakin Skywalker","height":"18800","hair_color":"blond","skin_color":"fair","eye_color":"blue","birth_year":"41.9BBY","gender":"male","homeworld":~147,"films":[~150,~151,~152],"species":[~191],"vehicles":[~213,~215],"starships":[~254,~263,~246],"created":"2014-12-10T16:20:44","edited":"2014-12-20T21:17:50","desc":"Darth Vader, also known by his birth name Anakin Skywalker, is a fictional character in the Star Wars franchise.[1][2][3] Vader appears in the original film trilogy as a pivotal antagonist whose actions drive the plot, while his past as Anakin Skywalker and the story of his corruption are central to the narrative of the prequel trilogy.\nThe character was created by George Lucas and has been portrayed by numerous actors. His appearances span the first six Star Wars films, as well as Rogue One, and his character is heavily referenced in Star Wars: The Force Awakens. He is also an important character in the Star Wars expanded universe of television series, video games, novels, literature and comic books. Originally a Jedi prophesied to bring balance to the Force, he falls to the dark side of the Force and serves the evil Galactic Empire at the right hand of his Sith master, Emperor Palpatine (also known as Darth Sidious).[4] He is also the father of Luke Skywalker and Princess Leia Organa, secret husband of Padmé Amidala and grandfather of Kylo Ren.\nDarth Vader has become one of the most iconic villains in popular culture, and has been listed among the greatest villains and fictional characters ever.[5][6] The American Film Institute listed him as the third greatest movie villain in cinema history on 100 Years... 100 Heroes and Villains, behind Hannibal Lecter and Norman Bates.[7] However, other critics consider him a tragic hero, citing his original motivations for the greater good before his fall to the dark side.[8][9]"} +(729){"name":"Wilhuff Tarkin","height":"18000","hair_color":"auburn, grey","skin_color":"fair","eye_color":"blue","birth_year":"64BBY","gender":"male","homeworld":~107,"films":[~149,~152],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-10T16:26:56","edited":"2014-12-20T21:17:50","desc":"Governor Wilhuff \"Grand Moff\" Tarkin, is a fictional character in the Star Wars franchise, first portrayed by Peter Cushing in the 1977 film Star Wars. He is the commander of the Death Star, the Galactic Empire's dwarf planet-sized super weapon. The character has been called \"one of the most formidable villains in Star Wars history.\"[1]"} +(1076){"name":"Chewbacca","height":"22800","hair_color":"brown","skin_color":"unknown","eye_color":"blue","birth_year":"200BBY","gender":"male","homeworld":~100,"films":[~152,~153,~154,~149,~155],"species":[~189],"vehicles":[~200],"starships":[~234,~240],"created":"2014-12-10T16:42:45","edited":"2014-12-20T21:17:50","desc":"Chewbacca (/tʃuːˈbɑːkə/), nicknamed \"Chewie\", is a fictional character in the Star Wars franchise. He is a Wookiee, a tall, hirsute biped and intelligent species from the planet Kashyyyk. Chewbacca is the loyal friend and first mate of Han Solo, and serves as co-pilot on Solo's spaceship, the Millennium Falcon.[1] Within the films of the main saga, Chewbacca is portrayed by Peter Mayhew in the Star Wars on Episodes from III to VIII (Mayhew shares the role with his body double Joonas Suotamo on Episode VII and VIII). Suotamo took over the role alone in Solo: A Star Wars Story. The character has also appeared on television, books, comics, and video games."} +(1047){"name":"Han Solo","height":"18000","hair_color":"brown","skin_color":"fair","eye_color":"brown","birth_year":"29BBY","gender":"male","homeworld":~108,"films":[~153,~154,~149,~155],"species":[~191],"vehicles":[],"starships":[~234,~240],"created":"2014-12-10T16:49:14","edited":"2014-12-20T21:17:50","desc":"Han Solo is a character in the Star Wars franchise. In the original film trilogy, Han and his co-pilot, Chewbacca, became involved in the Rebel Alliance's struggle against the Galactic Empire. During the course of the Star Wars narrative, he becomes a chief figure in the Alliance and succeeding galactic governments. Star Wars creator George Lucas described the character as \"a loner who realizes the importance of being part of a group and helping for the common good\".[2] Harrison Ford portrayed the character in the original Star Wars trilogy as well as The Force Awakens. Alden Ehrenreich will portray a young Han Solo in Solo: A Star Wars Story."} +(630){"name":"Greedo","height":"17300","hair_color":"n/a","skin_color":"green","eye_color":"black","birth_year":"44BBY","gender":"male","homeworld":~109,"films":[~149],"species":[~192],"vehicles":[],"starships":[],"created":"2014-12-10T17:03:30","edited":"2014-12-20T21:17:50","desc":"Greedo (or Greedo the Young) is a fictional character from the Star Wars franchise. He is portrayed by Paul Blake as well as Maria De Aragon in some close-in pickup shots in Star Wars (1977). The character is part of a fan controversy known as \"Han shot first\"."} +(2076){"name":"Jabba Desilijic Tiure","height":"17500","hair_color":"n/a","skin_color":"green-tan, brown","eye_color":"orange","birth_year":"600BBY","gender":"hermaphrodite","homeworld":~110,"films":[~151,~153,~149],"species":[~156],"vehicles":[],"starships":[],"created":"2014-12-10T17:11:31","edited":"2014-12-20T21:17:50","desc":"Jabba Desilijic Tiure,[1] commonly known as Jabba the Hutt, is a fictional character and an antagonist in the Star Wars franchise created by George Lucas. He is depicted as a large, slug-like[2] alien. His appearance has been described by film critic Roger Ebert as a cross between a toad and the Cheshire Cat.[3]\nIn the original theatrical releases of the original Star Wars trilogy, Jabba the Hutt first appeared in Return of the Jedi (1983), though he is mentioned in Star Wars (1977) and The Empire Strikes Back (1980), and a previously deleted scene involving Jabba the Hutt was added to the 1997 theatrical re-release and subsequent home media releases of Star Wars. Jabba is introduced as the de facto leader of the Desilijic-Hutt Cartel, and the most powerful crime boss on Tatooine, who has a bounty on Han Solo's head. Jabba employs a retinue of career criminals, bounty hunters, smugglers, assassins and bodyguards to operate his criminal empire. He keeps a host of entertainers at his disposal at his palace: slaves, droids and alien creatures. Jabba has a grim sense of humor, an insatiable appetite, and affinities for gambling, slave girls, and torture.[1]\nThe character was incorporated into the Star Wars merchandising campaign that corresponded with the theatrical release of Return of the Jedi. Besides the films, Jabba the Hutt is featured in Star Wars Legends literature. Jabba the Hutt's image has since played an influential role in popular culture, particularly in the United States. The name is used as a satirical literary device and a political caricature to underscore negative qualities such as morbid obesity and corruption.[4][5]"} +(925){"name":"Wedge Antilles","height":"17000","hair_color":"brown","skin_color":"fair","eye_color":"hazel","birth_year":"21BBY","gender":"male","homeworld":~108,"films":[~153,~154,~149],"species":[~191],"vehicles":[~197],"starships":[~236],"created":"2014-12-12T11:08:06","edited":"2014-12-20T21:17:50","desc":"Wedge Antilles is a fictional character in the Star Wars franchise. He is a supporting character portrayed by Denis Lawson in the original Star Wars trilogy.[1] Antilles is a starfighter pilot for the Rebel Alliance, and founded Rogue Squadron with his friend Luke Skywalker. Wedge is notable for being the only Rebel pilot to have survived both attack runs on the Death Stars at the battles of Yavin and Endor.[1] He also appears in the Star Wars expanded universe, most notably as the lead character in most of the X-Wing novels."} +(392){"name":"Jek Tono Porkins","height":"18000","hair_color":"brown","skin_color":"fair","eye_color":"blue","birth_year":"unknown","gender":"male","homeworld":~112,"films":[~149],"species":[~191],"vehicles":[],"starships":[~236],"created":"2014-12-12T11:16:56","edited":"2014-12-20T21:17:50","desc":"undefined"} +(954){"name":"Yoda","height":"6600","hair_color":"white","skin_color":"green","eye_color":"brown","birth_year":"896BBY","gender":"male","homeworld":~114,"films":[~150,~151,~152,~153,~154],"species":[~157],"vehicles":[],"starships":[],"created":"2014-12-15T12:26:01","edited":"2014-12-20T21:17:50","desc":"Yoda is a fictional character in the Star Wars franchise created by George Lucas, first appearing in the 1980 film The Empire Strikes Back. In the original films, he trains Luke Skywalker to fight against the Galactic Empire. In the prequel films, he serves as the Grand Master of the Jedi Order and as a high-ranking general of Clone Troopers in the Clone Wars. Following his death in Return of the Jedi at the age of 900, Yoda was the oldest living character in the Star Wars franchise in canon, until the introduction of Maz Kanata in Star Wars: The Force Awakens."} +(1852){"name":"Palpatine","height":"17000","hair_color":"grey","skin_color":"pale","eye_color":"yellow","birth_year":"82BBY","gender":"male","homeworld":~94,"films":[~150,~151,~152,~153,~154],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-15T12:48:05","edited":"2014-12-20T21:17:50","desc":"Sheev Palpatine[3], also known as Darth Sidious and The Emperor, is a fictional character and one of the primary antagonists of the Star Wars franchise,[4] mainly portrayed by Ian McDiarmid. In the original trilogy, he is depicted as the aged, pale-faced and cloaked Emperor of the Galactic Empire and the master of Darth Vader. In the prequel trilogy, he is portrayed as a charismatic Senator from Naboo who uses deception and political manipulation to rise to the position of Supreme Chancellor of the Galactic Republic, and then reorganizes the Republic into the Galactic Empire, with himself as Emperor.\nThough outwardly appearing to be a well-intentioned public servant and supporter of democracy prior to becoming Emperor,[5] he is actually Darth Sidious, the Dark Lord of the Sith – a cult of practitioners of the dark side of the Force previously thought to have been extinct in the Star Wars galaxy for a millennium.[5] As Sidious, he instigates the Clone Wars, nearly destroys the Jedi, and transforms the Republic into the Empire. He also manipulates Jedi Knight Anakin Skywalker into turning to the dark side and serving at his side as Darth Vader. Palpatine's reign is brought to an end when Vader kills him to save his son, Luke Skywalker.\nSince the initial theatrical run of Return of the Jedi, Palpatine has become a widely recognized popular culture symbol of evil, sinister deception, dictatorship, tyranny, and the subversion of democracy."} +(1053){"name":"Boba Fett","height":"18300","hair_color":"black","skin_color":"fair","eye_color":"brown","birth_year":"31.5BBY","gender":"male","homeworld":~96,"films":[~150,~153,~154],"species":[~191],"vehicles":[],"starships":[~239],"created":"2014-12-15T12:49:32","edited":"2014-12-20T21:17:50","desc":"Boba Fett is a fictional character in the Star Wars franchise. In The Empire Strikes Back and Return of the Jedi, he is a bounty hunter hired by Darth Vader and also employed by Jabba the Hutt. He was also added briefly to the original film Star Wars when the film was digitally remastered. Star Wars: Episode II – Attack of the Clones establishes his origin as an unaltered clone of the bounty hunter Jango Fett raised as his son. He also appears in several episodes of Star Wars: The Clone Wars cartoon series which further describes his growth as a villain in the Star Wars universe. His aura of danger and mystery has created a cult following for the character."} +(374){"name":"IG-88","height":"20000","hair_color":"none","skin_color":"metal","eye_color":"red","birth_year":"15BBY","gender":"none","homeworld":~114,"films":[~154],"species":[~190],"vehicles":[],"starships":[],"created":"2014-12-15T12:51:10","edited":"2014-12-20T21:17:50","desc":"undefined"} +(374){"name":"Bossk","height":"19000","hair_color":"none","skin_color":"green","eye_color":"red","birth_year":"53BBY","gender":"male","homeworld":~115,"films":[~154],"species":[~158],"vehicles":[],"starships":[],"created":"2014-12-15T12:53:49","edited":"2014-12-20T21:17:50","desc":"undefined"} +(805){"name":"Lando Calrissian","height":"17700","hair_color":"black","skin_color":"dark","eye_color":"brown","birth_year":"31BBY","gender":"male","homeworld":~116,"films":[~153,~154],"species":[~191],"vehicles":[],"starships":[~234],"created":"2014-12-15T12:56:32","edited":"2014-12-20T21:17:50","desc":"Lando Calrissian is a fictional character in the Star Wars franchise. He is portrayed by Billy Dee Williams in The Empire Strikes Back and Return of the Jedi, and will be played by Donald Glover in the upcoming standalone film, Solo: A Star Wars Story.[1] He also appears frequently in the Star Wars expanded universe of novels, comic books and video games, including a series of novels in which he is the protagonist."} +(374){"name":"Lobot","height":"17500","hair_color":"none","skin_color":"light","eye_color":"blue","birth_year":"37BBY","gender":"male","homeworld":~92,"films":[~154],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-15T13:01:57","edited":"2014-12-20T21:17:50","desc":"undefined"} +(390){"name":"Ackbar","height":"18000","hair_color":"none","skin_color":"brown mottle","eye_color":"orange","birth_year":"41BBY","gender":"male","homeworld":~117,"films":[~153,~155],"species":[~159],"vehicles":[],"starships":[],"created":"2014-12-18T11:07:50","edited":"2014-12-20T21:17:50","desc":"undefined"} +(383){"name":"Mon Mothma","height":"15000","hair_color":"auburn","skin_color":"fair","eye_color":"blue","birth_year":"48BBY","gender":"female","homeworld":~118,"films":[~153],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-18T11:12:38","edited":"2014-12-20T21:17:50","desc":"undefined"} +(377){"name":"Arvel Crynyd","height":null,"hair_color":"brown","skin_color":"fair","eye_color":"brown","birth_year":"unknown","gender":"male","homeworld":~114,"films":[~153],"species":[~191],"vehicles":[],"starships":[~243],"created":"2014-12-18T11:16:33","edited":"2014-12-20T21:17:50","desc":"undefined"} +(390){"name":"Wicket Systri Warrick","height":"8800","hair_color":"brown","skin_color":"brown","eye_color":"brown","birth_year":"8BBY","gender":"male","homeworld":~93,"films":[~153],"species":[~160],"vehicles":[],"starships":[],"created":"2014-12-18T11:21:58","edited":"2014-12-20T21:17:50","desc":"undefined"} +(1284){"name":"Nien Nunb","height":"16000","hair_color":"none","skin_color":"grey","eye_color":"black","birth_year":"unknown","gender":"male","homeworld":~119,"films":[~153],"species":[~161],"vehicles":[],"starships":[~234],"created":"2014-12-18T11:26:18","edited":"2014-12-20T21:17:50","desc":"Nien Nunb is a fictional character in the Star Wars franchise. Introduced in the 1983 film Return of the Jedi, he was brought to life both as a puppet and a costumed actor during the film. Nunb was puppeteered by Mike Quinn and was portrayed by Richard Bonehill in wide shots. The character was voiced by Kipsang Rotich, a Kenyan student who spoke in his native Kalenjin language, as well as in the Kikuyu language. Quinn and Rotich returned to the role for the 2015 film Star Wars: The Force Awakens, with the former confirmed for the 2017 film Star Wars: The Last Jedi.\nWithin the fictional Star Wars universe, Nien Nunb was an arms dealer of the Sullustan species who joined the Alliance to Restore the Republic during the Galactic Civil War. Three decades later, Nunb was a starfighter pilot in the Resistance. He fought in the First Order–Resistance conflict, including the Battle of Starkiller Base."} +(553){"name":"Qui-Gon Jinn","height":"19300","hair_color":"brown","skin_color":"fair","eye_color":"blue","birth_year":"92BBY","gender":"male","homeworld":~114,"films":[~151],"species":[~191],"vehicles":[~211],"starships":[],"created":"2014-12-19T16:54:53","edited":"2014-12-20T21:17:50","desc":"Qui-Gon Jinn is a fictional character in the Star Wars franchise, portrayed by Liam Neeson as the main protagonist of the 1999 film Star Wars: Episode I – The Phantom Menace."} +(400){"name":"Nute Gunray","height":"19100","hair_color":"none","skin_color":"mottled green","eye_color":"red","birth_year":"unknown","gender":"male","homeworld":~104,"films":[~150,~151,~152],"species":[~162],"vehicles":[],"starships":[],"created":"2014-12-19T17:05:57","edited":"2014-12-20T21:17:50","desc":"undefined"} +(382){"name":"Finis Valorum","height":"17000","hair_color":"blond","skin_color":"fair","eye_color":"blue","birth_year":"91BBY","gender":"male","homeworld":~95,"films":[~151],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-19T17:21:45","edited":"2014-12-20T21:17:50","desc":"undefined"} +(1134){"name":"Jar Jar Binks","height":"19600","hair_color":"none","skin_color":"orange","eye_color":"orange","birth_year":"52BBY","gender":"male","homeworld":~94,"films":[~150,~151],"species":[~163],"vehicles":[],"starships":[],"created":"2014-12-19T17:29:32","edited":"2014-12-20T21:17:50","desc":"Jar Jar Binks is a fictional character from the Star Wars saga created by George Lucas. A major character in Star Wars: Episode I – The Phantom Menace, he also has a smaller role in Episode II: Attack of the Clones, and a one-line cameo in Episode III: Revenge of the Sith, as well as a role in the television series Star Wars: The Clone Wars. The first lead computer generated character of the franchise, he has been portrayed by Ahmed Best in most of his appearances.\nJar Jar's primary role in Episode I was to provide comic relief for the audience. Upon the movie's release, he was met with an overwhelmingly negative reception from both critics and audiences, and is today considered one of the most hated characters in the history of film.[1][2]"} +(384){"name":"Roos Tarpals","height":"22400","hair_color":"none","skin_color":"grey","eye_color":"orange","birth_year":"unknown","gender":"male","homeworld":~94,"films":[~151],"species":[~163],"vehicles":[],"starships":[],"created":"2014-12-19T17:32:56","edited":"2014-12-20T21:17:50","desc":"undefined"} +(383){"name":"Rugor Nass","height":"20600","hair_color":"none","skin_color":"green","eye_color":"orange","birth_year":"unknown","gender":"male","homeworld":~94,"films":[~151],"species":[~163],"vehicles":[],"starships":[],"created":"2014-12-19T17:33:38","edited":"2014-12-20T21:17:50","desc":"undefined"} +(380){"name":"Ric Olié","height":"18300","hair_color":"brown","skin_color":"fair","eye_color":"blue","birth_year":"unknown","gender":"male","homeworld":~94,"films":[~151],"species":[],"vehicles":[],"starships":[~247],"created":"2014-12-19T17:45:01","edited":"2014-12-20T21:17:50","desc":"undefined"} +(1170){"name":"Watto","height":"13700","hair_color":"black","skin_color":"blue, grey","eye_color":"yellow","birth_year":"unknown","gender":"male","homeworld":~120,"films":[~150,~151],"species":[~164],"vehicles":[],"starships":[],"created":"2014-12-19T17:48:54","edited":"2014-12-20T21:17:50","desc":"Watto is a fictional character in the Star Wars franchise, featured in the films The Phantom Menace and Attack of the Clones. He is computer-generated and played by voice actor Andy Secombe. He is a mean-tempered, greedy Toydarian, and owner of a second-hand goods store in Mos Espa on the planet Tatooine. Among Watto's belongings are the slaves Shmi Skywalker and her son, Anakin. He acquires them after winning a podracing bet with Gardulla the Hutt, and he puts them both to work in his store. Anakin demonstrates an incredible aptitude for equipment repair, and Watto decides to profit from it by having the boy fix various broken equipment in the store. He eventually loses Anakin in a podracing bet with Qui-Gon Jinn when he bets on a competitor, Sebulba, who is defeated by Anakin."} +(385){"name":"Sebulba","height":"11200","hair_color":"none","skin_color":"grey, red","eye_color":"orange","birth_year":"unknown","gender":"male","homeworld":~121,"films":[~151],"species":[~165],"vehicles":[],"starships":[],"created":"2014-12-19T17:53:02","edited":"2014-12-20T21:17:50","desc":"undefined"} +(379){"name":"Quarsh Panaka","height":"18300","hair_color":"black","skin_color":"dark","eye_color":"brown","birth_year":"62BBY","gender":"male","homeworld":~94,"films":[~151],"species":[],"vehicles":[],"starships":[],"created":"2014-12-19T17:55:43","edited":"2014-12-20T21:17:50","desc":"undefined"} +(392){"name":"Shmi Skywalker","height":"16300","hair_color":"black","skin_color":"fair","eye_color":"brown","birth_year":"72BBY","gender":"female","homeworld":~147,"films":[~150,~151],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-19T17:57:41","edited":"2014-12-20T21:17:50","desc":"undefined"} +(820){"name":"Darth Maul","height":"17500","hair_color":"none","skin_color":"red","eye_color":"yellow","birth_year":"54BBY","gender":"male","homeworld":~122,"films":[~151],"species":[~173],"vehicles":[~212],"starships":[~248],"created":"2014-12-19T18:00:41","edited":"2014-12-20T21:17:50","desc":"Darth Maul, later known simply as Maul, is a fictional character in the Star Wars franchise. Trained as Darth Sidious's first apprentice, he serves as a Sith Lord and a master of wielding a double-bladed lightsaber. He first appears in Star Wars: Episode I – The Phantom Menace (portrayed by Ray Park and voiced by Peter Serafinowicz), and later makes appearances in Star Wars: The Clone Wars and Star Wars Rebels, voiced by Samuel Witwer."} +(382){"name":"Bib Fortuna","height":"18000","hair_color":"none","skin_color":"pale","eye_color":"pink","birth_year":"unknown","gender":"male","homeworld":~123,"films":[~153],"species":[~166],"vehicles":[],"starships":[],"created":"2014-12-20T09:47:02","edited":"2014-12-20T21:17:50","desc":"undefined"} +(393){"name":"Ayla Secura","height":"17800","hair_color":"none","skin_color":"blue","eye_color":"hazel","birth_year":"48BBY","gender":"female","homeworld":~123,"films":[~150,~151,~152],"species":[~166],"vehicles":[],"starships":[],"created":"2014-12-20T09:48:01","edited":"2014-12-20T21:17:50","desc":"undefined"} +(386){"name":"Dud Bolt","height":"9400","hair_color":"none","skin_color":"blue, grey","eye_color":"yellow","birth_year":"unknown","gender":"male","homeworld":~125,"films":[~151],"species":[~168],"vehicles":[],"starships":[],"created":"2014-12-20T09:57:31","edited":"2014-12-20T21:17:50","desc":"undefined"} +(386){"name":"Gasgano","height":"12200","hair_color":"none","skin_color":"white, blue","eye_color":"black","birth_year":"unknown","gender":"male","homeworld":~126,"films":[~151],"species":[~169],"vehicles":[],"starships":[],"created":"2014-12-20T10:02:12","edited":"2014-12-20T21:17:50","desc":"undefined"} +(402){"name":"Ben Quadinaros","height":"16300","hair_color":"none","skin_color":"grey, green, yellow","eye_color":"orange","birth_year":"unknown","gender":"male","homeworld":~127,"films":[~151],"species":[~170],"vehicles":[],"starships":[],"created":"2014-12-20T10:08:33","edited":"2014-12-20T21:17:50","desc":"undefined"} +(824){"name":"Mace Windu","height":"18800","hair_color":"none","skin_color":"dark","eye_color":"brown","birth_year":"72BBY","gender":"male","homeworld":~128,"films":[~150,~151,~152],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-20T10:12:30","edited":"2014-12-20T21:17:50","desc":"Mace Windu is a fictional character in the Star Wars franchise, portrayed by actor Samuel L. Jackson in the prequel films and voiced by voice-actor Terrence C. Carson in other projects. He appears as Master of the Jedi High Council and one of the last members of the order's upper echelons before the Galactic Republic's fall. He is the Council's primary liaison, although the Clone Wars caused him to question his most firmly held beliefs.[1]"} +(394){"name":"Ki-Adi-Mundi","height":"19800","hair_color":"white","skin_color":"pale","eye_color":"yellow","birth_year":"92BBY","gender":"male","homeworld":~129,"films":[~150,~151,~152],"species":[~171],"vehicles":[],"starships":[],"created":"2014-12-20T10:15:32","edited":"2014-12-20T21:17:50","desc":"undefined"} +(392){"name":"Kit Fisto","height":"19600","hair_color":"none","skin_color":"green","eye_color":"black","birth_year":"unknown","gender":"male","homeworld":~130,"films":[~150,~151,~152],"species":[~172],"vehicles":[],"starships":[],"created":"2014-12-20T10:18:57","edited":"2014-12-20T21:17:50","desc":"undefined"} +(388){"name":"Eeth Koth","height":"17100","hair_color":"black","skin_color":"brown","eye_color":"brown","birth_year":"unknown","gender":"male","homeworld":~131,"films":[~151,~152],"species":[~173],"vehicles":[],"starships":[],"created":"2014-12-20T10:26:47","edited":"2014-12-20T21:17:50","desc":"undefined"} +(387){"name":"Adi Gallia","height":"18400","hair_color":"none","skin_color":"dark","eye_color":"blue","birth_year":"unknown","gender":"female","homeworld":~95,"films":[~151,~152],"species":[~174],"vehicles":[],"starships":[],"created":"2014-12-20T10:29:11","edited":"2014-12-20T21:17:50","desc":"undefined"} +(389){"name":"Saesee Tiin","height":"18800","hair_color":"none","skin_color":"pale","eye_color":"orange","birth_year":"unknown","gender":"male","homeworld":~133,"films":[~151,~152],"species":[~175],"vehicles":[],"starships":[],"created":"2014-12-20T10:32:11","edited":"2014-12-20T21:17:50","desc":"undefined"} +(385){"name":"Yarael Poof","height":"26400","hair_color":"none","skin_color":"white","eye_color":"yellow","birth_year":"unknown","gender":"male","homeworld":~134,"films":[~151],"species":[~176],"vehicles":[],"starships":[],"created":"2014-12-20T10:34:48","edited":"2014-12-20T21:17:50","desc":"undefined"} +(394){"name":"Plo Koon","height":"18800","hair_color":"none","skin_color":"orange","eye_color":"black","birth_year":"22BBY","gender":"male","homeworld":~135,"films":[~150,~151,~152],"species":[~177],"vehicles":[],"starships":[~251],"created":"2014-12-20T10:49:19","edited":"2014-12-20T21:17:50","desc":"undefined"} +(386){"name":"Mas Amedda","height":"19600","hair_color":"none","skin_color":"blue","eye_color":"blue","birth_year":"unknown","gender":"male","homeworld":~136,"films":[~150,~151],"species":[~178],"vehicles":[],"starships":[],"created":"2014-12-20T10:53:26","edited":"2014-12-20T21:17:50","desc":"undefined"} +(388){"name":"Gregar Typho","height":"18500","hair_color":"black","skin_color":"dark","eye_color":"brown","birth_year":"unknown","gender":"male","homeworld":~94,"films":[~150],"species":[~191],"vehicles":[],"starships":[~246],"created":"2014-12-20T11:10:10","edited":"2014-12-20T21:17:50","desc":"undefined"} +(381){"name":"Cordé","height":"15700","hair_color":"brown","skin_color":"light","eye_color":"brown","birth_year":"unknown","gender":"female","homeworld":~94,"films":[~150],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-20T11:11:39","edited":"2014-12-20T21:17:50","desc":"undefined"} +(381){"name":"Cliegg Lars","height":"18300","hair_color":"brown","skin_color":"fair","eye_color":"blue","birth_year":"82BBY","gender":"male","homeworld":~147,"films":[~150],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-20T15:59:03","edited":"2014-12-20T21:17:50","desc":"undefined"} +(395){"name":"Poggle the Lesser","height":"18300","hair_color":"none","skin_color":"green","eye_color":"yellow","birth_year":"unknown","gender":"male","homeworld":~97,"films":[~150,~152],"species":[~179],"vehicles":[],"starships":[],"created":"2014-12-20T16:40:43","edited":"2014-12-20T21:17:50","desc":"undefined"} +(394){"name":"Luminara Unduli","height":"17000","hair_color":"black","skin_color":"yellow","eye_color":"blue","birth_year":"58BBY","gender":"female","homeworld":~137,"films":[~150,~152],"species":[~180],"vehicles":[],"starships":[],"created":"2014-12-20T16:45:53","edited":"2014-12-20T21:17:50","desc":"undefined"} +(387){"name":"Barriss Offee","height":"16600","hair_color":"black","skin_color":"yellow","eye_color":"blue","birth_year":"40BBY","gender":"female","homeworld":~137,"films":[~150],"species":[~180],"vehicles":[],"starships":[],"created":"2014-12-20T16:46:40","edited":"2014-12-20T21:17:50","desc":"undefined"} +(381){"name":"Dormé","height":"16500","hair_color":"brown","skin_color":"light","eye_color":"brown","birth_year":"unknown","gender":"female","homeworld":~94,"films":[~150],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-20T16:49:14","edited":"2014-12-20T21:17:50","desc":"undefined"} +(1042){"name":"Dooku","height":"19300","hair_color":"white","skin_color":"fair","eye_color":"brown","birth_year":"102BBY","gender":"male","homeworld":~138,"films":[~150,~152],"species":[~191],"vehicles":[~229],"starships":[],"created":"2014-12-20T16:52:14","edited":"2014-12-20T21:17:50","desc":"Count Dooku is a fictional character from the Star Wars franchise, appearing in Star Wars: Episode II – Attack of the Clones and Star Wars: Episode III – Revenge of the Sith (portrayed by Christopher Lee).[1] He was also voiced by Corey Burton in the animated series Star Wars: The Clone Wars and Star Wars: Clone Wars.\nOnce a respected Jedi Master, he falls to the dark side of the Force after the death of his former Padawan, Qui-Gon Jinn, and becomes Darth Sidious' second apprentice under the name Darth Tyranus. As the founder of the Confederacy of Independent Systems, he is instrumental in the Clone Wars. Dooku was trained by Yoda as a Padawan learner."} +(760){"name":"Bail Prestor Organa","height":"19100","hair_color":"black","skin_color":"tan","eye_color":"brown","birth_year":"67BBY","gender":"male","homeworld":~88,"films":[~150,~152],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-20T16:53:08","edited":"2014-12-20T21:17:50","desc":"Senator Bail Prestor Organa of Alderaan, is a fictional character in the Star Wars franchise, portrayed by actor Jimmy Smits in Attack of the Clones (2002), Revenge of the Sith (2005), and Rogue One (2016). He is the senator from the planet Alderaan, one of the founding members of the Rebel Alliance, and the adoptive father of Leia Organa, a main character in the franchise."} +(1155){"name":"Jango Fett","height":"18300","hair_color":"black","skin_color":"tan","eye_color":"brown","birth_year":"66BBY","gender":"male","homeworld":~139,"films":[~150],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-20T16:54:41","edited":"2014-12-20T21:17:50","desc":"Jango Fett is a fictional character in the Star Wars franchise, created by George Lucas. He made his debut in the 2002 film Star Wars: Episode II – Attack of the Clones, where he was portrayed by actor Temuera Morrison.\nIn the context of the Star Wars universe, Jango Fett was regarded as the best mercenary in the galaxy during the final years of the Republic. A naturally skilled warrior, he was eventually chosen to serve as the genetic template for the Clone Army of the Galactic Republic. These clone soldiers were genetically modified to be predisposed toward unquestioning obedience to the chain of command, unlike their highly independent progenitor. Jango was also the \"father\" of unaltered clone Boba Fett, which he requested as part of his contract with the Kaminoans."} +(406){"name":"Zam Wesell","height":"16800","hair_color":"blonde","skin_color":"fair, green, yellow","eye_color":"yellow","birth_year":"unknown","gender":"female","homeworld":~140,"films":[~150],"species":[~181],"vehicles":[~214],"starships":[],"created":"2014-12-20T16:57:44","edited":"2014-12-20T21:17:50","desc":"undefined"} +(389){"name":"Dexter Jettster","height":"19800","hair_color":"none","skin_color":"brown","eye_color":"yellow","birth_year":"unknown","gender":"male","homeworld":~141,"films":[~150],"species":[~182],"vehicles":[],"starships":[],"created":"2014-12-20T17:28:27","edited":"2014-12-20T21:17:50","desc":"undefined"} +(378){"name":"Lama Su","height":"22900","hair_color":"none","skin_color":"grey","eye_color":"black","birth_year":"unknown","gender":"male","homeworld":~96,"films":[~150],"species":[~183],"vehicles":[],"starships":[],"created":"2014-12-20T17:30:50","edited":"2014-12-20T21:17:50","desc":"undefined"} +(380){"name":"Taun We","height":"21300","hair_color":"none","skin_color":"grey","eye_color":"black","birth_year":"unknown","gender":"female","homeworld":~96,"films":[~150],"species":[~183],"vehicles":[],"starships":[],"created":"2014-12-20T17:31:21","edited":"2014-12-20T21:17:50","desc":"undefined"} +(383){"name":"Jocasta Nu","height":"16700","hair_color":"white","skin_color":"fair","eye_color":"blue","birth_year":"unknown","gender":"female","homeworld":~95,"films":[~150],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-20T17:32:51","edited":"2014-12-20T21:17:50","desc":"undefined"} +(392){"name":"Ratts Tyerell","height":"7900","hair_color":"none","skin_color":"grey, blue","eye_color":"unknown","birth_year":"unknown","gender":"male","homeworld":~124,"films":[~151],"species":[~167],"vehicles":[],"starships":[],"created":"2014-12-20T09:53:15","edited":"2016-06-30T12:52:19","desc":"undefined"} +(391){"name":"R4-P17","height":"9600","hair_color":"none","skin_color":"silver, red","eye_color":"red, blue","birth_year":"unknown","gender":"female","homeworld":~114,"films":[~150,~152],"species":[],"vehicles":[],"starships":[],"created":"2014-12-20T17:43:36","edited":"2014-12-20T21:17:50","desc":"undefined"} +(391){"name":"Wat Tambor","height":"19300","hair_color":"none","skin_color":"green, grey","eye_color":"unknown","birth_year":"unknown","gender":"male","homeworld":~142,"films":[~150],"species":[~184],"vehicles":[],"starships":[],"created":"2014-12-20T17:53:52","edited":"2014-12-20T21:17:50","desc":"undefined"} +(379){"name":"San Hill","height":"19100","hair_color":"none","skin_color":"grey","eye_color":"gold","birth_year":"unknown","gender":"male","homeworld":~143,"films":[~150],"species":[~185],"vehicles":[],"starships":[],"created":"2014-12-20T17:58:17","edited":"2014-12-20T21:17:50","desc":"undefined"} +(399){"name":"Shaak Ti","height":"17800","hair_color":"none","skin_color":"red, blue, white","eye_color":"black","birth_year":"unknown","gender":"female","homeworld":~144,"films":[~150,~152],"species":[~186],"vehicles":[],"starships":[],"created":"2014-12-20T18:44:01","edited":"2014-12-20T21:17:50","desc":"undefined"} +(890){"name":"Grievous","height":"21600","hair_color":"none","skin_color":"brown, white","eye_color":"green, yellow","birth_year":"unknown","gender":"male","homeworld":~145,"films":[~152],"species":[~187],"vehicles":[~218],"starships":[~266],"created":"2014-12-20T19:43:53","edited":"2014-12-20T21:17:50","desc":"General Grievous is a fictional character in the Star Wars franchise. A former Kaleesh warlord named Qymaen jai Sheelal, he is the Supreme Commander of the Confederacy of Independent Systems during the Clone Wars against the Galactic Republic and is trained in all lightsaber combat forms to ensure the Jedi's destruction.\nThe character was originally introduced in 2004 in the animated series Star Wars: Clone Wars, before being part of the film Star Wars: Episode III – Revenge of the Sith."} +(380){"name":"Tarfful","height":"23400","hair_color":"brown","skin_color":"brown","eye_color":"blue","birth_year":"unknown","gender":"male","homeworld":~100,"films":[~152],"species":[~189],"vehicles":[],"starships":[],"created":"2014-12-20T19:46:34","edited":"2014-12-20T21:17:50","desc":"undefined"} +(393){"name":"Raymus Antilles","height":"18800","hair_color":"brown","skin_color":"light","eye_color":"brown","birth_year":"unknown","gender":"male","homeworld":~88,"films":[~149,~152],"species":[~191],"vehicles":[],"starships":[],"created":"2014-12-20T19:49:35","edited":"2014-12-20T21:17:50","desc":"undefined"} +(384){"name":"Sly Moore","height":"17800","hair_color":"none","skin_color":"pale","eye_color":"white","birth_year":"unknown","gender":"female","homeworld":~146,"films":[~150,~152],"species":[],"vehicles":[],"starships":[],"created":"2014-12-20T20:18:37","edited":"2014-12-20T21:17:50","desc":"undefined"} +(381){"name":"Tion Medon","height":"20600","hair_color":"none","skin_color":"grey","eye_color":"black","birth_year":"unknown","gender":"male","homeworld":~98,"films":[~152],"species":[~188],"vehicles":[],"starships":[],"created":"2014-12-20T20:35:04","edited":"2014-12-20T21:17:50","desc":"undefined"} +(750){"name":"Finn","height":null,"hair_color":"black","skin_color":"dark","eye_color":"dark","birth_year":"unknown","gender":"male","homeworld":~114,"films":[~155],"species":[~191],"vehicles":[],"starships":[],"created":"2015-04-17T06:52:40","edited":"2015-04-17T06:52:40","desc":"Finn, designation number FN-2187, is a fictional character in the Star Wars franchise. He first appeared in the 2015 film Star Wars: The Force Awakens in which he is a stormtrooper for the First Order who flees and turns against it after being shocked by their cruelty in his first combat mission. He is played by British actor John Boyega, who will reprise the role in Star Wars: The Last Jedi."} +(367){"name":"Rey","height":null,"hair_color":"brown","skin_color":"light","eye_color":"hazel","birth_year":"unknown","gender":"female","homeworld":~114,"films":[~155],"species":[~191],"vehicles":[],"starships":[],"created":"2015-04-17T06:54:01","edited":"2015-04-17T06:54:01","desc":"undefined"} +(1111){"name":"Poe Dameron","height":null,"hair_color":"brown","skin_color":"light","eye_color":"brown","birth_year":"unknown","gender":"male","homeworld":~114,"films":[~155],"species":[~191],"vehicles":[],"starships":[~256],"created":"2015-04-17T06:55:21","edited":"2015-04-17T06:55:21","desc":"Poe Dameron is a fictional character in the Star Wars franchise. Introduced in the 2015 film Star Wars: The Force Awakens, he is portrayed by Oscar Isaac. Poe is an X-wing fighter pilot for the Resistance who inadvertently brings renegade stormtrooper Finn (John Boyega) and Jakku scavenger Rey (Daisy Ridley) into the fight against—and eventually a victory over—the sinister First Order. He is featured in The Force Awakens media and merchandising as well as an eponymous comic book series, and will appear in the film's forthcoming sequel, Star Wars: The Last Jedi. Isaac and the character have received positive reviews, with Poe being compared to the characterization of Han Solo (Harrison Ford) in the original Star Wars film trilogy."} +(604){"name":"BB8","height":null,"hair_color":"none","skin_color":"none","eye_color":"black","birth_year":"unknown","gender":"none","homeworld":~114,"films":[~155],"species":[~190],"vehicles":[],"starships":[],"created":"2015-04-17T06:57:38","edited":"2015-04-17T06:57:38","desc":"BB-8 (or Beebee-Ate) is a droid character in the Star Wars franchise, first appearing in the 2015 film Star Wars: The Force Awakens. Spherical with a free-moving domed head, BB-8 is portrayed by both a rod puppet and a remote-controlled robotic unit."} +(1421){"name":"Captain Phasma","height":null,"hair_color":"unknown","skin_color":"unknown","eye_color":"unknown","birth_year":"unknown","gender":"female","homeworld":~114,"films":[~155],"species":[],"vehicles":[],"starships":[],"created":"2015-10-13T10:35:39","edited":"2015-10-13T10:35:39","desc":"Captain Phasma is a fictional character in the Star Wars franchise, portrayed by Gwendoline Christie. Introduced in Star Wars: The Force Awakens (2015), the first film in the Star Wars sequel trilogy, Phasma is the commander of the First Order's force of stormtroopers. Christie confirmed that the character would reappear in the next of the trilogy's films, Star Wars: The Last Jedi. The character also made an additional appearance in Before the Awakening, an anthology book set before the events of The Force Awakens.\nJ. J. Abrams created Phasma from an armor design originally developed for Kylo Ren and named her after the 1979 horror film Phantasm. The character was originally conceived as male before being changed to female. Phasma appeared prominently in promotion and marketing for The Force Awakens, but the character's ultimately minor role in the film was the subject of criticism. Nonetheless, merchandise featuring the character found success and her figure was the bestselling of all Force Awakens action figures on Amazon.co.uk.[3]"} +(1004){"name":"Padmé Amidala","height":"16500","hair_color":"brown","skin_color":"light","eye_color":"brown","birth_year":"46BBY","gender":"female","homeworld":~94,"films":[~150,~151,~152],"species":[~191],"vehicles":[],"starships":[~252,~262,~246],"created":"2014-12-19T17:28:26","edited":"2016-04-20T17:06:31","desc":"Padmé Amidala (born Padmé Naberrie) is a fictional character in the Star Wars franchise, appearing in the prequel trilogy portrayed by actress Natalie Portman. She served as the Princess of Theed and later Queen of Naboo. After her reign, she became a senator in the Galactic Senate, an anti-war movement spokesperson, and co-founder of the opposition-faction that later emerged as the Rebel Alliance.[2] She was secretly married to the Jedi Anakin Skywalker, and the biological mother of Luke Skywalker and Leia Organa, which makes her the mother-in-law of Han Solo, and the grandmother of Kylo Ren."} +(839){"rotation_period":24,"diameter":364,"climate":"temperate","gravity":"1 standard","terrain":["grasslands","mountains"],"surface_water":40,"population":2000000000,"residents":[~5,~65,~79],"films":[~152,~149],"created":"2014-12-10T11:35:48","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/2/","desc":"Alderaan is a fictional planet featured in the Star Wars space opera franchise. It is blue-green in appearance and is depicted as a terrestrial planet with humanoid inhabitants. It is the home of Princess Leia, one of the lead characters in the film series. In the original 1977 film, Star Wars, Alderaan is blown up by the Death Star, a giant space station capable of destroying entire planets.[2]"} +(1240){"rotation_period":24,"diameter":4818,"climate":"temperate, tropical","gravity":"1 standard","terrain":["jungle","rainforests"],"surface_water":8,"population":1000,"residents":[],"films":[~149],"created":"2014-12-10T11:37:19","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/3/","desc":"Yavin (also known as Yavin Prime) is a fictional planet in the Star Wars universe. It first appeared in the 1977 film Star Wars and is depicted as a large red gas giant with an extensive satellite system of moons. Within the Star Wars narrative, Yavin is noted as the hidden military base of the Rebel Alliance located on its fourth moon, known as Yavin IV.\nThe climactic space battle at the end of the film, in which the Rebel Alliance destroys the Death Star, takes place in orbit around the planet Yavin. In Star Wars fandom and the Star Wars expanded universe, this event is especially significant as it is used to mark an epoch in the fictional Star Wars universe. Events in Star Wars stories are typically dated in terms of years BBY (Before the Battle of Yavin) or ABY (After the Battle of Yavin).[1][2]"} +(615){"rotation_period":23,"diameter":549,"climate":"frozen","gravity":"1.1 standard","terrain":["tundra","ice caves","mountain ranges"],"surface_water":100,"population":null,"residents":[],"films":[~154],"created":"2014-12-10T11:39:13","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/4/","desc":"Hoth is an ice planet in the Star Wars fictional universe. It first appeared in the 1980 film The Empire Strikes Back and has also been a setting in Star Wars books and video games."} +(814){"rotation_period":23,"diameter":341,"climate":"murky","gravity":"N/A","terrain":["swamp","jungles"],"surface_water":8,"population":null,"residents":[],"films":[~152,~153,~154],"created":"2014-12-10T11:42:22","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/5/","desc":"Dagobah is a star system in the Star Wars films The Empire Strikes Back and Return of the Jedi. It also appears in a deleted scene from Revenge of the Sith. Yoda went into exile on Dagobah after a lightsaber battle with Darth Sidious.\nThe planet shown in Dagobah, in the Sluis sector, is a world of murky swamps, steaming bayous, and petrified forests, resembling Earth during the Carboniferous Period."} +(800){"rotation_period":12,"diameter":5110,"climate":"temperate","gravity":"1.5 (surface), 1 standard (Cloud City)","terrain":["gas giant"],"surface_water":0,"population":6000000,"residents":[~25],"films":[~154],"created":"2014-12-10T11:43:55","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/6/","desc":"Bespin is a fictional planet, a gas giant in Star Wars films and books. The planet was first seen in the 1980 feature film The Empire Strikes Back. Since its introduction, Bespin has gained more specific characteristics in the Star Wars expanded universe.\nIn The Empire Strikes Back, Bespin's floating city Cloud City hovers suspended by an anti-gravity pod."} +(579){"rotation_period":18,"diameter":402,"climate":"temperate","gravity":"0.85 standard","terrain":["forests","mountains","lakes"],"surface_water":8,"population":30000000,"residents":[~29],"films":[~153],"created":"2014-12-10T11:50:29","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/7/","desc":"Endor is a planet in the Star Wars universe best known for its moon, known as the sanctuary moon, a forested world (moon) covered by giant trees."} +(1727){"rotation_period":26,"diameter":312,"climate":"temperate","gravity":"1 standard","terrain":["grassy hills","swamps","forests","mountains"],"surface_water":12,"population":4500000000,"residents":[~3,~20,~34,~35,~36,~37,~40,~57,~58,~63,~87],"films":[~150,~151,~152,~153],"created":"2014-12-10T11:52:31","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/8/","desc":"Naboo is a planet in the fictional Star Wars universe with a mostly green terrain and which is the homeworld of two societies: the Gungans who dwell in underwater cities and the humans who live in colonies on the surface. Humans of Naboo have an electoral monarchy and maintain a peaceful culture that defends education, the arts, environmental protection and scientific achievements. The main capital of Naboo is Theed.\nLocated in the Chommell sector, Naboo is the home planet of Padmé Amidala and Jar Jar Binks, as well as Senator (later Supreme Chancellor and then Emperor) Palpatine. In Star Wars: Episode I – The Phantom Menace, it was the site of a blockade by the Trade Federation and the Battle of Naboo between the Federation and the native inhabitants. Naboo is seen in four films in the Star Wars series, having a prominent role in the first two prequels and glimpsed briefly in Revenge of the Sith and the 2004 DVD release of Return of the Jedi.\nTheed's architecture, while referencing Ancient Rome and other classical traditions, was heavily inspired by the Frank Lloyd Wright-designed Marin County Civic Center in California. (Skywalker Ranch and Industrial Light & Magic are both based in Marin County.)"} +(2393){"rotation_period":24,"diameter":368,"climate":"temperate","gravity":"1 standard","terrain":["cityscape","mountains"],"surface_water":null,"population":1000000000000,"residents":[~33,~52,~71],"films":[~150,~151,~152,~153],"created":"2014-12-10T11:54:13","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/9/","desc":"Coruscant /ˈkɒrəsɑːnt/[2] is a planet in the fictional Star Wars universe. It first appeared onscreen in the 1997 Special Edition of Return of the Jedi, but was first mentioned in Timothy Zahn's 1991 novel Heir to the Empire. A city occupying an entire planet, it was renamed Imperial Center during the reign of the Galactic Empire (as depicted in the original films) and Yuuzhan'tar during the Yuuzhan Vong invasion (as depicted in the New Jedi Order novel series). The demonym and adjective form of the planet name is Coruscanti.\nCoruscant is, at various times, the capital of the Old Republic, the Galactic Empire, the New Republic, the Yuuzhan Vong Empire and the Galactic Alliance. Not only is Coruscant central to all these governing bodies, it is the navigational center of the galaxy, given that its hyperspace coordinates are (0,0,0). Due to its location and large population, roughly 2 trillion sentients, the galaxy's main trade routes — Perlemian Trade Route, Hydian Way, Corellian Run and Corellian Trade Spine — go through Coruscant, making it the richest and most influential world in the Star Wars galaxy. Coruscant is the sixth planet out of 11 planets in the Coruscant solar system, and has four moons; Centax-1, Centax-2, Centax-3, and Hesperidium.\nThe Galactic Standard Calendar was the standard measurement of time in the Star Wars galaxy. It centered on the Coruscant tropical year. The Coruscant solar cycle was 368 days long; with a day consisting of 360 NET degrees (or 24 standard hours).[3] Numerous epochs were used to determine calendar eras. The most recent of these calendar eras used the Battle of Yavin (i.e. the destruction of the first Death Star) as its epoch, or \"year zero\": BBY (Before the Battle of Yavin), and ABY (After the Battle of Yavin).[4] The earliest date in the Star Wars expanded universe as a whole is 13,000,000,000 BBY, which serves as the year the universe was created."} +(432){"rotation_period":27,"diameter":463,"climate":"temperate","gravity":"1 standard","terrain":["ocean"],"surface_water":100,"population":1000000000,"residents":[~21,~69,~70],"films":[~150],"created":"2014-12-10T12:45:06","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/10/","desc":"undefined"} +(460){"rotation_period":30,"diameter":256,"climate":"temperate, arid","gravity":"0.9 standard","terrain":["rock","desert","mountain","barren"],"surface_water":5,"population":100000000000,"residents":[~60],"films":[~150],"created":"2014-12-10T12:47:22","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/11/","desc":"undefined"} +(470){"rotation_period":27,"diameter":351,"climate":"temperate, arid, windy","gravity":"1 standard","terrain":["scrublands","savanna","canyons","sinkholes"],"surface_water":0,"population":95000000,"residents":[~81],"films":[~152],"created":"2014-12-10T12:49:01","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/12/","desc":"undefined"} +(446){"rotation_period":36,"diameter":412,"climate":"hot","gravity":"1 standard","terrain":["volcanoes","lava rivers","mountains","caves"],"surface_water":0,"population":20000,"residents":[],"films":[~152],"created":"2014-12-10T12:50:16","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/13/","desc":"undefined"} +(1441){"rotation_period":26,"diameter":381,"climate":"tropical","gravity":"1 standard","terrain":["jungle","forests","lakes","rivers"],"surface_water":60,"population":45000000,"residents":[~13,~78],"films":[~152],"created":"2014-12-10T13:32:00","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/14/","desc":"Kashyyyk (/kəˈʃiːk/ ka-SHEEK, /ˈkæʃɪk/ KASH-ik or /ˌkæˈʃiː.aɪk/ ka-SHEE-ike), also known as Wookiee Planet C, is a fictional planet in the Star Wars universe. It is the tropical, forested home world of the Wookiees. According to interviews given by Star Wars creator George Lucas, the home of the Wookiees was originally intended to be the forest moon of Endor which plays a key role in the plot of the sixth film of the series, Return of the Jedi.[1] However, Lucas decided that since the Wookiee Chewbacca was clearly proficient with advanced technology (i.e. he was pilot and mechanic of the spaceship the Millennium Falcon and he repaired the damaged droid C-3PO), it would be confusing to show the Wookiees with a primitive, \"stone age\" culture on Endor. The Ewoks were created instead to populate the moon and to help fight the Imperial garrison stationed there.[2] Kashyyyk made appearances in the Star Wars Holiday Special and Star Wars: Episode III – Revenge of the Sith."} +(442){"rotation_period":24,"diameter":590,"climate":"artificial temperate ","gravity":"0.56 standard","terrain":["airless asteroid"],"surface_water":0,"population":1000000,"residents":[],"films":[~152],"created":"2014-12-10T13:33:46","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/15/","desc":"undefined"} +(446){"rotation_period":12,"diameter":167,"climate":"frigid","gravity":"1 standard","terrain":["glaciers","mountains","ice canyons"],"surface_water":null,"population":19000000,"residents":[],"films":[~152],"created":"2014-12-10T13:43:39","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/16/","desc":"undefined"} +(432){"rotation_period":34,"diameter":231,"climate":"hot, humid","gravity":"0.75 standard","terrain":["fungus forests"],"surface_water":null,"population":8500000,"residents":[],"films":[~152],"created":"2014-12-10T13:44:50","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/17/","desc":"undefined"} +(467){"rotation_period":25,"diameter":278,"climate":"temperate, moist","gravity":"1 standard","terrain":["mountains","fields","forests","rock arches"],"surface_water":null,"population":10000000,"residents":[~32],"films":[~152],"created":"2014-12-10T13:46:28","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/18/","desc":"undefined"} +(446){"rotation_period":26,"diameter":392,"climate":"hot","gravity":"unknown","terrain":["caves","desert","mountains","volcanoes"],"surface_water":null,"population":1400000000,"residents":[],"films":[~152],"created":"2014-12-10T13:47:46","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/19/","desc":"undefined"} +(418){"rotation_period":null,"diameter":null,"climate":"temperate","gravity":"1 standard","terrain":["grass"],"surface_water":null,"population":null,"residents":[~10],"films":[],"created":"2014-12-10T16:16:26","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/20/","desc":"undefined"} +(425){"rotation_period":24,"diameter":360,"climate":"polluted","gravity":"1 standard","terrain":["cityscape"],"surface_water":null,"population":22000000000,"residents":[~12],"films":[],"created":"2014-12-10T16:26:54","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/21/","desc":"undefined"} +(450){"rotation_period":25,"diameter":329,"climate":"temperate","gravity":"1 standard","terrain":["plains","urban","hills","forests"],"surface_water":70,"population":3000000000,"residents":[~14,~17],"films":[],"created":"2014-12-10T16:49:12","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/22/","desc":"undefined"} +(441){"rotation_period":29,"diameter":305,"climate":"hot","gravity":"1 standard","terrain":["jungles","oceans","urban","swamps"],"surface_water":60,"population":1300000000,"residents":[~15],"films":[],"created":"2014-12-10T17:03:28","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/23/","desc":"undefined"} +(446){"rotation_period":87,"diameter":413,"climate":"temperate","gravity":"1 standard","terrain":["urban","oceans","swamps","bogs"],"surface_water":null,"population":7000000000,"residents":[~16],"films":[],"created":"2014-12-10T17:11:29","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/24/","desc":"undefined"} +(449){"rotation_period":25,"diameter":378,"climate":"temperate","gravity":"1 standard","terrain":["oceans","savannas","mountains","grasslands"],"surface_water":null,"population":1000,"residents":[],"films":[],"created":"2014-12-10T17:23:29","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/25/","desc":"undefined"} +(431){"rotation_period":26,"diameter":680,"climate":"temperate","gravity":"unknown","terrain":["rocky islands","oceans"],"surface_water":98,"population":62000000,"residents":[~18],"films":[],"created":"2014-12-12T11:16:55","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/26/","desc":"undefined"} +(436){"rotation_period":26,"diameter":334,"climate":"temperate","gravity":"1 standard","terrain":["plains","seas","mesas"],"surface_water":10,"population":4000000000,"residents":[],"films":[~154],"created":"2014-12-15T12:23:41","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/27/","desc":"undefined"} +(445){"rotation_period":0,"diameter":0,"climate":"unknown","gravity":"unknown","terrain":["unknown"],"surface_water":null,"population":null,"residents":[~19,~22,~28,~31,~73,~82,~83,~84,~85,~86],"films":[],"created":"2014-12-15T12:25:59","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/28/","desc":"undefined"} +(451){"rotation_period":25,"diameter":371,"climate":"arid","gravity":"0.62 standard","terrain":["mountains","seas","grasslands","deserts"],"surface_water":null,"population":42000000,"residents":[~23],"films":[],"created":"2014-12-15T12:53:47","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/29/","desc":"undefined"} +(429){"rotation_period":20,"diameter":326,"climate":"arid","gravity":"1 standard","terrain":["deserts","mountains"],"surface_water":null,"population":300000000,"residents":[~24],"films":[],"created":"2014-12-15T12:56:31","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/30/","desc":"undefined"} +(431){"rotation_period":21,"diameter":398,"climate":"temperate","gravity":"1","terrain":["oceans","reefs","islands"],"surface_water":100,"population":27000000000,"residents":[~26],"films":[],"created":"2014-12-18T11:07:01","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/31/","desc":"undefined"} +(421){"rotation_period":20,"diameter":368,"climate":"temperate","gravity":"1","terrain":["plains","forests"],"surface_water":40,"population":1200000000,"residents":[~27],"films":[],"created":"2014-12-18T11:11:51","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/32/","desc":"undefined"} +(444){"rotation_period":20,"diameter":263,"climate":"superheated","gravity":"1","terrain":["mountains","volcanoes","rocky deserts"],"surface_water":5,"population":18500000000,"residents":[~30],"films":[],"created":"2014-12-18T11:25:40","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/33/","desc":"undefined"} +(419){"rotation_period":21,"diameter":184,"climate":"temperate","gravity":"1","terrain":["swamps","lakes"],"surface_water":null,"population":11000000,"residents":[~38],"films":[],"created":"2014-12-19T17:47:54","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/34/","desc":"undefined"} +(464){"rotation_period":26,"diameter":201,"climate":"arid, temperate, tropical","gravity":"1.56","terrain":["swamps","deserts","jungles","mountains"],"surface_water":null,"population":2000000000,"residents":[~39],"films":[],"created":"2014-12-19T17:52:13","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/35/","desc":"undefined"} +(431){"rotation_period":24,"diameter":491,"climate":"temperate","gravity":"0.9","terrain":["forests","deserts","savannas"],"surface_water":null,"population":5200,"residents":[~42],"films":[],"created":"2014-12-19T18:00:40","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/36/","desc":"undefined"} +(462){"rotation_period":30,"diameter":305,"climate":"temperate, arid, subartic","gravity":"1","terrain":["mountains","valleys","deserts","tundra"],"surface_water":5,"population":1500000000,"residents":[~43,~44],"films":[],"created":"2014-12-20T09:46:25","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/37/","desc":"undefined"} +(415){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["unknown"],"surface_water":null,"population":null,"residents":[~72],"films":[],"created":"2014-12-20T09:52:23","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/38/","desc":"undefined"} +(427){"rotation_period":22,"diameter":391,"climate":"temperate, artic","gravity":"1","terrain":["urban","barren"],"surface_water":null,"population":421000000,"residents":[~45],"films":[],"created":"2014-12-20T09:56:58","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/39/","desc":"undefined"} +(449){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["desert","tundra","rainforests","mountains"],"surface_water":null,"population":null,"residents":[~46],"films":[],"created":"2014-12-20T10:01:37","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/40/","desc":"undefined"} +(415){"rotation_period":48,"diameter":1770,"climate":"unknown","gravity":"unknown","terrain":["barren","ash"],"surface_water":null,"population":0,"residents":[~47],"films":[],"created":"2014-12-20T10:07:29","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/41/","desc":"undefined"} +(443){"rotation_period":25,"diameter":383,"climate":"temperate","gravity":"0.98","terrain":["toxic cloudsea","plateaus","volcanoes"],"surface_water":null,"population":705300,"residents":[~48],"films":[],"created":"2014-12-20T10:12:28","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/42/","desc":"undefined"} +(411){"rotation_period":27,"diameter":386,"climate":"temperate","gravity":"1","terrain":["verdant"],"surface_water":20,"population":450000000,"residents":[~49],"films":[],"created":"2014-12-20T10:14:48","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/43/","desc":"undefined"} +(445){"rotation_period":33,"diameter":206,"climate":"tropical, temperate","gravity":"1","terrain":["lakes","islands","swamps","seas"],"surface_water":80,"population":500000000,"residents":[~50],"films":[],"created":"2014-12-20T10:18:26","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/44/","desc":"undefined"} +(431){"rotation_period":29,"diameter":413,"climate":"unknown","gravity":"unknown","terrain":["rocky canyons","acid pools"],"surface_water":null,"population":null,"residents":[~51],"films":[],"created":"2014-12-20T10:26:05","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/45/","desc":"undefined"} +(412){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["unknown"],"surface_water":null,"population":null,"residents":[],"films":[],"created":"2014-12-20T10:28:31","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/46/","desc":"undefined"} +(415){"rotation_period":22,"diameter":481,"climate":"arid, rocky, windy","gravity":"1","terrain":["rocky"],"surface_water":null,"population":null,"residents":[~53],"films":[],"created":"2014-12-20T10:31:32","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/47/","desc":"undefined"} +(415){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["unknown"],"surface_water":null,"population":null,"residents":[~54],"films":[],"created":"2014-12-20T10:34:08","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/48/","desc":"undefined"} +(408){"rotation_period":22,"diameter":409,"climate":"temperate","gravity":"1","terrain":["unknown"],"surface_water":null,"population":null,"residents":[~55],"films":[],"created":"2014-12-20T10:48:36","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/49/","desc":"undefined"} +(438){"rotation_period":27,"diameter":318,"climate":"temperate","gravity":"1","terrain":["oceans","rainforests","plateaus"],"surface_water":null,"population":3500000000,"residents":[~56],"films":[],"created":"2014-12-20T10:52:51","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/50/","desc":"undefined"} +(419){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["deserts"],"surface_water":null,"population":null,"residents":[~61,~62],"films":[],"created":"2014-12-20T16:44:46","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/51/","desc":"undefined"} +(440){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["rainforests","rivers","mountains"],"surface_water":null,"population":null,"residents":[~64],"films":[],"created":"2014-12-20T16:52:13","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/52/","desc":"undefined"} +(435){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["jungles","forests","deserts"],"surface_water":null,"population":null,"residents":[~66],"films":[],"created":"2014-12-20T16:54:39","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/53/","desc":"undefined"} +(415){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["unknown"],"surface_water":null,"population":null,"residents":[~67],"films":[],"created":"2014-12-20T16:56:37","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/54/","desc":"undefined"} +(428){"rotation_period":null,"diameter":null,"climate":"frigid","gravity":"unknown","terrain":["oceans","glaciers"],"surface_water":100,"population":500000000,"residents":[~68],"films":[],"created":"2014-12-20T17:27:41","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/55/","desc":"undefined"} +(422){"rotation_period":27,"diameter":384,"climate":"temperate","gravity":"1","terrain":["urban","vines"],"surface_water":null,"population":500000000000,"residents":[~74],"films":[],"created":"2014-12-20T17:50:47","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/56/","desc":"undefined"} +(441){"rotation_period":28,"diameter":412,"climate":"temperate","gravity":"1","terrain":["plains","forests","hills","mountains"],"surface_water":25,"population":5000000000,"residents":[~75],"films":[],"created":"2014-12-20T17:57:47","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/57/","desc":"undefined"} +(438){"rotation_period":null,"diameter":null,"climate":"temperate","gravity":"1","terrain":["cities","savannahs","seas","plains"],"surface_water":null,"population":null,"residents":[~76],"films":[],"created":"2014-12-20T18:43:14","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/58/","desc":"undefined"} +(460){"rotation_period":23,"diameter":378,"climate":"arid, temperate, tropical","gravity":"1","terrain":["rainforests","cliffs","canyons","seas"],"surface_water":null,"population":4000000000,"residents":[~77],"films":[],"created":"2014-12-20T19:43:51","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/59/","desc":"undefined"} +(415){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["unknown"],"surface_water":null,"population":null,"residents":[~80],"films":[],"created":"2014-12-20T20:18:36","edited":"2014-12-20T20:58:18","url":"http://swapi.co/api/planets/60/","desc":"undefined"} +(1102){"rotation_period":23,"diameter":304,"climate":"arid","gravity":"1 standard","terrain":["desert"],"surface_water":1,"population":200000,"residents":[~1,~2,~4,~6,~7,~8,~9,~11,~41,~59],"films":[~150,~151,~152,~153,~149],"created":"2014-12-09T13:50:49","edited":"2014-12-21T20:48:04","url":"http://swapi.co/api/planets/1/","desc":"Tatooine /ˌtætuːˈiːn/ is a fictional desert planet that appears in the Star Wars space opera franchise. It is beige-coloured and is depicted as a remote, desolate world orbiting a pair of binary stars, and inhabited by human settlers and a variety of other life forms. The planet was first seen in the original 1977 film Star Wars, and has to date featured in a total five Star Wars theatrical films.\nIt is noted as the homeworld of the protagonist of the Star Wars saga, Luke Skywalker, and also of his father, Anakin Skywalker. Shots of the binary sunset over the Tatooine desert are considered to be an iconic image of the film series.[1][2]"} +(807){"rotation_period":null,"diameter":null,"climate":"unknown","gravity":"unknown","terrain":["deserts"],"surface_water":null,"population":null,"residents":[],"films":[~155],"created":"2015-04-17T06:55:57","edited":"2015-04-17T06:55:57","url":"http://swapi.co/api/planets/61/","desc":"Jakku is a fictional desert planet first featured in the 2015 Star Wars film The Force Awakens. Remote, lawless, and inhospitable, it is the homeworld of main character Rey, played by Daisy Ridley. The film focuses on two distinct localities, Tuanul Village and Niima Outpost, near a starship graveyard.\nThe planet is also depicted in the 2017 Chuck Wendig novel, Star Wars: Aftermath: Empire's End."} +(4080){"title":"A New Hope","episode_id":4,"opening_crawl":"It is a period of civil war.\r\nRebel spaceships, striking\r\nfrom a hidden base, have won\r\ntheir first victory against\r\nthe evil Galactic Empire.\r\n\r\nDuring the battle, Rebel\r\nspies managed to steal secret\r\nplans to the Empire's\r\nultimate weapon, the DEATH\r\nSTAR, an armored space\r\nstation with enough power\r\nto destroy an entire planet.\r\n\r\nPursued by the Empire's\r\nsinister agents, Princess\r\nLeia races home aboard her\r\nstarship, custodian of the\r\nstolen plans that can save her\r\npeople and restore\r\nfreedom to the galaxy....","director":"George Lucas","producer":"Gary Kurtz, Rick McCallum","release_date":"1977-05-25","charachters":[~1,~2,~3,~4,~5,~6,~7,~8,~9,~10,~12,~13,~14,~15,~16,~17,~18,~79],"planets":[~88,~89,~147],"starships":[~268,~253,~232,~233,~234,~235,~236,~237],"vehicles":[~193,~194,~195,~196],"species":[~156,~189,~190,~191,~192],"created":"2014-12-10T14:23:31","edited":"2015-04-11T09:46:52","url":"http://swapi.co/api/films/1/","desc":"Star Wars (later retitled Star Wars: Episode IV – A New Hope) is a 1977 American epic space opera film written and directed by George Lucas. It is the first film in the original Star Wars trilogy, the first Star Wars movie in general, and the beginning of the Star Wars franchise. Starring Mark Hamill, Harrison Ford, Carrie Fisher, Peter Cushing, Alec Guinness, David Prowse, James Earl Jones, Anthony Daniels, Kenny Baker, and Peter Mayhew, the film's plot focuses on the Rebel Alliance, led by Princess Leia (Fisher), and its attempt to destroy the Galactic Empire's space station, the Death Star. This conflict disrupts the isolated life of farmhand Luke Skywalker (Hamill), who inadvertently acquires a pair of droids that possess stolen architectural plans for the Death Star. When the Empire begins a destructive search for the missing droids, Skywalker accompanies Jedi Master Obi-Wan Kenobi (Guinness) on a mission to return the plans to the Rebel Alliance and rescue Leia from her imprisonment by the Empire.\nStar Wars was released in theatres in the United States on May 25, 1977. It earned $461 million in the U.S. and $314 million overseas, totaling $775 million ($3.132 billion in 2017 dollars, adjusted for inflation). It surpassed Jaws (1975) to become the highest-grossing film of all time until the release of E.T. the Extra-Terrestrial (1982). When adjusted for inflation, Star Wars is the second-highest-grossing film in North America, and the third-highest-grossing film in the world. It received ten Academy Award nominations (including Best Picture), winning seven. It was among the first films to be selected as part of the U.S. Library of Congress' National Film Registry as being \"culturally, historically, or aesthetically significant\". At the time, it was the most recent film on the registry and the only one chosen from the 1970s. Its soundtrack was added to the U.S. National Recording Registry in 2004. Today, it is often regarded as one of the most important films in the history of motion pictures. It launched an industry of tie-in products, including TV series spinoffs, novels, comic books, and video games, and merchandise including toys, games and clothing.\nThe film's success led to two critically and commercially successful sequels, The Empire Strikes Back in 1980 and Return of the Jedi in 1983. Star Wars was reissued multiple times at Lucas' behest, incorporating many changes including modified computer-generated effects, altered dialogue, re-edited shots, remixed soundtracks, and added scenes. A prequel trilogy was released beginning with The Phantom Menace in 1999, continuing with Attack of the Clones in 2002, and concluding with Revenge of the Sith in 2005. The film was followed by a sequel trilogy beginning with The Force Awakens in 2015. A direct prequel, Rogue One, was released in 2016. The film's fourth sequel, The Last Jedi, will be released in December 2017."} +(3546){"title":"Attack of the Clones","episode_id":2,"opening_crawl":"There is unrest in the Galactic\r\nSenate. Several thousand solar\r\nsystems have declared their\r\nintentions to leave the Republic.\r\n\r\nThis separatist movement,\r\nunder the leadership of the\r\nmysterious Count Dooku, has\r\nmade it difficult for the limited\r\nnumber of Jedi Knights to maintain \r\npeace and order in the galaxy.\r\n\r\nSenator Amidala, the former\r\nQueen of Naboo, is returning\r\nto the Galactic Senate to vote\r\non the critical issue of creating\r\nan ARMY OF THE REPUBLIC\r\nto assist the overwhelmed\r\nJedi....","director":"George Lucas","producer":"Rick McCallum","release_date":"2002-05-16","charachters":[~2,~3,~6,~7,~10,~11,~19,~20,~21,~32,~34,~38,~41,~44,~48,~49,~50,~55,~56,~57,~58,~59,~60,~61,~62,~63,~64,~65,~66,~67,~68,~69,~70,~71,~73,~74,~75,~76,~80,~87],"planets":[~94,~95,~96,~97,~147],"starships":[~239,~246,~249,~250,~251,~252,~258,~259,~260],"vehicles":[~193,~213,~214,~215,~216,~217,~227,~228,~229,~230,~231],"species":[~183,~184,~190,~186,~157,~191,~163,~185,~164,~166,~179,~180,~181,~182],"created":"2014-12-20T10:57:57","edited":"2015-04-11T09:45:01","url":"http://swapi.co/api/films/5/","desc":"Star Wars: Episode II – Attack of the Clones is a 2002 American epic space opera film directed by George Lucas and written by Lucas and Jonathan Hales. It is the second installment of the Star Wars prequel trilogy, and stars Ewan McGregor, Natalie Portman, Hayden Christensen, Ian McDiarmid, Samuel L. Jackson, Christopher Lee, Temuera Morrison, Anthony Daniels, Kenny Baker and Frank Oz.\nSet ten years after the events in The Phantom Menace, the galaxy is on the brink of civil war. Led by a former Jedi named Count Dooku, thousands of planetary systems threaten to secede from the Galactic Republic. After Senator Padmé Amidala evades assassination, Jedi apprentice Anakin Skywalker becomes her protector, while his mentor Obi-Wan Kenobi investigates the attempt on Padmé's life. Soon Anakin, Padmé and Obi-Wan witness the onset of a new threat to the galaxy, the Clone Wars.\nDevelopment of Attack of the Clones began in March 2000, after the release of The Phantom Menace. By June 2000, Lucas and Hales completed a draft of the script and principal photography took place from June to September 2000. The film crew primarily shot at Fox Studios Australia in Sydney, Australia, with additional footage filmed in Tunisia, Spain and Italy. It was one of the first motion pictures shot completely on a high-definition digital 24-frame system.\nThe film was released in the United States on May 16, 2002. Some critics hailed it as an improvement over The Phantom Menace, while others called it the worst entry of the franchise.[5][6] The visual effects, costume design, musical score, action scenes and Ewan McGregor’s performance as Obi-Wan Kenobi were all praised, however the romance of Anakin and Padmé, the dialogue and the film's long runtime were all criticized. The film was a financial success, making over $649 million worldwide; however, it also became the first Star Wars film to be outgrossed in its year of release, placing third domestically and fourth internationally. The film was released on VHS and DVD on November 12, 2002 and was later released on Blu-ray on September 16, 2011. Following Attack of the Clones, the third and final film of the prequel trilogy, Revenge of the Sith, premiered in 2005."} +(1289){"title":"The Phantom Menace","episode_id":1,"opening_crawl":"Turmoil has engulfed the\r\nGalactic Republic. The taxation\r\nof trade routes to outlying star\r\nsystems is in dispute.\r\n\r\nHoping to resolve the matter\r\nwith a blockade of deadly\r\nbattleships, the greedy Trade\r\nFederation has stopped all\r\nshipping to the small planet\r\nof Naboo.\r\n\r\nWhile the Congress of the\r\nRepublic endlessly debates\r\nthis alarming chain of events,\r\nthe Supreme Chancellor has\r\nsecretly dispatched two Jedi\r\nKnights, the guardians of\r\npeace and justice in the\r\ngalaxy, to settle the conflict....","director":"George Lucas","producer":"Rick McCallum","release_date":"1999-05-19","charachters":[~2,~3,~10,~11,~16,~19,~20,~31,~32,~33,~34,~35,~36,~37,~38,~39,~40,~41,~42,~44,~45,~46,~47,~48,~49,~50,~51,~52,~53,~54,~55,~56,~72,~87],"planets":[~94,~95,~147],"starships":[~247,~248,~245,~258,~246],"vehicles":[~206,~207,~208,~209,~210,~211,~212],"species":[~191,~190,~157,~162,~163,~164,~165,~166,~167,~168,~169,~170,~171,~172,~173,~174,~175,~176,~177,~178],"created":"2014-12-19T16:52:55","edited":"2015-04-11T09:45:18","url":"http://swapi.co/api/films/4/","desc":"undefined"} +(3860){"title":"Revenge of the Sith","episode_id":3,"opening_crawl":"War! The Republic is crumbling\r\nunder attacks by the ruthless\r\nSith Lord, Count Dooku.\r\nThere are heroes on both sides.\r\nEvil is everywhere.\r\n\r\nIn a stunning move, the\r\nfiendish droid leader, General\r\nGrievous, has swept into the\r\nRepublic capital and kidnapped\r\nChancellor Palpatine, leader of\r\nthe Galactic Senate.\r\n\r\nAs the Separatist Droid Army\r\nattempts to flee the besieged\r\ncapital with their valuable\r\nhostage, two Jedi Knights lead a\r\ndesperate mission to rescue the\r\ncaptive Chancellor....","director":"George Lucas","producer":"Rick McCallum","release_date":"2005-05-19","charachters":[~1,~2,~3,~4,~5,~6,~7,~10,~11,~12,~13,~19,~20,~32,~44,~48,~49,~50,~51,~52,~53,~55,~60,~61,~64,~65,~73,~76,~77,~78,~79,~80,~81,~87],"planets":[~88,~91,~94,~95,~98,~99,~100,~101,~102,~103,~104,~105,~147],"starships":[~251,~254,~255,~258,~261,~262,~263,~264,~265,~266,~267,~268],"vehicles":[~206,~216,~218,~219,~220,~221,~222,~223,~224,~225,~226,~227,~230],"species":[~170,~184,~190,~189,~187,~188,~157,~191,~185,~166,~186,~171,~174,~175,~176,~177,~178,~179,~180,~181],"created":"2014-12-20T18:49:38","edited":"2015-04-11T09:45:44","url":"http://swapi.co/api/films/6/","desc":"Star Wars: Episode III – Revenge of the Sith is a 2005 American epic space opera film written and directed by George Lucas. It is the sixth entry of the Star Wars film series and stars Ewan McGregor, Natalie Portman, Hayden Christensen, Ian McDiarmid, Samuel L. Jackson, Christopher Lee, Anthony Daniels, Kenny Baker, and Frank Oz. A sequel to The Phantom Menace (1999) and Attack of the Clones (2002), the film is the third and final installment of the Star Wars prequel trilogy.\nThe film begins three years after the onset of the Clone Wars. The Jedi Knights are spread across the galaxy, leading a massive war against the Separatists. The Jedi Council dispatches Jedi Master Obi-Wan Kenobi to eliminate the notorious General Grievous, leader of the Separatist Army. Meanwhile, Jedi Knight Anakin Skywalker grows close to Palpatine, the Supreme Chancellor of the Galactic Republic and, unknown to the public, a Sith Lord. Their deepening friendship threatens the Jedi Order, the Republic, and Anakin himself.\nLucas began writing the script before production of Attack of the Clones ended. Production of Revenge of the Sith started in September 2003, and filming took place in Australia with additional locations in Thailand, Switzerland, China, Italy and the United Kingdom. Revenge of the Sith premiered on May 15, 2005, at the Cannes Film Festival, then released worldwide on May 19, 2005. The film received generally positive reviews from critics, especially in contrast to the less positive reviews of the previous two prequels, including praise for its storyline, action scenes, John Williams' musical score, visual effects, and performances from Ewan McGregor, Ian McDiarmid, Frank Oz, and Jimmy Smits. It is the final film in the Star Wars franchise to be distributed by 20th Century Fox before The Walt Disney Company's acquisition of Lucasfilm in 2012.\nRevenge of the Sith broke several box office records during its opening week and went on to earn over $848 million worldwide,[4] making it, at the time, the third-highest-grossing film in the Star Wars franchise, unadjusted for inflation. It was the highest-grossing film of 2005 in the U.S. and the second-highest-grossing film of 2005 behind Harry Potter and the Goblet of Fire.[4] The film also holds the record for the highest opening day gross on a Thursday, making $50,013,859.00.[5] The Star Wars saga continued with the release of The Force Awakens, the first installment of the sequel trilogy, in 2015.[6][7]"} +(3623){"title":"Return of the Jedi","episode_id":6,"opening_crawl":"Luke Skywalker has returned to\r\nhis home planet of Tatooine in\r\nan attempt to rescue his\r\nfriend Han Solo from the\r\nclutches of the vile gangster\r\nJabba the Hutt.\r\n\r\nLittle does Luke know that the\r\nGALACTIC EMPIRE has secretly\r\nbegun construction on a new\r\narmored space station even\r\nmore powerful than the first\r\ndreaded Death Star.\r\n\r\nWhen completed, this ultimate\r\nweapon will spell certain doom\r\nfor the small band of rebels\r\nstruggling to restore freedom\r\nto the galaxy...","director":"Richard Marquand","producer":"Howard G. Kazanjian, George Lucas, Rick McCallum","release_date":"1983-05-25","charachters":[~1,~2,~3,~4,~5,~10,~13,~14,~16,~17,~19,~20,~21,~24,~26,~27,~28,~29,~30,~43],"planets":[~91,~93,~94,~95,~147],"starships":[~234,~235,~236,~238,~240,~241,~242,~243,~244,~253,~257,~268],"vehicles":[~196,~198,~199,~200,~202,~203,~204,~205],"species":[~156,~157,~159,~160,~161,~166,~189,~190,~191],"created":"2014-12-18T10:39:33","edited":"2015-04-11T09:46:05","url":"http://swapi.co/api/films/3/","desc":"Return of the Jedi (also known as Star Wars: Episode VI – Return of the Jedi) is a 1983 American epic space opera film directed by Richard Marquand. The screenplay by Lawrence Kasdan and George Lucas was from a story by Lucas, who was also the executive producer. It is the third installment in the original Star Wars trilogy and the first film to use THX technology. The film is set one year after The Empire Strikes Back[9] and was produced by Howard Kazanjian for Lucasfilm Ltd. The film stars Mark Hamill, Harrison Ford, Carrie Fisher, Billy Dee Williams, Anthony Daniels, David Prowse, Kenny Baker, Peter Mayhew and Frank Oz.\nThe Galactic Empire, under the direction of the ruthless Emperor, is constructing a second Death Star in order to crush the Rebel Alliance once and for all. Since the Emperor plans to personally oversee the final stages of its construction, the Rebel Fleet launches a full-scale attack on the Death Star in order to prevent its completion and kill the Emperor, effectively bringing an end to the Empire's hold over the galaxy. Meanwhile, Luke Skywalker, a Jedi apprentice, struggles to bring his father Darth Vader back to the Light Side of the Force.\nDavid Lynch and David Cronenberg were considered to direct the project before Marquand signed on as director. The production team relied on Lucas' storyboards during pre-production. While writing the shooting script, Lucas, Kasdan, Marquand, and producer Howard Kazanjian spent two weeks in conference discussing ideas to construct it. Kazanjian's schedule pushed shooting to begin a few weeks early to allow Industrial Light & Magic more time to work on the film's effects in post-production. Filming took place in England, California, and Arizona from January to May 1982 (1982-05). Strict secrecy surrounded the production and the film used the working title Blue Harvest to prevent price gouging.\nThe film was released in theaters on May 25, 1983, six years to the day after the release of the first film, receiving mostly positive reviews. The film grossed between $475 million[6][7] and $572 million worldwide.[8] Several home video and theatrical releases and revisions to the film followed over the next 20 years. Star Wars continued with The Phantom Menace as part of the film series' prequel trilogy.\nA sequel, The Force Awakens, was released on December 18, 2015, as part of the new sequel trilogy.[10]"} +(3190){"title":"The Empire Strikes Back","episode_id":5,"opening_crawl":"It is a dark time for the\r\nRebellion. Although the Death\r\nStar has been destroyed,\r\nImperial troops have driven the\r\nRebel forces from their hidden\r\nbase and pursued them across\r\nthe galaxy.\r\n\r\nEvading the dreaded Imperial\r\nStarfleet, a group of freedom\r\nfighters led by Luke Skywalker\r\nhas established a new secret\r\nbase on the remote ice world\r\nof Hoth.\r\n\r\nThe evil lord Darth Vader,\r\nobsessed with finding young\r\nSkywalker, has dispatched\r\nthousands of remote probes into\r\nthe far reaches of space....","director":"Irvin Kershner","producer":"Gary Kutz, Rick McCallum","release_date":"1980-05-17","charachters":[~1,~2,~3,~4,~5,~10,~13,~14,~17,~19,~20,~21,~22,~23,~24,~25],"planets":[~90,~91,~92,~113],"starships":[~234,~235,~236,~238,~239,~240,~241,~253,~257],"vehicles":[~196,~197,~198,~199,~200,~201],"species":[~157,~158,~189,~190,~191],"created":"2014-12-12T11:26:24","edited":"2015-04-11T09:46:31","url":"http://swapi.co/api/films/2/","desc":"The Empire Strikes Back (also known as Star Wars: Episode V – The Empire Strikes Back) is a 1980 American epic space opera film directed by Irvin Kershner. Leigh Brackett and Lawrence Kasdan wrote the screenplay, with George Lucas writing the film's story and serving as executive producer. The second installment in the original Star Wars trilogy, it was produced by Gary Kurtz for Lucasfilm and stars Mark Hamill, Harrison Ford, Carrie Fisher, Billy Dee Williams, Anthony Daniels, David Prowse, Kenny Baker, Peter Mayhew, and Frank Oz.\nThe film is set three years after Star Wars. The Galactic Empire, under the leadership of the villainous Darth Vader and the Emperor, is in pursuit of Luke Skywalker and the rest of the Rebel Alliance. While Vader relentlessly pursues the small band of Luke's friends—Han Solo, Princess Leia Organa, and others—across the galaxy, Luke studies the Force under Jedi Master Yoda. When Vader captures Luke's friends, Luke must decide whether to complete his training and become a full Jedi Knight or to confront Vader and save them.\nFollowing a difficult production, The Empire Strikes Back was released on May 21, 1980. It received mixed reviews from critics initially but has since grown in esteem, becoming the most critically acclaimed chapter in the Star Wars saga; it is now widely regarded as one of the greatest films of all time.[5][6][7][8] The film ranks #3 on Empire's 2008 list of the 500 greatest movies of all time.[9] It became the highest-grossing film of 1980 and, to date, has earned more than $538 million worldwide from its original run and several re-releases. When adjusted for inflation, it is the second-highest-grossing sequel of all time and the 13th-highest-grossing film in North America.[10] The film was followed by Return of the Jedi, which was released in 1983.\nIn 2010, the film was selected for preservation in the United States' National Film Registry by the Library of Congress for being \"culturally, historically, and aesthetically significant.\""} +(3881){"title":"The Force Awakens","episode_id":7,"opening_crawl":"Luke Skywalker has vanished.\r\nIn his absence, the sinister\r\nFIRST ORDER has risen from\r\nthe ashes of the Empire\r\nand will not rest until\r\nSkywalker, the last Jedi,\r\nhas been destroyed.\r\n \r\nWith the support of the\r\nREPUBLIC, General Leia Organa\r\nleads a brave RESISTANCE.\r\nShe is desperate to find her\r\nbrother Luke and gain his\r\nhelp in restoring peace and\r\njustice to the galaxy.\r\n \r\nLeia has sent her most daring\r\npilot on a secret mission\r\nto Jakku, where an old ally\r\nhas discovered a clue to\r\nLuke's whereabouts....","director":"J. J. Abrams","producer":"Kathleen Kennedy, J. J. Abrams, Bryan Burk","release_date":"2015-12-11","charachters":[~1,~3,~5,~13,~14,~26,~82,~83,~84,~85,~86],"planets":[~148],"starships":[~256,~234],"vehicles":[],"species":[~189,~190,~191],"created":"2015-04-17T06:51:30","edited":"2015-12-17T14:31:47","url":"http://swapi.co/api/films/7/","desc":"Star Wars: The Force Awakens (also known as Star Wars: Episode VII – The Force Awakens) is a 2015 American epic space opera film co-written, co-produced and directed by J. J. Abrams. The sequel to 1983's Return of the Jedi, The Force Awakens is the first installment of the Star Wars sequel trilogy. It stars Harrison Ford, Mark Hamill, Carrie Fisher, Adam Driver, Daisy Ridley, John Boyega, Oscar Isaac, Lupita Nyong'o, Andy Serkis, Domhnall Gleeson, Anthony Daniels, Peter Mayhew, and Max von Sydow. Produced by Lucasfilm Ltd. and Abrams' production company Bad Robot Productions and distributed worldwide by Walt Disney Studios Motion Pictures, The Force Awakens was the first Star Wars film not produced by franchise creator George Lucas. Set 30 years after Return of the Jedi, it follows Rey, Finn and Poe Dameron's search for Luke Skywalker and their fight alongside the Resistance, led by veterans of the Rebel Alliance, against Kylo Ren and the First Order, a successor to the Galactic Empire.\nThe Force Awakens was announced after The Walt Disney Company's acquisition of Lucasfilm in October 2012. It was produced by Abrams, his longtime collaborator Bryan Burk, and Lucasfilm president Kathleen Kennedy. Abrams and Lawrence Kasdan, co-writer of the original trilogy films The Empire Strikes Back (1980) and Return of the Jedi (1983), rewrote an initial script by Michael Arndt. John Williams, composer for the previous six films, returned to compose the film's score. Lucas served as creative consultant during the film's early production. Filming began in April 2014 in Abu Dhabi and Iceland, with principal photography also taking place in Ireland and Pinewood Studios in the United Kingdom, and concluded in November 2014. It is the first live-action Star Wars film since Revenge of the Sith (2005).\nStar Wars: The Force Awakens was widely anticipated, and Disney backed the film with extensive marketing campaigns. It premiered in Los Angeles on December 14, 2015, four days before its wide release. The film received positive reviews, with its ensemble cast, direction, musical score, visual effects, and action sequences receiving particular praise, though it received some criticism for being derivative of the original trilogy. The film broke various box office records and became, unadjusted for inflation, the highest-grossing installment in the franchise, the highest-grossing film in North America, and the third-highest-grossing film of all time, with a worldwide gross of over $2 billion and a net profit of over $780 million.[6][7] It received five Academy Award nominations and four British Academy Film Award nominations, where it won Best Special Visual Effects. Two sequels, The Last Jedi and Episode IX, are scheduled for release in 2017 and 2019, respectively."} +(1105){"name":"Hutt","classification":"gastropod","designation":"sentient","averate_height":300,"skin_colors":["green","brown","tan"],"hair_colors":["n/a"],"eye_colors":["yellow","red"],"average_lifespan":1000,"homeworld":~110,"language":"Huttese","films":[~153,~149],"created":"2014-12-10T17:12:50","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/5/","desc":"The Hutts are a fictional alien race in the Star Wars universe. They appear in The Phantom Menace, Return of the Jedi and The Clone Wars, as well as the special edition release of A New Hope. They also appear in various Star Wars games, including those based on the movies, and the Knights of the Old Republic series. None of these are very friendly and all are criminally involved.[1] In the comic book series Tales of the Jedi: Golden Age of the Sith and Tales of the Jedi: The Fall of the Sith Empire, however, there is a Hutt character named Aarrba who is sympathetic to the main characters, Gav and Jori Daragon."} +(539){"name":"Yoda's species","classification":"mammal","designation":"sentient","averate_height":66,"skin_colors":["green","yellow"],"hair_colors":["brown","white"],"eye_colors":["brown","green","yellow"],"average_lifespan":900,"homeworld":~114,"language":"Galactic basic","films":[~150,~151,~152,~153,~154],"created":"2014-12-15T12:27:22","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/6/","desc":"undefined"} +(491){"name":"Trandoshan","classification":"reptile","designation":"sentient","averate_height":200,"skin_colors":["brown","green"],"hair_colors":["none"],"eye_colors":["yellow","orange"],"average_lifespan":null,"homeworld":~115,"language":"Dosh","films":[~154],"created":"2014-12-15T13:07:47","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/7/","desc":"undefined"} +(511){"name":"Mon Calamari","classification":"amphibian","designation":"sentient","averate_height":160,"skin_colors":["red","blue","brown","magenta"],"hair_colors":["none"],"eye_colors":["yellow"],"average_lifespan":null,"homeworld":~117,"language":"Mon Calamarian","films":[~153],"created":"2014-12-18T11:09:52","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/8/","desc":"undefined"} +(995){"name":"Ewok","classification":"mammal","designation":"sentient","averate_height":100,"skin_colors":["brown"],"hair_colors":["white","brown","black"],"eye_colors":["orange","brown"],"average_lifespan":null,"homeworld":~93,"language":"Ewokese","films":[~153],"created":"2014-12-18T11:22:00","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/9/","desc":"Ewoks are a fictional race of small, mammaloid bipeds that appear in the Star Wars universe. They are hunter-gatherers resembling teddy bears that inhabit the forest moon of Endor and live in various arboreal huts and other simple dwellings. They first appeared in the 1983 film Return of the Jedi and have since appeared in two made-for-television films, Caravan of Courage: An Ewok Adventure (1984) and Ewoks: The Battle for Endor (1985), as well as a short-lived animated series and several books and games."} +(477){"name":"Sullustan","classification":"mammal","designation":"sentient","averate_height":180,"skin_colors":["pale"],"hair_colors":["none"],"eye_colors":["black"],"average_lifespan":null,"homeworld":~119,"language":"Sullutese","films":[~153],"created":"2014-12-18T11:26:20","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/10/","desc":"undefined"} +(491){"name":"Neimodian","classification":"unknown","designation":"sentient","averate_height":180,"skin_colors":["grey","green"],"hair_colors":["none"],"eye_colors":["red","pink"],"average_lifespan":null,"homeworld":~104,"language":"Neimoidia","films":[~151],"created":"2014-12-19T17:07:31","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/11/","desc":"undefined"} +(494){"name":"Gungan","classification":"amphibian","designation":"sentient","averate_height":190,"skin_colors":["brown","green"],"hair_colors":["none"],"eye_colors":["orange"],"average_lifespan":null,"homeworld":~94,"language":"Gungan basic","films":[~150,~151],"created":"2014-12-19T17:30:37","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/12/","desc":"undefined"} +(496){"name":"Toydarian","classification":"mammal","designation":"sentient","averate_height":120,"skin_colors":["blue","green","grey"],"hair_colors":["none"],"eye_colors":["yellow"],"average_lifespan":91,"homeworld":~120,"language":"Toydarian","films":[~150,~151],"created":"2014-12-19T17:48:56","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/13/","desc":"undefined"} +(499){"name":"Dug","classification":"mammal","designation":"sentient","averate_height":100,"skin_colors":["brown","purple","grey","red"],"hair_colors":["none"],"eye_colors":["yellow","blue"],"average_lifespan":null,"homeworld":~121,"language":"Dugese","films":[~151],"created":"2014-12-19T17:53:11","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/14/","desc":"undefined"} +(561){"name":"Twi'lek","classification":"mammals","designation":"sentient","averate_height":200,"skin_colors":["orange","yellow","blue","green","pink","purple","tan"],"hair_colors":["none"],"eye_colors":["blue","brown","orange","pink"],"average_lifespan":null,"homeworld":~123,"language":"Twi'leki","films":[~150,~151,~152,~153],"created":"2014-12-20T09:48:02","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/15/","desc":"undefined"} +(478){"name":"Aleena","classification":"reptile","designation":"sentient","averate_height":80,"skin_colors":["blue","gray"],"hair_colors":["none"],"eye_colors":["unknown"],"average_lifespan":79,"homeworld":~124,"language":"Aleena","films":[~151],"created":"2014-12-20T09:53:16","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/16/","desc":"undefined"} +(481){"name":"Vulptereen","classification":"unknown","designation":"sentient","averate_height":100,"skin_colors":["grey"],"hair_colors":["none"],"eye_colors":["yellow"],"average_lifespan":null,"homeworld":~125,"language":"vulpterish","films":[~151],"created":"2014-12-20T09:57:33","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/17/","desc":"undefined"} +(490){"name":"Xexto","classification":"unknown","designation":"sentient","averate_height":125,"skin_colors":["grey","yellow","purple"],"hair_colors":["none"],"eye_colors":["black"],"average_lifespan":null,"homeworld":~126,"language":"Xextese","films":[~151],"created":"2014-12-20T10:02:13","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/18/","desc":"undefined"} +(494){"name":"Toong","classification":"unknown","designation":"sentient","averate_height":200,"skin_colors":["grey","green","yellow"],"hair_colors":["none"],"eye_colors":["orange"],"average_lifespan":null,"homeworld":~127,"language":"Tundan","films":[~151,~152],"created":"2014-12-20T10:08:36","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/19/","desc":"undefined"} +(504){"name":"Cerean","classification":"mammal","designation":"sentient","averate_height":200,"skin_colors":["pale pink"],"hair_colors":["red","blond","black","white"],"eye_colors":["hazel"],"average_lifespan":null,"homeworld":~129,"language":"Cerean","films":[~151,~152],"created":"2014-12-20T10:15:33","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/20/","desc":"undefined"} +(497){"name":"Nautolan","classification":"amphibian","designation":"sentient","averate_height":180,"skin_colors":["green","blue","brown","red"],"hair_colors":["none"],"eye_colors":["black"],"average_lifespan":70,"homeworld":~130,"language":"Nautila","films":[~151],"created":"2014-12-20T10:18:58","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/21/","desc":"undefined"} +(514){"name":"Zabrak","classification":"mammal","designation":"sentient","averate_height":180,"skin_colors":["pale","brown","red","orange","yellow"],"hair_colors":["black"],"eye_colors":["brown","orange"],"average_lifespan":null,"homeworld":~131,"language":"Zabraki","films":[~151],"created":"2014-12-20T10:26:59","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/22/","desc":"undefined"} +(493){"name":"Tholothian","classification":"mammal","designation":"sentient","averate_height":null,"skin_colors":["dark"],"hair_colors":["unknown"],"eye_colors":["blue","indigo"],"average_lifespan":null,"homeworld":~132,"language":"unknown","films":[~151,~152],"created":"2014-12-20T10:29:13","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/23/","desc":"undefined"} +(484){"name":"Iktotchi","classification":"unknown","designation":"sentient","averate_height":180,"skin_colors":["pink"],"hair_colors":["none"],"eye_colors":["orange"],"average_lifespan":null,"homeworld":~133,"language":"Iktotchese","films":[~151,~152],"created":"2014-12-20T10:32:13","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/24/","desc":"undefined"} +(480){"name":"Quermian","classification":"mammal","designation":"sentient","averate_height":240,"skin_colors":["white"],"hair_colors":["none"],"eye_colors":["yellow"],"average_lifespan":86,"homeworld":~134,"language":"Quermian","films":[~151,~152],"created":"2014-12-20T10:34:50","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/25/","desc":"undefined"} +(502){"name":"Kel Dor","classification":"unknown","designation":"sentient","averate_height":180,"skin_colors":["peach","orange","red"],"hair_colors":["none"],"eye_colors":["black","silver"],"average_lifespan":70,"homeworld":~135,"language":"Kel Dor","films":[~151,~152],"created":"2014-12-20T10:49:21","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/26/","desc":"undefined"} +(481){"name":"Chagrian","classification":"amphibian","designation":"sentient","averate_height":190,"skin_colors":["blue"],"hair_colors":["none"],"eye_colors":["blue"],"average_lifespan":null,"homeworld":~136,"language":"Chagria","films":[~151,~152],"created":"2014-12-20T10:53:28","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/27/","desc":"undefined"} +(501){"name":"Geonosian","classification":"insectoid","designation":"sentient","averate_height":178,"skin_colors":["green","brown"],"hair_colors":["none"],"eye_colors":["green","hazel"],"average_lifespan":null,"homeworld":~97,"language":"Geonosian","films":[~150,~152],"created":"2014-12-20T16:40:45","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/28/","desc":"undefined"} +(538){"name":"Mirialan","classification":"mammal","designation":"sentient","averate_height":180,"skin_colors":["yellow","green"],"hair_colors":["black","brown"],"eye_colors":["blue","green","red","yellow","brown","orange"],"average_lifespan":null,"homeworld":~137,"language":"Mirialan","films":[~150,~152],"created":"2014-12-20T16:46:48","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/29/","desc":"undefined"} +(492){"name":"Clawdite","classification":"reptilian","designation":"sentient","averate_height":180,"skin_colors":["green","yellow"],"hair_colors":["none"],"eye_colors":["yellow"],"average_lifespan":70,"homeworld":~140,"language":"Clawdite","films":[~150,~152],"created":"2014-12-20T16:57:46","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/30/","desc":"undefined"} +(478){"name":"Besalisk","classification":"amphibian","designation":"sentient","averate_height":178,"skin_colors":["brown"],"hair_colors":["none"],"eye_colors":["yellow"],"average_lifespan":75,"homeworld":~141,"language":"besalisk","films":[~150],"created":"2014-12-20T17:28:28","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/31/","desc":"undefined"} +(482){"name":"Kaminoan","classification":"amphibian","designation":"sentient","averate_height":220,"skin_colors":["grey","blue"],"hair_colors":["none"],"eye_colors":["black"],"average_lifespan":80,"homeworld":~96,"language":"Kaminoan","films":[~150],"created":"2014-12-20T17:31:24","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/32/","desc":"undefined"} +(489){"name":"Skakoan","classification":"mammal","designation":"sentient","averate_height":null,"skin_colors":["grey","green"],"hair_colors":["none"],"eye_colors":["unknown"],"average_lifespan":null,"homeworld":~142,"language":"Skakoan","films":[~150,~152],"created":"2014-12-20T17:53:54","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/33/","desc":"undefined"} +(479){"name":"Muun","classification":"mammal","designation":"sentient","averate_height":190,"skin_colors":["grey","white"],"hair_colors":["none"],"eye_colors":["black"],"average_lifespan":100,"homeworld":~143,"language":"Muun","films":[~150,~152],"created":"2014-12-20T17:58:19","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/34/","desc":"undefined"} +(555){"name":"Togruta","classification":"mammal","designation":"sentient","averate_height":180,"skin_colors":["red","white","orange","yellow","green","blue"],"hair_colors":["none"],"eye_colors":["red","orange","yellow","green","blue","black"],"average_lifespan":94,"homeworld":~144,"language":"Togruti","films":[~150,~152],"created":"2014-12-20T18:44:03","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/35/","desc":"undefined"} +(489){"name":"Kaleesh","classification":"reptile","designation":"sentient","averate_height":170,"skin_colors":["brown","orange","tan"],"hair_colors":["none"],"eye_colors":["yellow"],"average_lifespan":80,"homeworld":~145,"language":"Kaleesh","films":[~152],"created":"2014-12-20T19:45:42","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/36/","desc":"undefined"} +(470){"name":"Pau'an","classification":"mammal","designation":"sentient","averate_height":190,"skin_colors":["grey"],"hair_colors":["none"],"eye_colors":["black"],"average_lifespan":700,"homeworld":~98,"language":"Utapese","films":[~152],"created":"2014-12-20T20:35:06","edited":"2014-12-20T21:36:42","url":"http://swapi.co/api/species/37/","desc":"undefined"} +(884){"name":"Wookiee","classification":"mammal","designation":"sentient","averate_height":210,"skin_colors":["gray"],"hair_colors":["black","brown"],"eye_colors":["blue","green","yellow","brown","golden","red"],"average_lifespan":400,"homeworld":~100,"language":"Shyriiwook","films":[~155,~152,~153,~154,~149],"created":"2014-12-10T16:44:31","edited":"2015-01-30T21:23:03","url":"http://swapi.co/api/species/3/","desc":"Wookiees (/ˈwʊkiːz/) are a fictional species of intelligent bipeds from the planet Kashyyyk in the Star Wars universe. They are taller, stronger, and hairier than humans and most (if not all) other humanoid species. The most notable Wookiee is Chewbacca, the copilot of Han Solo, who first appeared in the 1977 film Star Wars Episode IV: A New Hope."} +(873){"name":"Droid","classification":"artificial","designation":"sentient","averate_height":null,"skin_colors":["n/a"],"hair_colors":["n/a"],"eye_colors":["n/a"],"average_lifespan":null,"homeworld":null,"language":"n/a","films":[~155,~150,~151,~152,~153,~154,~149],"created":"2014-12-10T15:16:16","edited":"2015-04-17T06:59:43","url":"http://swapi.co/api/species/2/","desc":"A droid is a fictional robot possessing some degree of artificial intelligence in the Star Wars science fiction franchise. Coined by special effects artist John Stears, the term is a clipped form of \"android\",[1] a word originally reserved for robots designed to look and act like a human.[2] The word \"droid\" has been a registered trademark of Lucasfilm Ltd since 1977.[3][4][5][6]"} +(3843){"name":"Human","classification":"mammal","designation":"sentient","averate_height":180,"skin_colors":["caucasian","black","asian","hispanic"],"hair_colors":["blonde","brown","black","red"],"eye_colors":["brown","blue","green","hazel","grey","amber"],"average_lifespan":120,"homeworld":~95,"language":"Galactic Basic","films":[~155,~150,~151,~152,~153,~154,~149],"created":"2014-12-10T13:52:11","edited":"2015-04-17T06:59:55","url":"http://swapi.co/api/species/1/","desc":"Modern humans (Homo sapiens, primarily ssp. Homo sapiens sapiens) are the only extant members of the subtribe Hominina, a branch of the tribe Hominini belonging to the family of great apes. They are characterized by erect posture and bipedal locomotion; high manual dexterity and heavy tool use compared to other animals; and a general trend toward larger, more complex brains and societies.[3][4]\nEarly hominins—particularly the australopithecines, whose brains and anatomy are in many ways more similar to ancestral non-human apes—are less often referred to as \"human\" than hominins of the genus Homo.[5] Several of these hominins used fire, occupied much of Eurasia, and gave rise to anatomically modern Homo sapiens in Africa about 200,000 years ago.[6][7] They began to exhibit evidence of behavioral modernity around 50,000 years ago. In several waves of migration, anatomically modern humans ventured out of Africa and populated most of the world.[8]\nThe spread of humans and their large and increasing population has had a profound impact on large areas of the environment and millions of native species worldwide. Advantages that explain this evolutionary success include a relatively larger brain with a particularly well-developed neocortex, prefrontal cortex and temporal lobes, which enable high levels of abstract reasoning, language, problem solving, sociality, and culture through social learning. Humans use tools to a much higher degree than any other animal, are the only extant species known to build fires and cook their food, and are the only extant species to clothe themselves and create and use numerous other technologies and arts.\nHumans are uniquely adept at using systems of symbolic communication (such as language and art) for self-expression and the exchange of ideas, and for organizing themselves into purposeful groups. Humans create complex social structures composed of many cooperating and competing groups, from families and kinship networks to political states. Social interactions between humans have established an extremely wide variety of values,[9] social norms, and rituals, which together form the basis of human society. Curiosity and the human desire to understand and influence the environment and to explain and manipulate phenomena (or events) has provided the foundation for developing science, philosophy, mythology, religion, anthropology, and numerous other fields of knowledge.\nThough most of human existence has been sustained by hunting and gathering in band societies,[10] increasing numbers of human societies began to practice sedentary agriculture approximately some 10,000 years ago,[11] domesticating plants and animals, thus allowing for the growth of civilization. These human societies subsequently expanded in size, establishing various forms of government, religion, and culture around the world, unifying people within regions to form states and empires. The rapid advancement of scientific and medical understanding in the 19th and 20th centuries led to the development of fuel-driven technologies and increased lifespans, causing the human population to rise exponentially. Today the global human population is estimated by the United Nations to be near 7.6 billion.[12]"} +(487){"name":"Rodian","classification":"sentient","designation":"reptilian","averate_height":170,"skin_colors":["green","blue"],"hair_colors":["n/a"],"eye_colors":["black"],"average_lifespan":null,"homeworld":~109,"language":"Galactic Basic","films":[~149],"created":"2014-12-10T17:05:26","edited":"2016-07-19T13:27:03","url":"http://swapi.co/api/species/4/","desc":"undefined"} +(555){"name":"Sand Crawler","model":"Digger Crawler","manufacturer":"Corellia Mining Corporation","cost":"SWC$150000.0","length":36.8,"max_atmosphering_speed":30,"crew":46,"passengers":30,"cargo_capacity":null,"consumables":"2 months","vehicle_class":"wheeled","pilots":[],"films":[~150,~149],"created":"2014-12-10T15:36:25","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/4/","desc":"undefined"} +(540){"name":"T-16 skyhopper","model":"T-16 skyhopper","manufacturer":"Incom Corporation","cost":"SWC$14500.0","length":10.4,"max_atmosphering_speed":1200,"crew":1,"passengers":1,"cargo_capacity":null,"consumables":"0","vehicle_class":"repulsorcraft","pilots":[],"films":[~149],"created":"2014-12-10T16:01:52","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/6/","desc":"undefined"} +(551){"name":"X-34 landspeeder","model":"X-34 landspeeder","manufacturer":"SoroSuub Corporation","cost":"SWC$10550.0","length":3.4,"max_atmosphering_speed":250,"crew":1,"passengers":1,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"repulsorcraft","pilots":[],"films":[~149],"created":"2014-12-10T16:13:52","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/7/","desc":"undefined"} +(566){"name":"TIE/LN starfighter","model":"Twin Ion Engine/Ln Starfighter","manufacturer":"Sienar Fleet Systems","cost":null,"length":6.4,"max_atmosphering_speed":1200,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"2 days","vehicle_class":"starfighter","pilots":[],"films":[~153,~154,~149],"created":"2014-12-10T16:33:52","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/8/","desc":"undefined"} +(535){"name":"Snowspeeder","model":"t-47 airspeeder","manufacturer":"Incom corporation","cost":null,"length":4.5,"max_atmosphering_speed":650,"crew":2,"passengers":0,"cargo_capacity":null,"consumables":"none","vehicle_class":"airspeeder","pilots":[~1,~17],"films":[~154],"created":"2014-12-15T12:22:12","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/14/","desc":"undefined"} +(1027){"name":"TIE bomber","model":"TIE/sa bomber","manufacturer":"Sienar Fleet Systems","cost":null,"length":7.8,"max_atmosphering_speed":850,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"2 days","vehicle_class":"space/planetary bomber","pilots":[],"films":[~153,~154],"created":"2014-12-15T12:33:15","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/16/","desc":"TIE fighters are fictional starfighters in the Star Wars universe. Propelled by twin ion engines (hence the TIE acronym), TIE fighters are fast, agile, yet fragile starfighters produced by Sienar Fleet Systems for the Galactic Empire. TIE fighters and other TIE craft appear in Star Wars films, television shows, and throughout the Star Wars expanded universe. Several TIE fighter replicas and toys, as well as a TIE flight simulator, have been produced and sold by merchandise companies."} +(1508){"name":"AT-AT","model":"All Terrain Armored Transport","manufacturer":"Kuat Drive Yards, Imperial Department of Military Research","cost":null,"length":20,"max_atmosphering_speed":60,"crew":5,"passengers":40,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"assault walker","pilots":[],"films":[~153,~154],"created":"2014-12-15T12:38:25","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/18/","desc":"Walkers are vehicles from the Star Wars universe that traverse the landscape on mechanical legs. They are used by the Old Republic and the Galactic Empire for ground assault or transport. Throughout the saga, walkers have played a pivotal role in the fate of characters and the outcome of battles. Industrial Light and Magic (ILM) is responsible for their animation and design, often using models, stop-motion animation, and relevant matte paintings to depict their presence in the films.\nThere are a variety of walkers: The Empire Strikes Back introduces the All Terrain Armored Transport (AT-AT) and All Terrain Scout Transport (AT-ST). Star Wars: Episode II – Attack of the Clones and Star Wars: Episode III – Revenge of the Sith introduced earlier models of walkers, such as the AT-TE, and the Star Wars expanded universe features numerous others. Walker variants have been merchandised and featured in popular culture."} +(1496){"name":"AT-ST","model":"All Terrain Scout Transport","manufacturer":"Kuat Drive Yards, Imperial Department of Military Research","cost":null,"length":2,"max_atmosphering_speed":90,"crew":2,"passengers":0,"cargo_capacity":null,"consumables":"none","vehicle_class":"walker","pilots":[~13],"films":[~153,~154],"created":"2014-12-15T12:46:42","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/19/","desc":"Walkers are vehicles from the Star Wars universe that traverse the landscape on mechanical legs. They are used by the Old Republic and the Galactic Empire for ground assault or transport. Throughout the saga, walkers have played a pivotal role in the fate of characters and the outcome of battles. Industrial Light and Magic (ILM) is responsible for their animation and design, often using models, stop-motion animation, and relevant matte paintings to depict their presence in the films.\nThere are a variety of walkers: The Empire Strikes Back introduces the All Terrain Armored Transport (AT-AT) and All Terrain Scout Transport (AT-ST). Star Wars: Episode II – Attack of the Clones and Star Wars: Episode III – Revenge of the Sith introduced earlier models of walkers, such as the AT-TE, and the Star Wars expanded universe features numerous others. Walker variants have been merchandised and featured in popular culture."} +(555){"name":"Storm IV Twin-Pod cloud car","model":"Storm IV Twin-Pod","manufacturer":"Bespin Motors","cost":"SWC$75000.0","length":7,"max_atmosphering_speed":1500,"crew":2,"passengers":0,"cargo_capacity":null,"consumables":"1 day","vehicle_class":"repulsorcraft","pilots":[],"films":[~154],"created":"2014-12-15T12:58:50","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/20/","desc":"undefined"} +(589){"name":"Sail barge","model":"Modified Luxury Sail Barge","manufacturer":"Ubrikkian Industries Custom Vehicle Division","cost":"SWC$285000.0","length":30,"max_atmosphering_speed":100,"crew":26,"passengers":500,"cargo_capacity":null,"consumables":"Live food tanks","vehicle_class":"sail barge","pilots":[],"films":[~153],"created":"2014-12-18T10:44:14","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/24/","desc":"undefined"} +(561){"name":"Bantha-II cargo skiff","model":"Bantha-II","manufacturer":"Ubrikkian Industries","cost":"SWC$8000.0","length":9.5,"max_atmosphering_speed":250,"crew":5,"passengers":16,"cargo_capacity":null,"consumables":"1 day","vehicle_class":"repulsorcraft cargo skiff","pilots":[],"films":[~153],"created":"2014-12-18T10:48:03","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/25/","desc":"undefined"} +(555){"name":"TIE/IN interceptor","model":"Twin Ion Engine Interceptor","manufacturer":"Sienar Fleet Systems","cost":null,"length":9.6,"max_atmosphering_speed":1250,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"2 days","vehicle_class":"starfighter","pilots":[],"films":[~153],"created":"2014-12-18T10:50:28","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/26/","desc":"undefined"} +(557){"name":"Imperial Speeder Bike","model":"74-Z speeder bike","manufacturer":"Aratech Repulsor Company","cost":"SWC$8000.0","length":3,"max_atmosphering_speed":360,"crew":1,"passengers":1,"cargo_capacity":null,"consumables":"1 day","vehicle_class":"speeder","pilots":[~1,~5],"films":[~153],"created":"2014-12-18T11:20:04","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/30/","desc":"undefined"} +(583){"name":"Vulture Droid","model":"Vulture-class droid starfighter","manufacturer":"Haor Chall Engineering, Baktoid Armor Workshop","cost":null,"length":3.5,"max_atmosphering_speed":1200,"crew":0,"passengers":0,"cargo_capacity":null,"consumables":"none","vehicle_class":"starfighter","pilots":[],"films":[~151,~152],"created":"2014-12-19T17:09:53","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/33/","desc":"undefined"} +(566){"name":"Multi-Troop Transport","model":"Multi-Troop Transport","manufacturer":"Baktoid Armor Workshop","cost":"SWC$138000.0","length":31,"max_atmosphering_speed":35,"crew":4,"passengers":112,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"repulsorcraft","pilots":[],"films":[~151],"created":"2014-12-19T17:12:04","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/34/","desc":"undefined"} +(555){"name":"Armored Assault Tank","model":"Armoured Assault Tank","manufacturer":"Baktoid Armor Workshop","cost":null,"length":9.75,"max_atmosphering_speed":55,"crew":4,"passengers":6,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"repulsorcraft","pilots":[],"films":[~151],"created":"2014-12-19T17:13:29","edited":"2014-12-22T18:21:15","url":"http://swapi.co/api/vehicles/35/","desc":"undefined"} +(1075){"name":"Single Trooper Aerial Platform","model":"Single Trooper Aerial Platform","manufacturer":"Baktoid Armor Workshop","cost":"SWC$2500.0","length":2,"max_atmosphering_speed":400,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"none","vehicle_class":"repulsorcraft","pilots":[],"films":[~151],"created":"2014-12-19T17:15:09","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/36/","desc":"Speeder bikes (also known as \"jumpspeeders\" or \"hover bikes\") and swoop bikes (or just \"swoops\") are small, fast transports that use repulsorlift engines in the fictional Star Wars universe. Return of the Jedi includes a prominent speeder bike chase; speeders and swoops also appear in Star Wars: Episode I – The Phantom Menace, Star Wars: Episode II – Attack of the Clones, Star Wars: Episode III – Revenge of the Sith, Star Wars, and the Star Wars expanded universe's books, comics, and games."} +(566){"name":"C-9979 landing craft","model":"C-9979 landing craft","manufacturer":"Haor Chall Engineering","cost":"SWC$200000.0","length":210,"max_atmosphering_speed":587,"crew":140,"passengers":284,"cargo_capacity":null,"consumables":"1 day","vehicle_class":"landing craft","pilots":[],"films":[~151],"created":"2014-12-19T17:20:36","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/37/","desc":"undefined"} +(556){"name":"Tribubble bongo","model":"Tribubble bongo","manufacturer":"Otoh Gunga Bongameken Cooperative","cost":null,"length":15,"max_atmosphering_speed":85,"crew":1,"passengers":2,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"submarine","pilots":[~10,~31],"films":[~151],"created":"2014-12-19T17:37:37","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/38/","desc":"undefined"} +(534){"name":"Sith speeder","model":"FC-20 speeder bike","manufacturer":"Razalon","cost":"SWC$4000.0","length":1.5,"max_atmosphering_speed":180,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"speeder","pilots":[~42],"films":[~151],"created":"2014-12-20T10:09:56","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/42/","desc":"undefined"} +(566){"name":"Zephyr-G swoop bike","model":"Zephyr-G swoop bike","manufacturer":"Mobquet Swoops and Speeders","cost":"SWC$5750.0","length":3.68,"max_atmosphering_speed":350,"crew":1,"passengers":1,"cargo_capacity":null,"consumables":"none","vehicle_class":"repulsorcraft","pilots":[~11],"films":[~150],"created":"2014-12-20T16:24:16","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/44/","desc":"undefined"} +(585){"name":"Koro-2 Exodrive airspeeder","model":"Koro-2 Exodrive airspeeder","manufacturer":"Desler Gizh Outworld Mobility Corporation","cost":null,"length":6.6,"max_atmosphering_speed":800,"crew":1,"passengers":1,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"airspeeder","pilots":[~67],"films":[~150],"created":"2014-12-20T17:17:33","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/45/","desc":"undefined"} +(558){"name":"XJ-6 airspeeder","model":"XJ-6 airspeeder","manufacturer":"Narglatch AirTech prefabricated kit","cost":null,"length":6.23,"max_atmosphering_speed":720,"crew":1,"passengers":1,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"airspeeder","pilots":[~11],"films":[~150],"created":"2014-12-20T17:19:19","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/46/","desc":"undefined"} +(564){"name":"LAAT/i","model":"Low Altitude Assault Transport/infrantry","manufacturer":"Rothana Heavy Engineering","cost":null,"length":17.4,"max_atmosphering_speed":620,"crew":6,"passengers":30,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"gunship","pilots":[],"films":[~150,~152],"created":"2014-12-20T18:01:21","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/50/","desc":"undefined"} +(557){"name":"LAAT/c","model":"Low Altitude Assault Transport/carrier","manufacturer":"Rothana Heavy Engineering","cost":null,"length":28.82,"max_atmosphering_speed":620,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"gunship","pilots":[],"films":[~150],"created":"2014-12-20T18:02:46","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/51/","desc":"undefined"} +(592){"name":"Tsmeu-6 personal wheel bike","model":"Tsmeu-6 personal wheel bike","manufacturer":"Z-Gomot Ternbuell Guppat Corporation","cost":"SWC$15000.0","length":3.5,"max_atmosphering_speed":330,"crew":1,"passengers":1,"cargo_capacity":null,"consumables":"none","vehicle_class":"wheeled walker","pilots":[~77],"films":[~152],"created":"2014-12-20T19:43:54","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/60/","desc":"undefined"} +(557){"name":"Emergency Firespeeder","model":"Fire suppression speeder","manufacturer":"unknown","cost":null,"length":null,"max_atmosphering_speed":null,"crew":2,"passengers":null,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"fire suppression ship","pilots":[],"films":[~152],"created":"2014-12-20T19:50:58","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/62/","desc":"undefined"} +(579){"name":"Droid tri-fighter","model":"tri-fighter","manufacturer":"Colla Designs, Phlac-Arphocc Automata Industries","cost":"SWC$20000.0","length":5.4,"max_atmosphering_speed":1180,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"none","vehicle_class":"droid starfighter","pilots":[],"films":[~152],"created":"2014-12-20T20:05:19","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/67/","desc":"undefined"} +(567){"name":"Oevvaor jet catamaran","model":"Oevvaor jet catamaran","manufacturer":"Appazanna Engineering Works","cost":"SWC$12125.0","length":15.1,"max_atmosphering_speed":420,"crew":2,"passengers":2,"cargo_capacity":null,"consumables":"3 days","vehicle_class":"airspeeder","pilots":[],"films":[~152],"created":"2014-12-20T20:20:53","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/69/","desc":"undefined"} +(575){"name":"Raddaugh Gnasp fluttercraft","model":"Raddaugh Gnasp fluttercraft","manufacturer":"Appazanna Engineering Works","cost":"SWC$14750.0","length":7,"max_atmosphering_speed":310,"crew":2,"passengers":0,"cargo_capacity":null,"consumables":"none","vehicle_class":"air speeder","pilots":[],"films":[~152],"created":"2014-12-20T20:21:55","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/70/","desc":"undefined"} +(557){"name":"Clone turbo tank","model":"HAVw A6 Juggernaut","manufacturer":"Kuat Drive Yards","cost":"SWC$350000.0","length":49.4,"max_atmosphering_speed":160,"crew":20,"passengers":300,"cargo_capacity":null,"consumables":"20 days","vehicle_class":"wheeled walker","pilots":[],"films":[~152],"created":"2014-12-20T20:24:45","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/71/","desc":"undefined"} +(575){"name":"Corporate Alliance tank droid","model":"NR-N99 Persuader-class droid enforcer","manufacturer":"Techno Union","cost":"SWC$49000.0","length":10.96,"max_atmosphering_speed":100,"crew":0,"passengers":4,"cargo_capacity":null,"consumables":"none","vehicle_class":"droid tank","pilots":[],"films":[~152],"created":"2014-12-20T20:26:55","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/72/","desc":"undefined"} +(572){"name":"Droid gunship","model":"HMP droid gunship","manufacturer":"Baktoid Fleet Ordnance, Haor Chall Engineering","cost":"SWC$60000.0","length":12.3,"max_atmosphering_speed":820,"crew":0,"passengers":0,"cargo_capacity":null,"consumables":"none","vehicle_class":"airspeeder","pilots":[],"films":[~152],"created":"2014-12-20T20:32:05","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/73/","desc":"undefined"} +(1458){"name":"AT-RT","model":"All Terrain Recon Transport","manufacturer":"Kuat Drive Yards","cost":"SWC$40000.0","length":3.2,"max_atmosphering_speed":90,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"1 day","vehicle_class":"walker","pilots":[],"films":[~152],"created":"2014-12-20T20:47:49","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/76/","desc":"Walkers are vehicles from the Star Wars universe that traverse the landscape on mechanical legs. They are used by the Old Republic and the Galactic Empire for ground assault or transport. Throughout the saga, walkers have played a pivotal role in the fate of characters and the outcome of battles. Industrial Light and Magic (ILM) is responsible for their animation and design, often using models, stop-motion animation, and relevant matte paintings to depict their presence in the films.\nThere are a variety of walkers: The Empire Strikes Back introduces the All Terrain Armored Transport (AT-AT) and All Terrain Scout Transport (AT-ST). Star Wars: Episode II – Attack of the Clones and Star Wars: Episode III – Revenge of the Sith introduced earlier models of walkers, such as the AT-TE, and the Star Wars expanded universe features numerous others. Walker variants have been merchandised and featured in popular culture."} +(1487){"name":"AT-TE","model":"All Terrain Tactical Enforcer","manufacturer":"Rothana Heavy Engineering, Kuat Drive Yards","cost":null,"length":13.2,"max_atmosphering_speed":60,"crew":6,"passengers":36,"cargo_capacity":null,"consumables":"21 days","vehicle_class":"walker","pilots":[],"films":[~150,~152],"created":"2014-12-20T18:10:07","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/53/","desc":"Walkers are vehicles from the Star Wars universe that traverse the landscape on mechanical legs. They are used by the Old Republic and the Galactic Empire for ground assault or transport. Throughout the saga, walkers have played a pivotal role in the fate of characters and the outcome of battles. Industrial Light and Magic (ILM) is responsible for their animation and design, often using models, stop-motion animation, and relevant matte paintings to depict their presence in the films.\nThere are a variety of walkers: The Empire Strikes Back introduces the All Terrain Armored Transport (AT-AT) and All Terrain Scout Transport (AT-ST). Star Wars: Episode II – Attack of the Clones and Star Wars: Episode III – Revenge of the Sith introduced earlier models of walkers, such as the AT-TE, and the Star Wars expanded universe features numerous others. Walker variants have been merchandised and featured in popular culture."} +(544){"name":"SPHA","model":"Self-Propelled Heavy Artillery","manufacturer":"Rothana Heavy Engineering","cost":null,"length":140,"max_atmosphering_speed":35,"crew":25,"passengers":30,"cargo_capacity":null,"consumables":"7 days","vehicle_class":"walker","pilots":[],"films":[~150],"created":"2014-12-20T18:12:32","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/54/","desc":"undefined"} +(566){"name":"Flitknot speeder","model":"Flitknot speeder","manufacturer":"Huppla Pasa Tisc Shipwrights Collective","cost":"SWC$8000.0","length":2,"max_atmosphering_speed":634,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"speeder","pilots":[~64],"films":[~150],"created":"2014-12-20T18:15:20","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/55/","desc":"undefined"} +(566){"name":"Neimoidian shuttle","model":"Sheathipede-class transport shuttle","manufacturer":"Haor Chall Engineering","cost":null,"length":20,"max_atmosphering_speed":880,"crew":2,"passengers":6,"cargo_capacity":null,"consumables":"7 days","vehicle_class":"transport","pilots":[],"films":[~150,~152],"created":"2014-12-20T18:25:44","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/56/","desc":"undefined"} +(584){"name":"Geonosian starfighter","model":"Nantex-class territorial defense","manufacturer":"Huppla Pasa Tisc Shipwrights Collective","cost":null,"length":9.8,"max_atmosphering_speed":20000,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"unknown","vehicle_class":"starfighter","pilots":[],"films":[~150],"created":"2014-12-20T18:34:12","edited":"2014-12-22T18:21:16","url":"http://swapi.co/api/vehicles/57/","desc":"undefined"} +(644){"name":"Sentinel-class landing craft","model":"Sentinel-class landing craft","manufacturer":"Sienar Fleet Systems, Cyngus Spaceworks","cost":"SWC$240000.0","length":38,"max_atmosphering_speed":1000,"crew":5,"passengers":75,"cargo_capacity":null,"consumables":"1 month","hyperdrive_rating":1,"MGLT":70,"starship_class":"landing craft","pilots":[],"films":[~149],"created":"2014-12-10T15:48:00","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/5/","desc":"undefined"} +(1498){"name":"Death Star","model":"DS-1 Orbital Battle Station","manufacturer":"Imperial Department of Military Research, Sienar Fleet Systems","cost":"SWC$1000000000000.0","length":120000,"max_atmosphering_speed":null,"crew":342953,"passengers":843342,"cargo_capacity":null,"consumables":"3 years","hyperdrive_rating":4,"MGLT":10,"starship_class":"Deep Space Mobile Battlestation","pilots":[],"films":[~149],"created":"2014-12-10T16:36:50","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/9/","desc":"A number of fictional mobile space stations and galactic superweapons called Death Star featured in the Star Wars science-fiction franchise. The first Death Star was stated to be more than 100 km to 160 km in diameter, depending on source. It was crewed by an estimated 1.7 million military personnel and 400,000 droids.[1][2] Its superweapon delivered enough energies on a scale equivalent to all the energy released by the Sun in an entire week.[citation needed] The second Death Star was significantly larger, between 200 km to 400 km in diameter depending on source, and technologically more advanced than its predecessor. Both versions of these dwarf planet-sized fortresses were designed for massive power projection capabilities, capable of destroying an entire planet with one blast from their superlasers.[3]"} +(1541){"name":"Millennium Falcon","model":"YT-1300 light freighter","manufacturer":"Corellian Engineering Corporation","cost":"SWC$100000.0","length":34.37,"max_atmosphering_speed":1050,"crew":4,"passengers":6,"cargo_capacity":null,"consumables":"2 months","hyperdrive_rating":0.5,"MGLT":75,"starship_class":"Light freighter","pilots":[~13,~14,~24,~30],"films":[~155,~153,~154,~149],"created":"2014-12-10T16:59:45","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/10/","desc":"The Millennium Falcon is a spaceship in the Star Wars universe commanded at one time by Corellian smuggler Han Solo (Harrison Ford) and his Wookiee first mate, Chewbacca (Peter Mayhew). The highly modified Corellian Engineering Corporation (CEC) YT-1300 light freighter first appears in Star Wars (1977), and subsequently in The Empire Strikes Back (1980), Return of the Jedi (1983) and The Force Awakens (2015). The ship also makes a brief cameo appearance in Revenge of the Sith (2005). Additionally, the Falcon appears in a variety of Star Wars expanded universe materials, including books, comics, and games; James Luceno's novel Millennium Falcon focuses on the titular ship.[2] It also appears in the 2014 animated film The Lego Movie in Lego form, with Billy Dee Williams and Anthony Daniels reprising their roles of Lando Calrissian and C-3PO, with Keith Ferguson voicing Han Solo."} +(971){"name":"Y-wing","model":"BTL Y-wing","manufacturer":"Koensayr Manufacturing","cost":"SWC$134999.0","length":14,"max_atmosphering_speed":1000,"crew":2,"passengers":0,"cargo_capacity":null,"consumables":"1 week","hyperdrive_rating":1,"MGLT":80,"starship_class":"assault starfighter","pilots":[],"films":[~153,~154,~149],"created":"2014-12-12T11:00:39","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/11/","desc":"The Y-wing is a fictional Galactic Republic, Rebel Alliance and New Republic starfighter in the Star Wars franchise. They appear in Star Wars Episode IV: A New Hope, Star Wars Episode V: The Empire Strikes Back, Star Wars Episode VI: Return of the Jedi, Rogue One, Clone Wars TV series, Star Wars Rebels TV series and the Star Wars expanded universe's books, comics, and games."} +(960){"name":"X-wing","model":"T-65 X-wing","manufacturer":"Incom Corporation","cost":"SWC$149999.0","length":12.5,"max_atmosphering_speed":1050,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"1 week","hyperdrive_rating":1,"MGLT":100,"starship_class":"Starfighter","pilots":[~1,~9,~17,~18],"films":[~153,~154,~149],"created":"2014-12-12T11:19:05","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/12/","desc":"The X-wing starfighter is a fictional starfighter from the original and sequel Star Wars trilogies and the Star Wars expanded universe. They are depicted as the primary interceptor and dogfighter of the Rebel Alliance, the New Republic and the Resistance. The craft has been merchandised as a variety of toys, models licensed for use in games, novels and comics."} +(603){"name":"TIE Advanced x1","model":"Twin Ion Engine Advanced x1","manufacturer":"Sienar Fleet Systems","cost":null,"length":9.2,"max_atmosphering_speed":1200,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"5 days","hyperdrive_rating":1,"MGLT":105,"starship_class":"Starfighter","pilots":[~4],"films":[~149],"created":"2014-12-12T11:21:32","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/13/","desc":"undefined"} +(960){"name":"Executor","model":"Executor-class star dreadnought","manufacturer":"Kuat Drive Yards, Fondor Shipyards","cost":"SWC$1143350000.0","length":19,"max_atmosphering_speed":null,"crew":279144,"passengers":38000,"cargo_capacity":null,"consumables":"6 years","hyperdrive_rating":2,"MGLT":40,"starship_class":"Star dreadnought","pilots":[],"films":[~153,~154],"created":"2014-12-15T12:31:42","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/15/","desc":"An executor is someone who is responsible for executing, or following through on, an assigned task or duty. The feminine form, executrix, may sometimes be used. The role of an executor should not be confused with that of an executioner, a person who carries out a death sentence ordered by the state or other legal authority."} +(616){"name":"Slave 1","model":"Firespray-31-class patrol and attack","manufacturer":"Kuat Systems Engineering","cost":null,"length":21.5,"max_atmosphering_speed":1000,"crew":1,"passengers":6,"cargo_capacity":null,"consumables":"1 month","hyperdrive_rating":3,"MGLT":70,"starship_class":"Patrol craft","pilots":[~21],"films":[~150,~154],"created":"2014-12-15T13:00:56","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/21/","desc":"undefined"} +(640){"name":"Imperial shuttle","model":"Lambda-class T-4a shuttle","manufacturer":"Sienar Fleet Systems","cost":"SWC$240000.0","length":20,"max_atmosphering_speed":850,"crew":6,"passengers":20,"cargo_capacity":null,"consumables":"2 months","hyperdrive_rating":1,"MGLT":50,"starship_class":"Armed government transport","pilots":[~1,~13,~14],"films":[~153,~154],"created":"2014-12-15T13:04:47","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/22/","desc":"undefined"} +(631){"name":"EF76 Nebulon-B escort frigate","model":"EF76 Nebulon-B escort frigate","manufacturer":"Kuat Drive Yards","cost":"SWC$8500000.0","length":300,"max_atmosphering_speed":800,"crew":854,"passengers":75,"cargo_capacity":null,"consumables":"2 years","hyperdrive_rating":2,"MGLT":40,"starship_class":"Escort ship","pilots":[],"films":[~153,~154],"created":"2014-12-15T13:06:30","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/23/","desc":"undefined"} +(628){"name":"Calamari Cruiser","model":"MC80 Liberty type Star Cruiser","manufacturer":"Mon Calamari shipyards","cost":"SWC$104000000.0","length":1200,"max_atmosphering_speed":null,"crew":5400,"passengers":1200,"cargo_capacity":null,"consumables":"2 years","hyperdrive_rating":1,"MGLT":60,"starship_class":"Star Cruiser","pilots":[],"films":[~153],"created":"2014-12-18T10:54:57","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/27/","desc":"undefined"} +(928){"name":"A-wing","model":"RZ-1 A-wing Interceptor","manufacturer":"Alliance Underground Engineering, Incom Corporation","cost":"SWC$175000.0","length":9.6,"max_atmosphering_speed":1300,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"1 week","hyperdrive_rating":1,"MGLT":120,"starship_class":"Starfighter","pilots":[~28],"films":[~153],"created":"2014-12-18T11:16:34","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/28/","desc":"A-wings are fictional starfighters in the Star Wars franchise. They first appear in Return of the Jedi (1983) and later in numerous Star Wars materials and productions. It gained popularity through its depiction in several video games, and since 1985 the A-wing has been merchandised by several companies."} +(602){"name":"B-wing","model":"A/SF-01 B-wing starfighter","manufacturer":"Slayn & Korpil","cost":"SWC$220000.0","length":16.9,"max_atmosphering_speed":950,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"1 week","hyperdrive_rating":2,"MGLT":91,"starship_class":"Assault Starfighter","pilots":[],"films":[~153],"created":"2014-12-18T11:18:04","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/29/","desc":"undefined"} +(614){"name":"Republic Cruiser","model":"Consular-class cruiser","manufacturer":"Corellian Engineering Corporation","cost":null,"length":115,"max_atmosphering_speed":900,"crew":9,"passengers":16,"cargo_capacity":null,"consumables":"unknown","hyperdrive_rating":2,"MGLT":null,"starship_class":"Space cruiser","pilots":[],"films":[~151],"created":"2014-12-19T17:01:31","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/31/","desc":"undefined"} +(636){"name":"Naboo fighter","model":"N-1 starfighter","manufacturer":"Theed Palace Space Vessel Engineering Corps","cost":"SWC$200000.0","length":11,"max_atmosphering_speed":1100,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"7 days","hyperdrive_rating":1,"MGLT":null,"starship_class":"Starfighter","pilots":[~11,~57,~87],"films":[~150,~151],"created":"2014-12-19T17:39:17","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/39/","desc":"undefined"} +(655){"name":"Naboo Royal Starship","model":"J-type 327 Nubian royal starship","manufacturer":"Theed Palace Space Vessel Engineering Corps, Nubia Star Drives","cost":null,"length":76,"max_atmosphering_speed":920,"crew":8,"passengers":null,"cargo_capacity":null,"consumables":"unknown","hyperdrive_rating":1.8,"MGLT":null,"starship_class":"yacht","pilots":[~37],"films":[~151],"created":"2014-12-19T17:45:03","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/40/","desc":"undefined"} +(606){"name":"Scimitar","model":"Star Courier","manufacturer":"Republic Sienar Systems","cost":"SWC$55000000.0","length":26.5,"max_atmosphering_speed":1180,"crew":1,"passengers":6,"cargo_capacity":null,"consumables":"30 days","hyperdrive_rating":1.5,"MGLT":null,"starship_class":"Space Transport","pilots":[~42],"films":[~151],"created":"2014-12-20T09:39:56","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/41/","desc":"undefined"} +(666){"name":"J-type diplomatic barge","model":"J-type diplomatic barge","manufacturer":"Theed Palace Space Vessel Engineering Corps, Nubia Star Drives","cost":"SWC$2000000.0","length":39,"max_atmosphering_speed":2000,"crew":5,"passengers":10,"cargo_capacity":null,"consumables":"1 year","hyperdrive_rating":0.7,"MGLT":null,"starship_class":"Diplomatic barge","pilots":[],"films":[~150],"created":"2014-12-20T11:05:51","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/43/","desc":"undefined"} +(618){"name":"AA-9 Coruscant freighter","model":"Botajef AA-9 Freighter-Liner","manufacturer":"Botajef Shipyards","cost":null,"length":390,"max_atmosphering_speed":null,"crew":null,"passengers":30000,"cargo_capacity":null,"consumables":"unknown","hyperdrive_rating":null,"MGLT":null,"starship_class":"freighter","pilots":[],"films":[~150],"created":"2014-12-20T17:24:23","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/47/","desc":"undefined"} +(638){"name":"Jedi starfighter","model":"Delta-7 Aethersprite-class interceptor","manufacturer":"Kuat Systems Engineering","cost":"SWC$180000.0","length":8,"max_atmosphering_speed":1150,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"7 days","hyperdrive_rating":1,"MGLT":null,"starship_class":"Starfighter","pilots":[~10,~55],"films":[~150,~152],"created":"2014-12-20T17:35:23","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/48/","desc":"undefined"} +(625){"name":"H-type Nubian yacht","model":"H-type Nubian yacht","manufacturer":"Theed Palace Space Vessel Engineering Corps","cost":null,"length":47.9,"max_atmosphering_speed":8000,"crew":4,"passengers":null,"cargo_capacity":null,"consumables":"unknown","hyperdrive_rating":0.9,"MGLT":null,"starship_class":"yacht","pilots":[~87],"films":[~150],"created":"2014-12-20T17:46:46","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/49/","desc":"undefined"} +(1088){"name":"Star Destroyer","model":"Imperial I-class Star Destroyer","manufacturer":"Kuat Drive Yards","cost":"SWC$150000000.0","length":1,"max_atmosphering_speed":975,"crew":47060,"passengers":0,"cargo_capacity":null,"consumables":"2 years","hyperdrive_rating":2,"MGLT":60,"starship_class":"Star Destroyer","pilots":[],"films":[~153,~154,~149],"created":"2014-12-10T15:08:19","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/3/","desc":"Star Destroyers are capital ships in the fictional Star Wars universe. The Imperial Star Destroyer, which first appears in the first seconds of Star Wars (1977), is \"the signature vessel of the Imperial fleet\".[2] The term \"Star Destroyer\" also refers to other vessels in the franchise.\nNumerous Star Destroyer models and toys have been released, and the iconic scene featuring the vessel's first appearance has been called \"a milestone in special effects history\"."} +(686){"name":"Trade Federation cruiser","model":"Providence-class carrier/destroyer","manufacturer":"Rendili StarDrive, Free Dac Volunteers Engineering corps.","cost":"SWC$125000000.0","length":1088,"max_atmosphering_speed":1050,"crew":600,"passengers":48247,"cargo_capacity":null,"consumables":"4 years","hyperdrive_rating":1.5,"MGLT":null,"starship_class":"capital ship","pilots":[~10,~11],"films":[~152],"created":"2014-12-20T19:40:21","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/59/","desc":"undefined"} +(617){"name":"Theta-class T-2c shuttle","model":"Theta-class T-2c shuttle","manufacturer":"Cygnus Spaceworks","cost":"SWC$1000000.0","length":18.5,"max_atmosphering_speed":2000,"crew":5,"passengers":16,"cargo_capacity":null,"consumables":"56 days","hyperdrive_rating":1,"MGLT":null,"starship_class":"transport","pilots":[],"films":[~152],"created":"2014-12-20T19:48:40","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/61/","desc":"undefined"} +(590){"name":"T-70 X-wing fighter","model":"T-70 X-wing fighter","manufacturer":"Incom","cost":null,"length":null,"max_atmosphering_speed":null,"crew":1,"passengers":null,"cargo_capacity":null,"consumables":"unknown","hyperdrive_rating":null,"MGLT":null,"starship_class":"fighter","pilots":[~84],"films":[~155],"created":"2015-04-17T06:58:50","edited":"2015-04-17T06:58:50","url":"http://swapi.co/api/starships/77/","desc":"undefined"} +(607){"name":"Rebel transport","model":"GR-75 medium transport","manufacturer":"Gallofree Yards, Inc.","cost":null,"length":90,"max_atmosphering_speed":650,"crew":6,"passengers":90,"cargo_capacity":null,"consumables":"6 months","hyperdrive_rating":4,"MGLT":20,"starship_class":"Medium transport","pilots":[],"films":[~153,~154],"created":"2014-12-15T12:34:52","edited":"2014-12-22T17:35:44","url":"http://swapi.co/api/starships/17/","desc":"undefined"} +(645){"name":"Droid control ship","model":"Lucrehulk-class Droid Control Ship","manufacturer":"Hoersch-Kessel Drive, Inc.","cost":null,"length":3170,"max_atmosphering_speed":null,"crew":175,"passengers":139000,"cargo_capacity":null,"consumables":"500 days","hyperdrive_rating":2,"MGLT":null,"starship_class":"Droid control ship","pilots":[],"films":[~150,~151,~152],"created":"2014-12-19T17:04:06","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/32/","desc":"undefined"} +(627){"name":"Republic Assault ship","model":"Acclamator I-class assault ship","manufacturer":"Rothana Heavy Engineering","cost":null,"length":752,"max_atmosphering_speed":null,"crew":700,"passengers":16000,"cargo_capacity":null,"consumables":"2 years","hyperdrive_rating":0.6,"MGLT":null,"starship_class":"assault ship","pilots":[],"films":[~150],"created":"2014-12-20T18:08:42","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/52/","desc":"undefined"} +(636){"name":"Solar Sailer","model":"Punworcca 116-class interstellar sloop","manufacturer":"Huppla Pasa Tisc Shipwrights Collective","cost":"SWC$35700.0","length":15.2,"max_atmosphering_speed":1600,"crew":3,"passengers":11,"cargo_capacity":null,"consumables":"7 days","hyperdrive_rating":1.5,"MGLT":null,"starship_class":"yacht","pilots":[],"films":[~150],"created":"2014-12-20T18:37:56","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/58/","desc":"undefined"} +(654){"name":"Republic attack cruiser","model":"Senator-class Star Destroyer","manufacturer":"Kuat Drive Yards, Allanteen Six shipyards","cost":"SWC$59000000.0","length":1137,"max_atmosphering_speed":975,"crew":7400,"passengers":2000,"cargo_capacity":null,"consumables":"2 years","hyperdrive_rating":1,"MGLT":null,"starship_class":"star destroyer","pilots":[],"films":[~152],"created":"2014-12-20T19:52:56","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/63/","desc":"undefined"} +(653){"name":"Naboo star skiff","model":"J-type star skiff","manufacturer":"Theed Palace Space Vessel Engineering Corps/Nubia Star Drives, Incorporated","cost":null,"length":29.2,"max_atmosphering_speed":1050,"crew":3,"passengers":3,"cargo_capacity":null,"consumables":"unknown","hyperdrive_rating":0.5,"MGLT":null,"starship_class":"yacht","pilots":[~10,~87],"films":[~152],"created":"2014-12-20T19:55:15","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/64/","desc":"undefined"} +(633){"name":"Jedi Interceptor","model":"Eta-2 Actis-class light interceptor","manufacturer":"Kuat Systems Engineering","cost":"SWC$320000.0","length":5.47,"max_atmosphering_speed":1500,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"2 days","hyperdrive_rating":1,"MGLT":null,"starship_class":"starfighter","pilots":[~10,~11],"films":[~152],"created":"2014-12-20T19:56:57","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/65/","desc":"undefined"} +(634){"name":"arc-170","model":"Aggressive Reconnaissance-170 starfighte","manufacturer":"Incom Corporation, Subpro Corporation","cost":"SWC$155000.0","length":14.5,"max_atmosphering_speed":1000,"crew":3,"passengers":0,"cargo_capacity":null,"consumables":"5 days","hyperdrive_rating":1,"MGLT":100,"starship_class":"starfighter","pilots":[],"films":[~152],"created":"2014-12-20T20:03:48","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/66/","desc":"undefined"} +(659){"name":"Banking clan frigte","model":"Munificent-class star frigate","manufacturer":"Hoersch-Kessel Drive, Inc, Gwori Revolutionary Industries","cost":"SWC$57000000.0","length":825,"max_atmosphering_speed":null,"crew":200,"passengers":null,"cargo_capacity":null,"consumables":"2 years","hyperdrive_rating":1,"MGLT":null,"starship_class":"cruiser","pilots":[],"films":[~152],"created":"2014-12-20T20:07:11","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/68/","desc":"undefined"} +(640){"name":"Belbullab-22 starfighter","model":"Belbullab-22 starfighter","manufacturer":"Feethan Ottraw Scalable Assemblies","cost":"SWC$168000.0","length":6.71,"max_atmosphering_speed":1100,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"7 days","hyperdrive_rating":6,"MGLT":null,"starship_class":"starfighter","pilots":[~10,~77],"films":[~152],"created":"2014-12-20T20:38:05","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/74/","desc":"undefined"} +(689){"name":"V-wing","model":"Alpha-3 Nimbus-class V-wing starfighter","manufacturer":"Kuat Systems Engineering","cost":"SWC$102500.0","length":7.9,"max_atmosphering_speed":1050,"crew":1,"passengers":0,"cargo_capacity":null,"consumables":"15 hours","hyperdrive_rating":1,"MGLT":null,"starship_class":"starfighter","pilots":[],"films":[~152],"created":"2014-12-20T20:43:04","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/75/","desc":"There have been several vehicles in the Star Wars Universe designated V-wing:"} +(616){"name":"CR90 corvette","model":"CR90 corvette","manufacturer":"Corellian Engineering Corporation","cost":"SWC$3500000.0","length":150,"max_atmosphering_speed":950,"crew":165,"passengers":600,"cargo_capacity":null,"consumables":"1 year","hyperdrive_rating":2,"MGLT":60,"starship_class":"corvette","pilots":[],"films":[~152,~153,~149],"created":"2014-12-10T14:20:33","edited":"2014-12-22T17:35:45","url":"http://swapi.co/api/starships/2/","desc":"undefined"} +(65){"name":"Dave the Stormtrooper","gender":"male","homeworld":~147} \ No newline at end of file diff --git a/example/run-command.mjs b/example/run-command.mjs index 2d3f0ea..94c60ee 100644 --- a/example/run-command.mjs +++ b/example/run-command.mjs @@ -1,20 +1,22 @@ import { v4 as uuid } from 'uuid' import JSONTag from '@muze-nl/jsontag' - // run command to localhost:3000 let id = uuid() +let timestamp = new Date().toISOString() +timestamp = timestamp.substring(0, timestamp.indexOf('T')) let commandStr = `{ "id": "${id}", "name": "addPerson", + "timestamp": "${timestamp}", + "author":"someone", "value": { - "name": "Some Stormtrooper", + "name": "Dave the Stormtrooper", "gender": "male", "homeworld": "http://swapi.co/api/planets/1/" } }` - async function main() { let response = await fetch('http://localhost:3000/command', { method: 'POST', diff --git a/package.json b/package.json index 22a448b..62a368c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@muze-nl/simplystore", - "version": "0.6.4", + "version": "0.6.5", "main": "src/server.mjs", "type": "module", "scripts": { @@ -17,9 +17,10 @@ "homepage": "https://github.com/simplyedit/simplystore#readme", "dependencies": { "@muze-nl/jsontag": "^0.9.1", - "jaqt": "^0.6.2", + "@muze-nl/od-jsontag": "^0.1.1", "codemirror": "^6.0.1", "express": "^4.18.1", + "jaqt": "^0.6.2", "json-pointer": "^0.6.2", "jsonpath-plus": "^7.2.0", "vm2": "^3.9.13", @@ -37,4 +38,4 @@ "www/", "scripts/" ] -} \ No newline at end of file +} diff --git a/src/command-worker-module.mjs b/src/command-worker-module.mjs index dd42652..67934b2 100644 --- a/src/command-worker-module.mjs +++ b/src/command-worker-module.mjs @@ -1,12 +1,13 @@ import JSONTag from '@muze-nl/jsontag' -import {source, isChanged, getIndex} from './symbols.mjs' -import fastParse from './fastParse.mjs' -import {stringToSAB,resultSetStringify} from './fastStringify.mjs' +import {source, isChanged, getIndex, resultSet} from '@muze-nl/od-jsontag/src/symbols.mjs' +import parse from '@muze-nl/od-jsontag/src/parse.mjs' +import serialize, {stringify} from '@muze-nl/od-jsontag/src/serialize.mjs' +import * as FastJSONTag from '@muze-nl/od-jsontag/src/jsontag.mjs' import writeFileAtomic from 'write-file-atomic' import {_,from,not,anyOf,allOf,asc,desc,sum,count,avg,max,min} from 'jaqt' let commands = {} -let resultSet = [] +let resultArr = [] let dataspace let datafile let meta = {} @@ -20,7 +21,7 @@ export const metaIdProxy = { meta.index.id.forEach((ref,id) => { callback({ deref: () => { - return resultSet[ref] + return resultArr[ref] } },id) }) @@ -34,7 +35,7 @@ export const metaIdProxy = { } } else { let line = meta.index.id.get(id) - resultSet[line] = ref + resultArr[line] = ref } }, get: (id) => { @@ -42,7 +43,7 @@ export const metaIdProxy = { if (index || index===0) { return { deref: () => { - return resultSet[index] + return resultArr[index] } } } @@ -52,22 +53,9 @@ export const metaIdProxy = { } } -export const FastJSONTag = { - getType: (obj) => JSONTag.getType(obj?.[source]), - getAttribute: (obj, attr) => JSONTag.getAttribute(obj?.[source],attr), - setAttribute: (obj, attr, value) => { - if (!obj) return - obj[isChanged] = true - return JSONTag.setAttribute(obj[source], attr, value) - }, - getAttributes: (obj) => JSONTag.getAttributes(obj?.[source]), - getAttributeString: (obj) => JSONTag.getAttributesString(obj?.[source]), - getTypeString: (obj) => JSONTag.getTypeString(obj?.[source]) -} - export async function initialize(task) { - resultSet = fastParse(task.data, task.meta, false) // false means mutable - dataspace = resultSet[0] + dataspace = parse(task.data, task.meta, false) // false means mutable + resultArr = dataspace[resultSet] meta = task.meta metaProxy.index.id = metaIdProxy datafile = task.datafile @@ -90,8 +78,7 @@ export default async function runCommand(commandStr, request) { //TODO: if command/task makes no changes, skip updating data.jsontag and writing it, skip response.data FastJSONTag.setAttribute(dataspace, 'command', task.id) - const strData = resultSetStringify(resultSet) - const uint8sab = stringToSAB(strData) + const uint8sab = serialize(dataspace) response.data = uint8sab response.meta = { index: { diff --git a/src/fastParse.mjs b/src/fastParse.mjs deleted file mode 100644 index f6eaf62..0000000 --- a/src/fastParse.mjs +++ /dev/null @@ -1,1035 +0,0 @@ -import JSONTag from '@muze-nl/jsontag'; -import Null from '@muze-nl/jsontag/src/lib/Null.mjs' -import fastStringify from './fastStringify.mjs' -import {source,isProxy,getBuffer,getIndex,isChanged,isParsed,position,parent} from './symbols.mjs' - -const decoder = new TextDecoder() -const encoder = new TextEncoder() - -export default function parse(input, meta, immutable=true) -{ - if (!meta) { - meta = {} - } - if (!meta.index) { - meta.index = {} - } - if (!meta.index.id) { - meta.index.id = new Map() - } - if (!meta.unresolved) { - meta.unresolved = new Map() - } - if (!meta.baseURL) { - meta.baseURL = 'http://localhost/' - } - - let at, ch, value, result; - let escapee = { - '"': '"', - "\\":"\\", - '/': '/', - b: "\b", - f: "\f", - n: "\n", - r: "\r", - t: "\t" - } - let offsetArray = [] - let resultArray = [] - - at = 0 - ch = " " - - let error = function(m) - { - let context - try { - context = decoder.decode(input.slice(at-100,at+100)); - } catch(err) {} - throw { - name: 'SyntaxError', - message: m, - at: at, - input: context - } - } - - if (!(input instanceof Uint8Array)) { - error('fast parse only accepts Uint8Array as input') - } - - let next = function(c) - { - if (c && c!==ch) { - error("Expected '"+c+"' instead of '"+ch+"': "+at+':'+input) - } - ch = String.fromCharCode(input.at(at)) - at+=1 - return ch - } - - let number = function(tagName) - { - let numString = '' - if (ch==='-') { - numString = '-' - next('-') - } - while(ch>='0' && ch<='9') { - numString += ch - next() - } - if (ch==='.') { - numString+='.' - while(next() && ch >= '0' && ch <= '9') { - numString += ch - } - } - if (ch === 'e' || ch === 'E') { - numString += ch - next() - if (ch === '-' || ch === '+') { - numString += ch - next() - } - while (ch >= '0' && ch <= '9') { - numString += ch - next() - } - } - let result = new Number(numString).valueOf() - if (tagName) { - switch(tagName) { - case "int": - isInt(numString) - break - case "uint": - isInt(numString, [0,Infinity]) - break - case "int8": - isInt(numString, [-128,127]) - break - case "uint8": - isInt(numString, [0,255]) - break - case "int16": - isInt(numString, [-32768,32767]) - break - case "uint16": - isInt(numString, [0,65535]) - break - case "int32": - isInt(numString, [-2147483648, 2147483647]) - break - case "uint32": - isInt(numString, [0,4294967295]) - break - case "timestamp": - case "int64": - isInt(numString, [-9223372036854775808,9223372036854775807]) - break - case "uint64": - isInt(numString, [0,18446744073709551615]) - break - case "float": - isFloat(numString) - break - case "float32": - isFloat(numString, [-3.4e+38,3.4e+38]) - break - case "float64": - isFloat(numString, [-1.7e+308,+1.7e+308]) - break - case "number": - //FIXME: what to check? should already be covered by JSON parsing rules? - break - default: - isTypeError(tagName, numString) - break - } - } - return result - } - - let isTypeError = function(type, value) - { - error('Syntax error, expected '+type+', got: '+value) - } - - const regexes = { - color: /^(rgb|hsl)a?\((\d+%?(deg|rad|grad|turn)?[,\s]+){2,3}[\s\/]*[\d\.]+%?\)$/i, - email: /^[A-Za-z0-9_!#$%&'*+\/=?`{|}~^.-]+@[A-Za-z0-9.-]+$/, - uuid: /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/, - decimal: /^\d*\.?\d*$/, - money: /^[A-Z]+\$\d*\.?\d*$/, - duration: /^(-?)P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)([DW]))?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/, - phone: /^[+]?(?:\(\d+(?:\.\d+)?\)|\d+(?:\.\d+)?)(?:[ -]?(?:\(\d+(?:\.\d+)?\)|\d+(?:\.\d+)?))*(?:[ ]?(?:x|ext)\.?[ ]?\d{1,5})?$/, - time: /^(\d{2}):(\d{2})(?::(\d{2}(?:\.\d+)?))?$/, - date: /^-?[1-9][0-9]{3,}-([0][1-9]|[1][0-2])-([1-2][0-9]|[0][1-9]|[3][0-1])$/, - datetime: /^(\d{4,})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}(?:\.\d+)?))?$/, - range: /^\[-?(\d+\.)?\d+\,-?(\d+\.)?\d+\]$/ - } - - let isFloat = function(float, range) - { - let test = new Number(parseFloat(float)) - let str = test.toString() - if (float!==str) { - error('Syntax Error: expected float value') - } - if (range) { - if (typeof range[0] === 'number') { - if (testrange[1]) { - error('Syntax Error: float value out of range') - } - } - } - } - - let isInt = function(int, range) - { - let test = new Number(parseInt(int)) - let str = test.toString() - if (int!==str) { - error('Syntax Error: expected integer value') - } - if (range) { - if (typeof range[0] === 'number') { - if (testrange[1]) { - error('Syntax Error: integer value out of range') - } - } - } - } - - let isColor = function(color) - { - let result = false - if (color.charAt(0) === "#") { - color = color.substring(1) - result = ([3, 4, 6, 8].indexOf(color.length) > -1) && !isNaN(parseInt(color, 16)) - if (result.toString(16)!==color) { - isTypeError('color', color) - } - } else { - result = regexes.color.test(color) - } - if (!result) { - isTypeError('color',color) - } - return true - } - - let isEmail = function(email) - { - let result = regexes.email.test(email) - if (!result) { - isTypeError('email',email) - } - return true - } - - let isUuid = function(uuid) - { - let result = regexes.uuid.test(uuid) - if (!result) { - isTypeError('uuid',uuid) - } - return true - } - - let isDecimal = function(decimal) - { - let result = regexes.decimal.test(decimal) - if (!result) { - isTypeError('decimal',decimal) - } - return true - } - - let isMoney = function(money) - { - let result = regexes.money.test(money) - if (!result) { - isTypeError('money',money) - } - return true - } - - let isUrl = function(url) - { - try { - return Boolean(new URL(url, meta.baseURL)) - } catch(e) { - isTypeError('url',url) - } - } - - let isDuration = function(duration) - { - let result = regexes.duration.test(duration) - if (!result) { - isTypeError('duration',duration) - } - return true - } - - let isPhone = function(phone) - { - let result = regexes.phone.test(phone) - if (!result) { - isTypeError('phone',phone) - } - return true - } - - let isRange = function(range) - { - let result = regexes.range.test(range) - if (!result) { - isTypeError('range',range) - } - return true - } - - let isTime = function(time) - { - let result = regexes.time.test(time) - if (!result) { - isTypeError('time',time) - } - return true - } - - let isDate = function(date) - { - let result = regexes.date.test(date) - if (!result) { - isTypeError('date',date) - } - return true - } - - let isDatetime = function(datetime) - { - let result = regexes.datetime.test(datetime) - if (!result) { - isTypeError('datetime',datetime) - } - return true - } - - let checkStringType = function(tagName, value) - { - if (!tagName) { - return - } - switch(tagName){ - case "object": - case "array": - case "int8": - case "uint8": - case "int16": - case "uint16": - case "int32": - case "uint32": - case "int64": - case "uint64": - case "int": - case "uint": - case "float32": - case "float64": - case "float": - case "timestamp": - isTypeError(tagName, value) - break - case "uuid": - return isUuid(value) - case "decimal": - return isDecimal(value) - case "money": - return isMoney(value) - case "url": - return isUrl(value) - case "link": - case "string": - case "text": - case "blob": - case "hash": - //anything goes - return true - case "color": - return isColor(value) - case "email": - return isEmail(value) - case "duration": - return isDuration(value) - case "phone": - return isPhone(value) - case "range": - return isRange(value) - case "time": - return isTime(value) - case "date": - return isDate(value) - case "datetime": - return isDatetime(value) - } - error('Syntax error: unknown tagName '+tagName) - } - - let string = function(tagName) - { - let value = [], hex, i, uffff; - if (ch !== '"') { - error("Syntax Error") - } - next('"') - while(ch) { - if (ch==='"') { - next() - let bytes = new Uint8Array(value) - value = decoder.decode(bytes) - checkStringType(tagName, value) - return value - } - if (ch==='\\') { - next() - if (ch==='u') { - for (i=0; i<4; i++) { - hex = parseInt(next(), 16) - if (!isFinite(hex)) { - break - } - uffff = uffff * 16 + hex - } - let str = String.fromCharCode(uffff) - let bytes = encoder.encode(str) - value.push.apply(value, bytes) - next() - } else if (typeof escapee[ch] === 'string') { - value.push(escapee[ch].charCodeAt(0)) - next() - } else { - break - } - } else { - value.push(ch.charCodeAt(0)) - next() - } - } - error("Syntax error: incomplete string") - } - - let tag = function() - { - let key, val, tagOb={ - attributes: {} - } - if (ch !== '<') { - error("Syntax Error") - } - next('<') - key = word() - if (!key) { - error('Syntax Error: expected tag name') - } - tagOb.tagName = key - whitespace() - while(ch) { - if (ch==='>') { - next('>') - return tagOb - } - key = word() - if (!key) { - error('Syntax Error: expected attribute name') - } - whitespace() - next('=') - whitespace() - val = string() - tagOb.attributes[key] = val - whitespace() - } - error('Syntax Error: unexpected end of input') - } - - let whitespace = function() - { - while (ch) { - switch(ch) { - case ' ': - case "\t": - case "\r": - case "\n": - next() - break - default: - return - break - } - } - } - - let word = function() - { - //[a-z][a-z0-9_]* - let val=''; - if ((ch>='a' && ch<='z') || (ch>='A' && ch<='Z')) { - val += ch - next() - } else { - error('Syntax Error: expected word') - } - while((ch>='a' && ch<='z') || (ch>='A' && ch<='Z') || (ch>='0' && ch<='9') || ch=='_') { - val += ch - next() - } - return val - } - - let boolOrNull = function(tagName) - { - let w = word() - if (!w || typeof w !== 'string') { - error('Syntax error: expected boolean or null, got "'+w+'"') - } - switch(w.toLowerCase()) { - case 'true': - if (tagName && tagName!=='boolean') { - isTypeError(tagName,w) - } - return true - break - case 'false': - if (tagName && tagName!=='boolean') { - isTypeError(tagName,w) - } - return false - break - case 'null': - return null - break - default: - error('Syntax error: expected boolean or null, got "'+w+'"') - break - } - } - - let checkUnresolved = function(item, object, key) - { - if (JSONTag.getType(item)==='link') { - let link = ''+item - let links = meta.unresolved.get(link) - if (typeof links === 'undefined') { - meta.unresolved.set(link,[]) - links = meta.unresolved.get(link) - } - let count = links.push({ - src: new WeakRef(object), - key: key - }) - } - } - - let array = function() - { - let item, array = [] - if (ch !== '[') { - error("Syntax error") - } - next('[') - whitespace() - if (ch===']') { - next(']') - return array - } - while(ch) { - item = value() - checkUnresolved(item, array, array.length) - array.push(item) - whitespace() - if (ch===']') { - next(']') - return array - } - next(',') - whitespace() - } - error("Input stopped early") - } - - let object = function(object={}) - { - let key, val - if (ch !== '{') { - error("Syntax Error") - } - next('{') - whitespace() - if (ch==='}') { - next('}') - return object - } - let enumerable = true - while(ch) { - if (ch==='#') { - enumerable = false - next() - } else { - enumerable = true - } - key = string() - if (key==='__proto__') { - error("Attempt at prototype pollution") - } - whitespace() - next(':') - val = value() - if (!enumerable) { - Object.defineProperty(object, key, { - configurable: true, //important, must be true, otherwise Proxies cannot use it - writable: true, // handle immutability in the Proxy traps - enumerable: false, - value: val - }) - } else { - object[key] = val - } - checkUnresolved(val, object, key) - whitespace() - if (ch==='}') { - next('}') - return object - } - next(',') - whitespace() - } - error("Input stopped early") - } - - let length = function() - { - whitespace() - next('(') - let numString='' - while(ch>='0' && ch<='9') { - numString += ch - next() - } - if (ch!==')') { - error('Syntax error: not a length') - } - next() - return parseInt(numString) - } - - let offset = function() - { - next('~') - let numString = '' - while(ch>='0' && ch<='9') { - numString += ch - next() - } - return parseInt(numString) - } - - let parseValue = function(position, ob={}) { - at = position.start - next() - return value(ob) - } - - const makeChildProxies = function(parent) { - Object.entries(parent).forEach(([key,entry]) => { - if (Array.isArray(entry)) { - makeChildProxies(entry) - } else if (JSONTag.getType(entry)==='object') { - if (entry[isProxy]) { - // do nothing - } else { - parent[key] = getNewValueProxy(entry) - } - } - }) - } - - const handlers = { - newArrayHandler: { - get(target, prop) { - if (target[prop] instanceof Function) { - return (...args) => { - args = args.map(arg => { - if (JSONTag.getType(arg)==='object' && !arg[isProxy]) { - arg = getNewValueProxy(arg) - } - return arg - }) - target[prop].apply(target, args) - } - } else if (prop===isChanged) { - return true - } else { - if (Array.isArray(target[prop])) { - return new Proxy(target[prop], handlers.newArrayHandler) - } - return target[prop] - } - }, - set(target, prop, value) { - if (JSONTag.getType(value)==='object' && !value[isProxy]) { - value = getNewValueProxy(value) - } - target[prop] = value - return true - } - }, - newValueHandler: { - get(target, prop, receiver) { - switch(prop) { - case source: - return target - break - case isProxy: - return true - break - case getBuffer: - return (i) => { - let index = target[getIndex] - if (i != index) { - return encoder.encode('~'+index) - } - // return newly stringified contents of target - return encoder.encode(fastStringify(target, meta, true, i)) - } - break - case getIndex: - return target[getIndex] - break - case isChanged: - return true - break - default: - if (Array.isArray(target[prop])) { - return new Proxy(target[prop], handlers.newArrayHandler) - } - return target[prop] - break - } - }, - set(target, prop, value) { - if (JSONTag.getType(value)==='object' && !value[isProxy]) { - value = getNewValueProxy(value) - } - target[prop] = value - return true - } - }, - arrayHandler: { - get(target, prop) { - if (target[prop] instanceof Function) { - if (['copyWithin','fill','pop','push','reverse','shift','sort','splice','unshift'].indexOf(prop)!==-1) { - if (immutable) { - throw new Error('dataspace is immutable') - } - } - return (...args) => { - args = args.map(arg => { - if (JSONTag.getType(arg)==='object' && !arg[isProxy]) { - arg = getNewValueProxy(arg) - } - return arg - }) - target[parent][isChanged] = true // incorrect target for isChanged... - let result = target[prop].apply(target, args) - return result - } - } else if (prop===isChanged) { - return target[parent][isChanged] - } else { - if (Array.isArray(target[prop])) { - target[prop][parent] = target[parent] - return new Proxy(target[prop], handlers.arrayHandler) - } - return target[prop] - } - }, - set(target, prop, value) { - if (immutable) { - throw new Error('dataspace is immutable') - } - if (JSONTag.getType(value)==='object' && !value[isProxy]) { - value = getNewValueProxy(value) - } - target[prop] = value - target[parent][isChanged] = true - return true - }, - deleteProperty(target, prop) { - if (immutable) { - throw new Error('dataspace is immutable') - } - //FIXME: if target[prop] was the last reference to an object - //that object should be deleted so that its line will become empty - //when stringifying resultArray again - delete target[prop] - target[parent][isChanged] = true - return true - } - }, - handler: { - get(target, prop, receiver) { - firstParse(target) - switch(prop) { - case source: - return target - break - case isProxy: - return true - break - case getBuffer: - return (i) => { - let index = target[getIndex] - if (i != index) { - return encoder.encode('~'+index) - } - if (target[isChanged]) { - // return newly stringified contents of cache - let temp = fastStringify(target, null, true) - return encoder.encode(fastStringify(target, null, true)) - } - return input.slice(target[position].start,target[position].end) - } - break - case getIndex: - return target[getIndex] - break - case isChanged: - return target[isChanged] - break - default: - if (Array.isArray(target[prop])) { - target[prop][parent] = target - return new Proxy(target[prop], handlers.arrayHandler) - } - return target[prop] - break - } - }, - set(target, prop, value) { - if (immutable) { - throw new Error('dataspace is immutable') - } - firstParse(target) - if (prop!==isChanged) { - if (JSONTag.getType(value)==='object' && !value[isProxy]) { - value = getNewValueProxy(value) - } - target[prop] = value - } - target[isChanged] = true - return true - }, - deleteProperty(target, prop) { - if (immutable) { - throw new Error('dataspace is immutable') - } - firstParse(target) - delete target[prop] - target[isChanged] = true - return true - }, - ownKeys(target) { - firstParse(target) - return Reflect.ownKeys(target) - }, - getOwnPropertyDescriptor(target, prop) { - firstParse(target) - return Reflect.getOwnPropertyDescriptor(target, prop) - }, - defineProperty(target, prop, descriptor) { - if (immutable) { - throw new Error('dataspace is immutable') - } - firstParse(target) - Object.defineProperty(target, prop, descriptor) - }, - has(target, prop) { - firstParse() - return prop in target - }, - setPrototypeOf(target,proto) { - throw new Error('changing prototypes is not supported') - } - } - } - - const firstParse = function(target) { - if (!target[isParsed]) { - parseValue(target[position], target) - target[isParsed] = true - } - } - - const getNewValueProxy = function(value) { - let index = resultArray.length - resultArray.push('') - value[getIndex] = index - makeChildProxies(value) - let result = new Proxy(value, handlers.newValueHandler) - resultArray[index] = result - return result - } - - let valueProxy = function(length, index) - { - let cache = {} - cache[getIndex] = index - cache[isChanged] = false - cache[isParsed] = false - // current offset + length contains jsontag of this value - cache[position] = { - start: at-1, - end: at-1+length - } - at += length - next() - // newValueHandler makes sure that value[getBuffer] runs stringify - // arrayHandler makes sure that changes in the array set targetIsChanged to true - return new Proxy(cache, handlers.handler) - } - - value = function(ob={}) - { - let tagOb, result, tagName; - whitespace() - if (ch==='~') { - let vOffset = offset() - return resultArray[vOffset] - } - if (ch==='<') { - tagOb = tag() - tagName = tagOb.tagName - whitespace() - } - switch(ch) { - case '{': - if (tagName && tagName!=='object') { - isTypeError(tagName, ch) - } - result = object(ob) - break - case '[': - if (tagName && tagName!=='array') { - isTypeError(tagName, ch) - } - result = array() - break - case '"': - result = string(tagName) - break - case '-': - result = number(tagName) - break - default: - if (ch>='0' && ch<='9') { - result = number(tagName) - } else { - result = boolOrNull(tagName) - } - break - } - if (tagOb) { - if (result === null) { - result = new Null() - } - if (typeof result !== 'object') { - switch(typeof result) { - case 'string': - result = new String(result) - break - case 'number': - result = new Number(result) - break - default: - error('Syntax Error: unexpected type '+(typeof result)) - break - } - } - if (tagOb.tagName) { - JSONTag.setType(result, tagOb.tagName) - } - if (tagOb.attributes) { - JSONTag.setAttributes(result, tagOb.attributes) -/* if (tagOb.attributes?.id) { - meta.index.id.set(tagOb.attributes.id, result)) - } -*/ - } - } - return result - } - - function lengthValue(i) { - let l = length() - let v = valueProxy(l,i) - return [l, v] - } - - while(ch && atmeta.unresolved.size) { - meta.unresolved.forEach((links,id) => { - let value = meta.index.id.get(id)?.deref() - if (value!==undefined) { - links.forEach((u,i) => { - if (replaceLink(u,value)) { - delete links[i] - } - }) - } - }) - } else { - meta.index.id.forEach((ref,id) => { - let value = ref.deref() - let links = meta.unresolved.get(id) - if (value!==undefined && typeof links !== 'undefined') { - links.forEach((u,i) => { - replaceLink(u,value) - }) - meta.unresolved.delete(id) - } - }) - } - - return resultArray -} \ No newline at end of file diff --git a/src/fastStringify.mjs b/src/fastStringify.mjs deleted file mode 100644 index 5bb4678..0000000 --- a/src/fastStringify.mjs +++ /dev/null @@ -1,156 +0,0 @@ -import JSONTag from '@muze-nl/jsontag'; -import {source,isProxy,getIndex, getBuffer} from './symbols.mjs' - -// faststringify function for a fast parseable arraybuffer output -// -const encoder = new TextEncoder() -const decoder = new TextDecoder() - -export default function stringify(value, meta, skipLength=false, index=false) { - let resultArray = [] - if (!meta) { - meta = {} - } - if (!meta.index) { - meta.index = {} - } - if (!meta.index.id) { - meta.index.id = new Map() - } - let references = new WeakMap() - - function stringifyValue(value) { - let prop - let typeString = JSONTag.getTypeString(value) - let type = JSONTag.getType(value) - switch (type) { - case 'string': - case 'decimal': - case 'money': - case 'link': - case 'text': - case 'blob': - case 'color': - case 'email': - case 'hash': - case 'duration': - case 'phone': - case 'url': - case 'uuid': - case 'date': - case 'time': - case 'datetime': - if (JSONTag.isNull(value)) { - value = 'null' - } else { - value = JSON.stringify(''+value) - } - prop = typeString + value - break - case 'int': - case 'uint': - case 'int8': - case 'uint8': - case 'int16': - case 'uint16': - case 'int32': - case 'uint32': - case 'int64': - case 'uint64': - case 'float': - case 'float32': - case 'float64': - case 'timestamp': - case 'number': - case 'boolean': - if (JSONTag.isNull(value)) { - value = 'null' - } else { - value = JSON.stringify(value) - } - prop = typeString + value - break - case 'array': - let entries = value.map(e => stringifyValue(e)).join(',') - prop = typeString + '[' + entries + ']' - break - case 'object': - if (!value) { - prop = 'null' - } else if (value[isProxy]) { - prop = decoder.decode(value[getBuffer](current)) - } else { - if (!references.has(value)) { - references.set(value, resultArray.length) - resultArray.push(value) - } - prop = '~'+references.get(value) - } - break - default: - throw new Error(JSONTag.getType(value)+' type not yet implemented') - break - } - return prop - } - - const encoder = new TextEncoder() - const decoder = new TextDecoder() - - // is only ever called on object values - // and should always return a stringified object, not a reference (~n) - const innerStringify = (current) => { - let object = resultArray[current] - let result - - // if value is a valueProxy, just copy the input slice - if (object && !JSONTag.isNull(object) && object[isProxy]) { - return decoder.decode(object[getBuffer](current)) - } - if (typeof object === 'undefined' || object === null) { - return 'null' - } - - let props = [] - for (let key of Object.getOwnPropertyNames(object)) { - let value = object[key] - let prop = stringifyValue(value) - let enumerable = object.propertyIsEnumerable(key) ? '' : '#' - props.push(enumerable+'"'+key+'":'+prop) - } - result = JSONTag.getTypeString(object)+'{'+props.join(',')+'}' - return result - } - - const encode = (s) => { - if (skipLength) { - return s - } - let length = new Blob([s]).size - return '('+length+')'+s - } - - resultArray.push(value) - let current = 0 - while(current { - let buffer = e[getBuffer](i) - return '('+buffer.length+')'+decoder.decode(buffer) - }).join("\n") -} \ No newline at end of file diff --git a/src/query-worker-module.mjs b/src/query-worker-module.mjs index 766ccae..25452c8 100644 --- a/src/query-worker-module.mjs +++ b/src/query-worker-module.mjs @@ -1,12 +1,13 @@ -import JSONTag from '@muze-nl/jsontag' -import fastParse from './fastParse.mjs' -import {source, isProxy} from './symbols.mjs' -import {_,from,not,anyOf,allOf,asc,desc,sum,count,avg,max,min} from 'jaqt' import pointer from 'json-pointer' import {VM} from 'vm2' import { memoryUsage } from 'node:process' +import JSONTag from '@muze-nl/jsontag' +import {source, isProxy, resultSet} from '@muze-nl/od-jsontag/src/symbols.mjs' +import parse from '@muze-nl/od-jsontag/src/parse.mjs' +import * as FastJSONTag from '@muze-nl/od-jsontag/src/jsontag.mjs' +import {_,from,not,anyOf,allOf,asc,desc,sum,count,avg,max,min} from 'jaqt' -let resultSet = [] +let resultArr = [] let dataspace let meta = {} let metaProxy = { @@ -18,7 +19,7 @@ const metaIdProxy = { get: (id) => { let index = meta.index.id.get(id) if (index || index===0) { - return resultSet[index] + return resultArr[index] } }, has: (id) => { @@ -26,18 +27,10 @@ const metaIdProxy = { } } -const FastJSONTag = { - getType: (obj) => JSONTag.getType(obj?.[source]), - getAttribute: (obj, attr) => JSONTag.getAttribute(obj?.[source],attr), - getAttributes: (obj) => JSONTag.getAttributes(obj?.[source]), - getAttributeString: (obj) => JSONTag.getAttributesString(obj?.[source]), - getTypeString: (obj) => JSONTag.getTypeString(obj?.[source]) -} - const tasks = { init: async (task) => { - resultSet = fastParse(task.req.body) - dataspace = resultSet[0] + dataspace = parse(task.req.body) + resultArr = dataspace[resultSet] meta = task.req.meta metaProxy.index.id = metaIdProxy //@TODO: add references and baseURL diff --git a/src/symbols.mjs b/src/symbols.mjs deleted file mode 100644 index 9243908..0000000 --- a/src/symbols.mjs +++ /dev/null @@ -1,9 +0,0 @@ -export const source = Symbol('source') -export const isProxy = Symbol('isProxy') -export const getBuffer = Symbol('getBuffer') -export const getIndex = Symbol('getIndex') -export const isChanged = Symbol('isChanged') -export const isParsed = Symbol('isParsed') -export const getString = Symbol('getString') -export const position = Symbol('position') -export const parent = Symbol('parent') \ No newline at end of file diff --git a/src/worker-command-init.mjs b/src/worker-command-init.mjs deleted file mode 100644 index fde23fc..0000000 --- a/src/worker-command-init.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import * as commandWorker from './worker-command.mjs' -import worker_threads from 'node:worker_threads' -import JSONTag from '@muze-nl/jsontag' - -async function initialize() { - let meta = {} - let dataspace = JSONTag.parse(worker_threads.workerData, null, meta) - await commandWorker.initialize(dataspace,meta) - return commandWorker.runCommand -} - -export default initialize() \ No newline at end of file diff --git a/src/worker-command.mjs b/src/worker-command.mjs deleted file mode 100644 index 32acdea..0000000 --- a/src/worker-command.mjs +++ /dev/null @@ -1,51 +0,0 @@ -import JSONTag from '@muze-nl/jsontag' -import commands from './commands.mjs' - -/** - * Command Worker for threads.js library - * returns JSONTag strings, since otherwise JSON.stringify is used - * and type+attribute data gets lost - */ - -let dataspace, meta - -export function setDataspace(d) { - dataspace = d -} - -/** - * @TODO: check for valid command id - * @TODO: write valid commands to command log, emit 'ok', check in server.mjs for that - * @TODO: setTimeout or do above checks in server.mjs before queueing - */ - -export async function initialize(jsontag, m) { - if (!jsontag) { throw new Error('missing jsontag parameter')} - dataspace = jsontag - meta = m - return true -} - -export function runCommand({request, commandStr}) { - if (!commandStr) { throw new Error('missing command parameter')} - if (!request) { throw new Error('missing request parameter')} - let response = { - jsontag: true - } - let command = JSONTag.parse(commandStr) // raw body through express.raw() - if (command && command.name && commands[command.name]) { - try { - commands[command.name](dataspace, command, request) - response.body = JSONTag.stringify(dataspace) //@TODO: this is inefficient, patch would be better - } catch(err) { - console.log(err) - response.code = 422; - response.body = '{"message":'+JSON.stringify(''+err)+',"code":422}' - } - } else { - response.code = 404 - response.body = '{"message":"Command '+command.name+' not found","code":404}' - } - return response -} -