Advertisement
by Frattastan IV » Fri May 27, 2022 2:36 am
Draganisia wrote:Also it seems the next war could be NPO fighting directly against Pacifica.
by Roavin » Fri May 27, 2022 2:36 am
by Sedgistan » Fri May 27, 2022 2:59 am
Frattastan IV wrote:Did admin manage to reproduce the observed rulebreaking behaviour? (a separate question from establishing what's responsible for causing it in the code)
Roavin wrote:I'm currently at the office so I can't go into much detail here (will be doing that later), but I'm very confused by this ruling. I've written close to 50 kilobytes worth of GHRs on this topic, explaining all my hypotheses and findings, and even had a 45-minute screenshare session back in April with a very receptive and interested site admin to show these findings. The running hypothesis that I showed in that screenshare was that operating Reliant+Breeze at the same time could lead to violations (rather than Reliant being at any fault on its own), and I broke it down so much that verifying the hypothesis was nearly as simple as a Ctrl+F in server logs. I also, in my subsequent GHR, took apart the possible intersections between Reliant and Breeze, explaining which could lead to simultaneous non-idempotent requests that could give a gameplay advantage, and not finding any (I could have missed a case, but ... which one??)
Roavin wrote:So now it's 3 months WA ban for three people. The hypothesis that I so meticulously set out and just needed essentially a Ctrl+F to verify (or disprove) remains unanswered as well, and ... well, honestly, given all the info I piped in and the lack of info coming back out, this looks and feels like "we stopped investigating, we're just gonna WA-ban three people and call it a day". I don't want to think that, but it's very hard not to.
by Roavin » Fri May 27, 2022 3:07 am
by Roavin » Fri May 27, 2022 3:11 am
27.5.2022, 12:10:54 MESZ: Kutumal XVI endorsed Pomerania-Wolgast.
27.5.2022, 12:10:54 MESZ: Kutumal XVI endorsed Karl Maldens Nose.
27.5.2022, 12:10:53 MESZ: Kutumal XVI endorsed Youttlesover.
27.5.2022, 12:10:53 MESZ: Kutumal XVI endorsed EAF1.
27.5.2022, 12:10:53 MESZ: Kutumal XVI endorsed Asuka-Soryu.
27.5.2022, 12:10:53 MESZ: Kutumal XVI endorsed Commubirb.
27.5.2022, 12:10:52 MESZ: Kutumal XVI endorsed Rogue Lawnmower.
27.5.2022, 12:10:52 MESZ: Kutumal XVI endorsed 1st Marine Assault Corps.
27.5.2022, 12:10:52 MESZ: Kutumal XVI endorsed Wednesday Addams.
27.5.2022, 12:10:52 MESZ: Kutumal XVI endorsed BHpuppet 2.
27.5.2022, 12:10:52 MESZ: Kutumal XVI endorsed Decreeism.
27.5.2022, 12:10:51 MESZ: Kutumal XVI endorsed Nagaramariningrad.
27.5.2022, 12:10:51 MESZ: Kutumal XVI endorsed La Hellhole.
by Refuge Isle » Fri May 27, 2022 3:26 am
Sedgistan wrote:2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed Venicos Fiancee.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed The Airforce Guy.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed The Toukaian Night Bomber Squadron.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed Scorchy Boi 1.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed Tablerepublic.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed Giraffe Liberator.
by Roavin » Fri May 27, 2022 3:36 am
by Wymondham » Fri May 27, 2022 4:06 am
by Quebecshire » Fri May 27, 2022 8:56 am
Benevolent Thomas wrote:I founded a defender organization out of my dislike of invaders, what invading represents, and my desire to see them suffer.
Pergamon wrote:I must say, you are truly what they deserve.
by Sedgistan » Fri May 27, 2022 9:54 am
by The Chariot » Fri May 27, 2022 12:25 pm
Roavin wrote:For reference, I just did this on my work computer (which you can confirm based on my IP), on which I have no NS tools installed, from my connection in Germany which is significantly slower than coming from the USA or Canada. There's a burst of 5 endos a second in there - the most I could hope for with actual Reliant use with my connection would be 4 if I'm really lucky.
5/27/2022, 3:07:36 PM EDT: The Chariot endorsed The Kock.
5/27/2022, 3:07:06 PM EDT: The Chariot endorsed Kyary Pamyu Pamyu.
5/27/2022, 3:07:06 PM EDT: The Chariot endorsed Steak Paul.
5/27/2022, 3:07:06 PM EDT: The Chariot endorsed Nababa Republic.
5/27/2022, 3:07:06 PM EDT: The Chariot endorsed Counterfeit Kyrusia Puppet.
5/27/2022, 3:07:06 PM EDT: The Chariot endorsed New Astrian Outpost 8.
5/27/2022, 3:07:06 PM EDT: The Chariot endorsed Metal Gear Solid.
5/27/2022, 3:07:06 PM EDT: The Chariot endorsed Malicious Rigel.
5/27/2022, 3:07:05 PM EDT: The Chariot endorsed Myuri.
5/27/2022, 3:06:25 PM EDT: The Chariot withdrew its endorsement from NaganoLegend.
5/27/2022, 3:05:59 PM EDT: The Chariot withdrew its endorsement from Myuri.
5/27/2022, 3:05:06 PM EDT: The Chariot endorsed NaganoLegend.
5/27/2022, 3:05:05 PM EDT: The Chariot endorsed Kyary Pamyu Pamyu.
5/27/2022, 3:05:05 PM EDT: The Chariot endorsed Traditional Japan.
5/27/2022, 3:05:05 PM EDT: The Chariot endorsed Steak Paul.
5/27/2022, 3:05:05 PM EDT: The Chariot endorsed Nababa Republic.
5/27/2022, 3:05:05 PM EDT: The Chariot endorsed Interimian XIX.
5/27/2022, 3:05:05 PM EDT: The Chariot endorsed Counterfeit Kyrusia Puppet.
5/27/2022, 3:05:05 PM EDT: The Chariot endorsed Metal Gear Solid.
5/27/2022, 3:05:05 PM EDT: The Chariot endorsed New Astrian Outpost 8.
5/27/2022, 3:05:04 PM EDT: The Chariot endorsed The Kock.
5/27/2022, 3:05:04 PM EDT: The Chariot endorsed Malicious Rigel.
5/27/2022, 3:05:04 PM EDT: The Chariot endorsed Myuri.
5/27/2022, 3:05:00 PM EDT: The Chariot withdrew its endorsement from NaganoLegend.
5/27/2022, 3:04:33 PM EDT: The Chariot withdrew its endorsement from Myuri.
5/27/2022, 3:04:06 PM EDT: The Chariot endorsed NaganoLegend.
5/27/2022, 3:04:06 PM EDT: The Chariot endorsed Kyary Pamyu Pamyu.
5/27/2022, 3:04:06 PM EDT: The Chariot endorsed Traditional Japan.
5/27/2022, 3:04:05 PM EDT: The Chariot endorsed Steak Paul.
5/27/2022, 3:04:05 PM EDT: The Chariot endorsed Nababa Republic.
5/27/2022, 3:04:05 PM EDT: The Chariot endorsed Counterfeit Kyrusia Puppet.
5/27/2022, 3:04:05 PM EDT: The Chariot endorsed Interimian XIX.
5/27/2022, 3:04:05 PM EDT: The Chariot endorsed Metal Gear Solid.
5/27/2022, 3:04:05 PM EDT: The Chariot endorsed The Kock.
5/27/2022, 3:04:04 PM EDT: The Chariot endorsed New Astrian Outpost 8.
5/27/2022, 3:04:04 PM EDT: The Chariot endorsed Malicious Rigel.
5/27/2022, 3:04:04 PM EDT: The Chariot endorsed Myuri.
5/27/2022, 3:03:57 PM EDT: The Chariot withdrew its endorsement from Malicious Rigel.
by Syberis » Fri May 27, 2022 3:00 pm
Sedgistan wrote:I will see if I can get an Admin to comment on more technical matters, but I'm not making any promises - it's taken us three months to get to this point.
In case it's not clear, this whole situation has been frustrating for staff as well, both mods and admins. We are considering what can be done to avoid a repeat.
If you're asking for examples of the illegal behaviour, the majority of that comes in the form of server logs, which I'm not going to reformat for the sake of publishing (sorry; I've also spent a significant amount of my own time on the Reliant case and trying to get us to a resolution on it, and there's only so much more I'll put into it)
In case it's not clear, this whole situation has been frustrating for staff as well, both mods and admins.
Zaolat wrote:WHO THE F*** IS SYBERIS
by Custadia » Fri May 27, 2022 3:19 pm
Sedgistan wrote:We believe it is highly likely that those players that benefited from using Reliant in an illegal fashion could not have been unaware that they were violating the rules.
by Bormiar » Fri May 27, 2022 3:58 pm
by Roavin » Fri May 27, 2022 5:27 pm
28/05/2022, 1:52:16 CEST: Kutumal XVI endorsed Ancient Republics.
28/05/2022, 1:52:14 CEST: Kutumal XVI endorsed Ghojingles.
28/05/2022, 1:52:13 CEST: Kutumal XVI endorsed Arachnostan.
19955 825.884666 192.168.2.112 104.25.62.43 HTTP2 173 HEADERS[449]: GET /page=ajax2/a=refresh/nation=kutumal_xvi
19957 825.962381 192.168.2.112 104.25.62.43 HTTP2 268 HEADERS[451]: POST /cgi-bin/endorse.cgi/script=relendo_by_roavin/userclick=1653695528329
19958 825.962415 192.168.2.112 104.25.62.43 HTTP2 440 DATA[451]
19962 826.422941 104.25.62.43 192.168.2.112 HTTP2 479 HEADERS[449]: 200 OK, DATA[449]
19963 826.422941 104.25.62.43 192.168.2.112 HTTP2 1105 DATA[449]
19965 826.425197 104.25.62.43 192.168.2.112 HTTP2 1248 DATA[449]
19966 826.425775 192.168.2.112 104.25.62.43 HTTP2 89 WINDOW_UPDATE[0]
19967 826.425918 104.25.62.43 192.168.2.112 HTTP2 95 DATA[449]
19968 826.425918 104.25.62.43 192.168.2.112 HTTP2 132 DATA[449]
19969 826.425918 104.25.62.43 192.168.2.112 HTTP2 86 DATA[449]
19970 826.425918 104.25.62.43 192.168.2.112 HTTP2 85 DATA[449] (text/html)
19974 826.512435 104.25.62.43 192.168.2.112 HTTP2 621 HEADERS[451]: 302 Found, DATA[451]
19975 826.512435 104.25.62.43 192.168.2.112 HTTP2 85 DATA[451] (text/html)
19977 826.517191 192.168.2.112 104.25.62.43 HTTP2 2313 HEADERS[453]: GET /nation=arachnostan
19981 826.714179 104.25.62.43 192.168.2.112 HTTP2 757 HEADERS[453]: 200 OK, DATA[453]
19982 826.714179 104.25.62.43 192.168.2.112 HTTP2 138 DATA[453]
19984 826.714419 104.25.62.43 192.168.2.112 HTTP2 1077 DATA[453]
19985 826.716181 104.25.62.43 192.168.2.112 HTTP2 1206 DATA[453]
19987 826.718149 104.25.62.43 192.168.2.112 HTTP2 209 DATA[453]
19988 826.728027 104.25.62.43 192.168.2.112 HTTP2 1020 DATA[453]
19992 826.763176 104.25.62.43 192.168.2.112 HTTP2 1372 DATA[453]
19995 826.763707 104.25.62.43 192.168.2.112 HTTP2 228 DATA[453]
19997 826.885678 104.25.62.43 192.168.2.112 HTTP2 763 DATA[453]
19998 826.886142 104.25.62.43 192.168.2.112 HTTP2 85 DATA[453] (text/html)
20002 827.346487 192.168.2.112 104.25.62.43 HTTP2 227 HEADERS[455]: POST /cgi-bin/endorse.cgi/script=relendo_by_roavin/userclick=1653695529713
20003 827.346524 192.168.2.112 104.25.62.43 HTTP2 439 DATA[455]
20006 827.504822 192.168.2.112 104.25.62.43 HTTP2 190 HEADERS[457]: GET /images/banners/p20.jpg
20008 827.538912 104.25.62.43 192.168.2.112 HTTP2 880 HEADERS[457]: 200 OK, DATA[457]
20019 827.540653 104.25.62.43 192.168.2.112 HTTP2 1213 DATA[457], DATA[457]
20038 827.542891 104.25.62.43 192.168.2.112 HTTP2 928 DATA[457]
20042 827.543651 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[457], DATA[457] [TCP segment of a reassembled PDU]
20059 827.545409 104.25.62.43 192.168.2.112 HTTP2 831 DATA[457]
20071 827.547160 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[457], DATA[457], DATA[457] [TCP segment of a reassembled PDU]
20077 827.547658 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[457] [TCP segment of a reassembled PDU]
20095 827.550149 104.25.62.43 192.168.2.112 HTTP2 457 DATA[457]
20113 827.552400 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[457], DATA[457], DATA[457]
20131 827.554657 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[457] [TCP segment of a reassembled PDU]
20146 827.556308 104.25.62.43 192.168.2.112 HTTP2 746 DATA[457], DATA[457], DATA[457], DATA[457] (JPEG JFIF image)
20148 827.622402 104.25.62.43 192.168.2.112 HTTP2 598 HEADERS[455]: 302 Found, DATA[455]
20149 827.622402 104.25.62.43 192.168.2.112 HTTP2 85 DATA[455] (text/html)
20151 827.626134 192.168.2.112 104.25.62.43 HTTP2 146 HEADERS[459]: GET /nation=ghojingles
20153 827.825162 104.25.62.43 192.168.2.112 HTTP2 807 HEADERS[459]: 200 OK, DATA[459]
20154 827.825162 104.25.62.43 192.168.2.112 HTTP2 138 DATA[459]
20156 827.825644 104.25.62.43 192.168.2.112 HTTP2 1079 DATA[459]
20157 827.827538 104.25.62.43 192.168.2.112 HTTP2 1218 DATA[459]
20158 827.827538 104.25.62.43 192.168.2.112 HTTP2 209 DATA[459]
20160 827.834918 104.25.62.43 192.168.2.112 HTTP2 1021 DATA[459]
20167 827.994893 104.25.62.43 192.168.2.112 HTTP2 1172 DATA[459]
20169 827.995129 104.25.62.43 192.168.2.112 HTTP2 932 DATA[459]
20170 827.995129 104.25.62.43 192.168.2.112 HTTP2 86 DATA[459]
20171 827.995129 104.25.62.43 192.168.2.112 HTTP2 85 DATA[459] (text/html)
20178 828.834576 192.168.2.112 104.25.62.43 HTTP2 2435 HEADERS[461]: POST /cgi-bin/endorse.cgi/script=relendo_by_roavin/userclick=1653695531202
20179 828.834615 192.168.2.112 104.25.62.43 HTTP2 446 DATA[461]
20183 829.066377 104.25.62.43 192.168.2.112 HTTP2 638 HEADERS[461]: 302 Found, DATA[461]
20184 829.066377 104.25.62.43 192.168.2.112 HTTP2 85 DATA[461] (text/html)
20186 829.073088 192.168.2.112 104.25.62.43 HTTP2 136 HEADERS[463]: GET /nation=ancient_republics
20188 829.272117 104.25.62.43 192.168.2.112 HTTP2 836 HEADERS[463]: 200 OK, DATA[463]
20189 829.273362 104.25.62.43 192.168.2.112 HTTP2 1071 DATA[463]
20191 829.274109 104.25.62.43 192.168.2.112 HTTP2 1207 DATA[463]
20192 829.275096 104.25.62.43 192.168.2.112 HTTP2 209 DATA[463]
20194 829.281619 104.25.62.43 192.168.2.112 HTTP2 1024 DATA[463]
20198 829.440599 104.25.62.43 192.168.2.112 HTTP2 1410 DATA[463]
20201 829.441111 104.25.62.43 192.168.2.112 HTTP2 1010 DATA[463]
20203 829.441348 104.25.62.43 192.168.2.112 HTTP2 853 DATA[463]
20204 829.441348 104.25.62.43 192.168.2.112 HTTP2 85 DATA[463] (text/html)
28/05/2022, 2:14:44 CEST: Kutumal XVI endorsed Deltarios.
28/05/2022, 2:14:44 CEST: Kutumal XVI endorsed Byzant.
28/05/2022, 2:14:43 CEST: Kutumal XVI endorsed Provinces of North America.
28/05/2022, 2:14:43 CEST: Kutumal XVI endorsed The Horror Channel.
43042 2175.509801 192.168.2.112 104.25.62.43 HTTP2 343 HEADERS[679]: POST /cgi-bin/endorse.cgi
43043 2175.509835 192.168.2.112 104.25.62.43 HTTP2 147 DATA[679] (application/x-www-form-urlencoded)
43096 2175.933387 192.168.2.112 104.25.62.43 HTTP2 603 HEADERS[681]: POST /cgi-bin/endorse.cgi
43097 2175.933424 192.168.2.112 104.25.62.43 HTTP2 155 DATA[681] (application/x-www-form-urlencoded)
43122 2176.077925 104.25.62.43 192.168.2.112 HTTP2 669 HEADERS[679]: 302 Found, DATA[679]
43123 2176.077925 104.25.62.43 192.168.2.112 HTTP2 85 DATA[679] (text/html)
43126 2176.081302 192.168.2.112 104.25.62.43 HTTP2 236 HEADERS[683]: GET /nation=the_horror_channel
43148 2176.279161 104.25.62.43 192.168.2.112 HTTP2 836 HEADERS[683]: 200 OK, DATA[683]
43149 2176.279161 104.25.62.43 192.168.2.112 HTTP2 138 DATA[683]
43151 2176.280169 192.168.2.112 104.25.62.43 HTTP2 89 WINDOW_UPDATE[0]
43152 2176.280392 104.25.62.43 192.168.2.112 HTTP2 1077 DATA[683]
43154 2176.281641 104.25.62.43 192.168.2.112 HTTP2 1175 DATA[683]
43156 2176.282388 104.25.62.43 192.168.2.112 HTTP2 206 DATA[683]
43157 2176.290925 104.25.62.43 192.168.2.112 HTTP2 1054 DATA[683]
43169 2176.336183 192.168.2.112 104.25.62.43 HTTP2 1650 HEADERS[685]: POST /cgi-bin/endorse.cgi
43170 2176.336219 192.168.2.112 104.25.62.43 HTTP2 138 DATA[685] (application/x-www-form-urlencoded)
43212 2176.449667 104.25.62.43 192.168.2.112 HTTP2 1369 DATA[683]
43215 2176.449963 104.25.62.43 192.168.2.112 HTTP2 767 DATA[683]
43216 2176.449963 104.25.62.43 192.168.2.112 HTTP2 86 DATA[683]
43217 2176.449963 104.25.62.43 192.168.2.112 HTTP2 85 DATA[683] (text/html)
43225 2176.485000 192.168.2.112 104.25.62.43 HTTP2 186 HEADERS[687]: GET /images/banners/l1.jpg
43226 2176.493644 104.25.62.43 192.168.2.112 HTTP2 625 HEADERS[681]: 302 Found, DATA[681]
43227 2176.493644 104.25.62.43 192.168.2.112 HTTP2 85 DATA[681] (text/html)
43231 2176.503699 192.168.2.112 104.25.62.43 HTTP2 399 HEADERS[689]: GET /nation=provinces_of_north_america
43232 2176.505646 104.25.62.43 192.168.2.112 HTTP2 687 HEADERS[687]: 200 OK, DATA[687]
43245 2176.506891 104.25.62.43 192.168.2.112 HTTP2 123 DATA[687], DATA[687]
43263 2176.509145 104.25.62.43 192.168.2.112 HTTP2 928 DATA[687]
43266 2176.509640 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[687], DATA[687] [TCP segment of a reassembled PDU]
43268 2176.509920 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[687] [TCP segment of a reassembled PDU]
43287 2176.512125 104.25.62.43 192.168.2.112 HTTP2 555 DATA[687]
43306 2176.514639 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[687], DATA[687], DATA[687]
43325 2176.516891 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[687] [TCP segment of a reassembled PDU]
43326 2176.516891 104.25.62.43 192.168.2.112 HTTP2 265 DATA[687], DATA[687]
43327 2176.516891 104.25.62.43 192.168.2.112 HTTP2 85 DATA[687] (JPEG JFIF image)
43379 2176.669957 192.168.2.112 104.25.62.43 HTTP2 537 HEADERS[691]: POST /cgi-bin/endorse.cgi
43380 2176.669987 192.168.2.112 104.25.62.43 HTTP2 135 DATA[691] (application/x-www-form-urlencoded)
43389 2176.701374 104.25.62.43 192.168.2.112 HTTP2 804 HEADERS[689]: 200 OK, DATA[689]
43390 2176.701877 104.25.62.43 192.168.2.112 HTTP2 1074 DATA[689]
43392 2176.703132 104.25.62.43 192.168.2.112 HTTP2 1179 DATA[689]
43393 2176.706284 104.25.62.43 192.168.2.112 HTTP2 280 DATA[689]
43396 2176.711797 104.25.62.43 192.168.2.112 HTTP2 1018 DATA[689]
43407 2176.748698 192.168.2.112 104.25.62.43 HTTP2 1724 HEADERS[693]: GET /images/ns-inhouse-skyscraper_1.png
43430 2176.773134 104.25.62.43 192.168.2.112 HTTP2 928 HEADERS[693]: 200 OK, DATA[693]
43441 2176.774385 104.25.62.43 192.168.2.112 HTTP2 253 DATA[693], DATA[693], DATA[693]
43442 2176.774385 104.25.62.43 192.168.2.112 HTTP2 85 DATA[693] (PNG)
43468 2176.913879 104.25.62.43 192.168.2.112 HTTP2 596 HEADERS[685]: 302 Found, DATA[685]
43469 2176.913879 104.25.62.43 192.168.2.112 HTTP2 85 DATA[685] (text/html)
43471 2176.916791 192.168.2.112 104.25.62.43 HTTP2 163 HEADERS[695]: GET /nation=deltarios
43473 2176.920869 104.25.62.43 192.168.2.112 HTTP2 626 HEADERS[691]: 302 Found, DATA[691]
43474 2176.920869 104.25.62.43 192.168.2.112 HTTP2 85 DATA[691] (text/html)
43476 2176.923626 192.168.2.112 104.25.62.43 HTTP2 405 HEADERS[697]: GET /nation=byzant
43495 2176.970629 104.25.62.43 192.168.2.112 HTTP2 248 DATA[689], DATA[689]
43516 2177.026834 192.168.2.112 104.25.62.43 HTTP2 187 HEADERS[699]: GET /images/banners/t15.jpg
43535 2177.054365 104.25.62.43 192.168.2.112 HTTP2 672 HEADERS[699]: 200 OK, DATA[699]
43546 2177.055872 104.25.62.43 192.168.2.112 HTTP2 428 DATA[699], DATA[699]
43565 2177.058114 104.25.62.43 192.168.2.112 HTTP2 928 DATA[699]
43570 2177.058639 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[699], DATA[699] [TCP segment of a reassembled PDU]
43589 2177.061093 104.25.62.43 192.168.2.112 HTTP2 213 DATA[699]
43595 2177.061702 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[699], DATA[699] [TCP segment of a reassembled PDU]
43607 2177.063370 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[699], DATA[699] [TCP segment of a reassembled PDU]
43624 2177.065121 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[699] [TCP segment of a reassembled PDU]
43641 2177.067623 104.25.62.43 192.168.2.112 HTTP2 1331 DATA[699], DATA[699]
43642 2177.067623 104.25.62.43 192.168.2.112 HTTP2 112 DATA[699]
43660 2177.069880 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[699] [TCP segment of a reassembled PDU]
43661 2177.069880 104.25.62.43 192.168.2.112 HTTP2 359 DATA[699], DATA[699], DATA[699] (JPEG JFIF image)
43666 2177.115379 104.25.62.43 192.168.2.112 HTTP2 845 HEADERS[695]: 200 OK, DATA[695]
43667 2177.115621 104.25.62.43 192.168.2.112 HTTP2 1081 DATA[695]
43669 2177.116629 104.25.62.43 192.168.2.112 HTTP2 1184 DATA[695]
43670 2177.116851 104.25.62.43 192.168.2.112 HTTP2 210 DATA[695]
43672 2177.124135 104.25.62.43 192.168.2.112 HTTP2 1000 DATA[695]
43673 2177.125871 104.25.62.43 192.168.2.112 HTTP2 752 HEADERS[697]: 200 OK, DATA[697]
43674 2177.125871 104.25.62.43 192.168.2.112 HTTP2 138 DATA[697]
43676 2177.126623 104.25.62.43 192.168.2.112 HTTP2 1076 DATA[697]
43678 2177.127872 104.25.62.43 192.168.2.112 HTTP2 1178 DATA[697]
43679 2177.128345 104.25.62.43 192.168.2.112 HTTP2 207 DATA[697]
43681 2177.143080 104.25.62.43 192.168.2.112 HTTP2 974 DATA[697]
43682 2177.143080 104.25.62.43 192.168.2.112 HTTP2 86 DATA[689]
43683 2177.143080 104.25.62.43 192.168.2.112 HTTP2 85 DATA[689] (text/html)
43704 2177.202676 192.168.2.112 104.25.62.43 HTTP2 480 HEADERS[701]: GET /images/banners/b11.jpg
43706 2177.224368 104.25.62.43 192.168.2.112 HTTP2 690 HEADERS[701]: 200 OK, DATA[701]
43717 2177.225677 104.25.62.43 192.168.2.112 HTTP2 528 DATA[701], DATA[701]
43736 2177.230724 104.25.62.43 192.168.2.112 HTTP2 928 DATA[701]
43739 2177.230724 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[701], DATA[701] [TCP segment of a reassembled PDU]
43740 2177.230724 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[701] [TCP segment of a reassembled PDU]
43754 2177.230876 104.25.62.43 192.168.2.112 HTTP2 146 DATA[701]
43772 2177.233151 104.25.62.43 192.168.2.112 HTTP2 1466 DATA[701], DATA[701], DATA[701]
43780 2177.238958 104.25.62.43 192.168.2.112 HTTP2 659 DATA[701], DATA[701] (JPEG JFIF image)
43796 2177.285618 104.25.62.43 192.168.2.112 HTTP2 1375 DATA[695]
43797 2177.285618 104.25.62.43 192.168.2.112 HTTP2 85 DATA[695] (text/html)
43801 2177.296875 104.25.62.43 192.168.2.112 HTTP2 1449 DATA[697]
43804 2177.297120 104.25.62.43 192.168.2.112 HTTP2 924 DATA[697]
43806 2177.297598 104.25.62.43 192.168.2.112 HTTP2 483 DATA[697]
43807 2177.297598 104.25.62.43 192.168.2.112 HTTP2 85 DATA[697] (text/html)
// ==UserScript==
// @name Relendo
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author Roavin+Haku
// @match https://www.nationstates.net/nation=*
// @match https://www.nationstates.net/template-overall=none/nation=*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// ==/UserScript==
let inQuery = false;
function makeAjaxQuery(url, method, data)
{
let ajaxButtons = document.querySelectorAll('.ajaxbutton');
return new Promise((resolve, reject) =>
{
function onLoadStart(e)
{
startTime = Date.now();
// In case we discover we somehow made a new request before our last one concluded,
// immediately abort it
if (inQuery)
xhr.abort();
// Each button with class 'ajaxbutton' make a request to the NS webiste.
// In order to abide by rule "4. Avoid Simultaneous Requests" we will keep all buttons
// with this class disabled until we receive a complete response from the NS server.
for (let i = 0; i != ajaxButtons.length; i++)
ajaxButtons[i].disabled = true;
inQuery = true;
}
async function onLoadEnd(e)
{
// We've received a complete response from the NS server, so we can allow more user input
for (let i = 0; i != ajaxButtons.length; i++)
ajaxButtons[i].disabled = false;
inQuery = false;
let loadtime = document.querySelector('#load-time');
if (loadtime !== null)
loadtime.innerHTML = String(Date.now() - startTime) + ' ms';
resolve(xhr.response);
}
let startTime = 0;
let xhr = new XMLHttpRequest();
xhr.addEventListener('loadstart', onLoadStart);
xhr.addEventListener('loadend', onLoadEnd);
// Recommended by Eluvatar: https://forum.nationstates.net/viewtopic.php?p=30083979#p30083979
const fixedUrl = url + "/script=relendo_by_roavin/userclick=" + Date.now();
xhr.open(method, fixedUrl);
xhr.responseType = 'text';
if (data !== undefined)
xhr.send(data);
else
xhr.send();
});
}
function canonicalize(str)
{
return str.trim().toLowerCase().replace(/ /g, '_');
}
function pretty(str)
{
return str.replace(/_/g, ' ').replace(/\w+\s*/g, (txt) => txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase());
}
const localId = document.querySelector('input[name=localid]').value;
function getUrlParameters(url)
{
const reg = new RegExp('\/([A-Za-z0-9-]+?)=([A-Za-z0-9_.+]+)', 'g');
let params = {};
let match = [];
while ((match = reg.exec(url)) !== null)
params[match[1]] = match[2];
return params;
}
const urlParameters = getUrlParameters(document.URL);
const nationTitle = document.querySelector('.newtitlename');
const crossButton = document.createElement('input');
crossButton.setAttribute('type', 'button');
crossButton.setAttribute('value', 'Set Cross');
crossButton.setAttribute('class', 'button');
nationTitle.appendChild(crossButton);
function getNationEndorsements()
{
let names = [];
document.querySelectorAll(".unbox a.nlink").forEach((elm) => {
var name = elm.href.substring(elm.href.indexOf("=") + 1);
names.push(name);
});
return names;
}
console.log(getNationEndorsements());
async function setCrossClick(e)
{
const nationName = urlParameters['nation'];
let endorsingNations = await getNationEndorsements();
const sidePanel = document.querySelector('#panel');
const endorsementList = document.createElement('ul');
for (let i = 0; i !== endorsingNations.length; i++) {
const listItem = document.createElement('li');
const endorseButton = document.createElement('input');
endorseButton.setAttribute('type', 'button');
endorseButton.setAttribute('class', 'ajaxbutton cross');
endorseButton.setAttribute('value', "Endorse " + pretty(endorsingNations[i]));
async function onEndorseClick(e)
{
let formData = new FormData();
formData.set('nation', endorsingNations[i]);
formData.set('localid', localId);
formData.set('action', 'endorse');
await makeAjaxQuery('/cgi-bin/endorse.cgi', 'POST', formData);
e.target.parentElement.removeChild(e.target);
};
endorseButton.addEventListener('click', onEndorseClick);
listItem.appendChild(endorseButton);
endorsementList.appendChild(listItem);
}
sidePanel.appendChild(endorsementList);
}
crossButton.addEventListener('click', setCrossClick);
by Tinhampton » Sat May 28, 2022 3:55 am
by Crazy girl » Sat May 28, 2022 4:11 am
by Roavin » Sat May 28, 2022 4:47 am
Regarding Reliant:
I had previously submitted a GHR about finding a simultaneity bug within Reliant. I've done some tests, and it turns out that this is not the issue. I think I have, however, found the real issue, which I'll detail in a follow-up.
Now, the reason why loadstart isn't the issue (as I suspected before) is that the loadstart event, at least in Chromium, isn't fired when I expected. To quote MDN (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/loadstart_event):
> The loadstart event is fired when a request has started to load data.
I interpreted that to mean that the actual loading of the data has begun, i.e. it'd be fired when the response headers are received or maybe even when the first byte of content is received. The truth, however, is that at least in Chromium, loadstart is synchronously fired when XMLHttpRequest.send() is called. I confirmed that with a test (Tampermonkey script attached) plus by looking at the Chromium source code:
https://source.chromium.org/chromium/ch ... prequest.c
As you can see, XMLHttpRequest::send() will (in non-error cases) call XMLHttpRequest::CreateRequest(), which is what will call the loadstart event handler before even returning. (NB: the _async flag says whether the XHR-object is async, which it is and should always be)
This can be tested with the Tampermonkey printed below by opening page=blank/, pressing the "do it" button, and observing what happens in the text area. The variable "useReliantStyleHandling" in the script can even be set to true to disable the "do it" button in loadstart rather than before send(), like Reliant does (not that it makes a difference). An example output from just now looks like this:
2022-04-15T21:24:18.129Z Button press
2022-04-15T21:24:18.131Z XHR readystate=1
2022-04-15T21:24:18.131Z before send()
2022-04-15T21:24:18.132Z XHR loadstart
2022-04-15T21:24:18.132Z after send()
2022-04-15T21:24:18.688Z XHR readystate=2
2022-04-15T21:24:18.689Z XHR readystate=3
2022-04-15T21:24:18.740Z XHR readystate=3
2022-04-15T21:24:18.864Z XHR readystate=3
2022-04-15T21:24:18.865Z XHR readystate=4
2022-04-15T21:24:18.866Z XHR loadend
As you can see, loadstart is fired synchronously from send().
- Code: Select all
// ==UserScript==
// @name loadstart test
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author Roavin
// @match https://www.nationstates.net/page=blank
// @icon https://www.google.com/s2/favicons?sz=64&domain=nationstates.net
// @grant none
// ==/UserScript==
(function() {
'use strict';
// true if simultaneity blocking is performed in loadstart rather than when beginning the XHR
var useReliantStyleHandling = false;
var elmContent = document.getElementById("content");
console.log(elmContent);
var elmLog = document.createElement('textarea');
elmLog.rows = 20;
elmLog.cols = 100;
elmContent.appendChild(elmLog);
function log(str)
{
elmLog.value += (new Date()).toISOString() + ' ' + str + '\n';
elmLog.scrollTop = elmLog.scrollHeight;
}
var currentXhr = null;
var elmButton = document.createElement('button');
elmButton.id = "simul_doit";
elmButton.innerText = "do it";
elmButton.onclick = function() {
log("Button press");
if (currentXhr != null)
return;
if (!useReliantStyleHandling)
elmButton.disabled = true;
currentXhr = new XMLHttpRequest();
currentXhr.addEventListener('loadstart', function() {
log("XHR loadstart");
if (useReliantStyleHandling)
elmButton.disabled = true;
});
currentXhr.addEventListener('loadend', function() {
log("XHR loadend");
elmButton.disabled = false;
currentXhr = null;
});
currentXhr.addEventListener('readystatechange', function(event) {
log("XHR readystate=" + currentXhr.readyState.toString());
});
var url = "https://www.nationstates.net/page=blank/script=simultest_by_roavin/userclick=" + Date();
currentXhr.open("GET", url);
currentXhr.responseType = 'text';
log("before send()");
currentXhr.send();
log("after send()");
};
elmContent.appendChild(elmButton);
})();
Regarding Reliant:
As we were discussing Mall's most recent reply, we (collectively) stumbled upon what might be leading to the delays in "our own review on the back end to analyze what specific players did, when they did it, and what benefit was conferred by it", and it doesn't even have anything to do with Reliant itself.
Some players were using Reliant at update with VPNs despite normally operating NS without one. The reason here is simple, and explained in more detail below, but TL;DR it's to cut short the time it takes to do TLS handshakes between CloudFlare and the actual NS server, which depending on the geographical location of the player can improve the request latency by up to half a second. This roundtrip latency is a topic I had discussed with both [v] and Elu many times, as far back as February 2017 (!).
For me personally, not using a VPN meant I had page loads of 650-700ms with the occasional 250ms inbetween, while with a VPN in Seattle I could get relatively consistent 300ms page loads, a much improved experience.
The Reliant users that I know of that used a VPN in this way are Tim, Sir Merlin, and myself. I also know that Emodea and several others use a VPN in this fashion, but not with Reliant (they never got access to Reliant).
Could that be one of the issues, and if so, would it help if I were to reach out to Reliant users and provide a more definitive list of who used Reliant with a VPN?
---
Detailed explanation:
NS is accessed with CloudFlare, with each user's requests being routed to the closest CF ray (in my case, Frankfurt in Germany), which in turn then sends the request to the real NationStates IP. After NS switched to HTTPs (late 2016 or very early 2017, I don't remember), people in North America had no issues but those of us in Europe or elsewhere had much increased latencies to the site, which negatively impacted particularly those of us participating in military gameplay.
After some back and forth, I was able to reverse engineer the issue (which was later confirmed to me by Elu): While the Keep-Alive time of each player's connection to CloudFlare is huge, the Keep-Alive between CloudFlare and NS is only one second. Once the HTTP connection between CF and NS is down and needs to be established again, that requires a further TLS handshake, which adds an additional roundtrip. When operating from a CF ray in, say, Vancouver, that's not an issue, since the latencis are so short that a round trip is another 20-40ms. But from Frankfurt, the TLS handshake roundtrip alone costs around 400-500ms.
(CloudFlare actually recommends much higher Keep-Alive for the site's HTTP server, though NS uses Apache and Apache has trouble with too many simultaneous connections unlike newer HTTP servers like nginx - all of this I've discussed with Elu before).
Elu later made a change to NS' Apache settings that improved this slightly, but it's still an issue that crops up for military gameplayers across the (non-North American) world. Later, a player discovered that using a VPN to connect to a CF ray closer to where the NS servers are removes that issue - while the full round trip latency remains the same, the frequent TLS handshakes now only have the short roundtrip latency.
Regarding Reliant:
I do apologize that this follow-up took as long as it did. To summarize, I believe I have found the problem. When a user uses Reliant and Breeze++ at the same time, simultaneous requests are possible. This is a simultaneity violation resulting not from bugs (or malice) in either Reliant or Breeze, but rather due to the player running both tools. I have reproduced this behavior with a custom script (attached below). The tell-tale sign in the server logs should be that there are two simultaneous requests, one identifying as Reliant and the other one not identifying at all. I've furthermore analyzed possible instances where this could lead to a tangible gameplay benefit, and have found none. I demonstrated a first version of this hypothesis to via screenshare last weekend; this GHR contains much more analysis.
That using both tools at the same time could lead to two simultaneous requests is intuitively apparent: Both tools have keybinds, so it's easy to conceive of cases where a single key leads to two separate actions at the same time. The question is which such bindings could lead to such a case, and that is a much more difficult question to answer, because most keybinds in both Reliant and Breeze do different things based on the page they are on; in addition, Reliant allows the user to freely change their keybinds to their liking, and so there are a lot of different permutations. So, I took a different approach instead in analyzing this issue, quickly coming up with a theoretical reproduction.
I observed that Breeze will, upon a key press, do one of the folllowing: refresh, navigate to another page (via location.href), click an existing NS button, or do nothing. Reliant will, upon a key press, do any of those or issue an XHR. I noticed that for these purposes, a refresh and changing location.reload() act identically. I then wrote a Tampermonkey script (attached to this GHR) that registers itself for document 'keyup' events twice, once to simulate Reliant and once to simulate Breeze, and tested various permutations.
For all permutations with any combination of refreshes, href changes, or clicks (except two clicks), the two changes are so quick that the browser doesn't even send a request for the first href change (confirmed with Wireshark). There is a remote possibility that JS execution is delayed enough between setting the first href and setting the second one - I tested this case (with an explicit delay of 300ms) and that would lead to a second requst, but I think it's reasonable to consider this highly unlikely. Therefore, no violation here.
(NB: I could not get Wireshark to decode QUIC packets, so I turned off QUIC support in my browser and instead observed the HTTP2 traffic. I don't think this changes the result, however, since QUIC is just another transport for the same kind of thing issued to the CloudFlare server, and CloudFlare will interact with NS independently of that)
If two clicks are executed at the same time, the browser doesn't create a second request, therefore no violation here.
If a NS button that is hijacked to send a XHR is clicked twice, it only sends one XHR since the button's event handler calls preventDefault(), and therefore the second call never arrives.
Finally, If any one of a refresh, href change, or click happens at the same time as a XHR, then two simultaneous requests are sent. About half the time (on my machine), the XHR will progress to actually receiving data (readyState == 3) before the page is reloaded; in other words, there are two simultaneous requests on the wire in this situation, and therefore a simultaneity violation.
In conclusion, a simultaneity violation occurs only when a key leads Reliant to issue a XHR and Breeze to issue some other request at the same time.
So, now we have a repro for the bug and can move forward to determine when in practice it would appear. This is rather difficult however, due to the staggering amount of possible permutations to step through - both breeze and reliant do different things depending on the current page, and Reliant has configurable keybinds that could map any Reliant handler with any Breeze key. I had begun to make a list of all possible permutations in an excel file, but decided to not pursue that further due to the sheer amount of busy work to put that together. But I don't think such a master list is necessary anyway, for two reasons. First, It's much easier in reverse to verify that a pair of requests visible in the server log could be caused by Reliant+Breeze interplay, and if given such pairs of requests, I could absolutely do that if requested. Second, and more importantly, we already know that a simultaneity violation occurs.
Even though I'm (obviously) biased in this regard, I instead investigated the gameplay benefit that a player could receive from running both tools at the same time. My thinking here is this: For any simultaneous requests as above, the result of one request is thrown away and never displayed. Therefore, if both requests are idempotent, there is no gameplay benefit, only unnecessary server load. If one request is not idempotent and is the one whose result is being shown, the same principle applies. However, if a non-idempotent request is thrown away in favor of showing the result of an idempotent request, there could be a benefit there (saving a load that would be required to go to the other page after performing the action), and if both requests are non-idempotent, it's most likely a gameplay benefit.
(NB: I considered all non-idempotent requests rather than just restricted actions, because adding a nation to the dossier is arguably not a restricted action but is most certainly not idempotent and is frequently done by using Reliant idiomatically)
Reliant's main page does a lot of XHRs in response to keys. Breeze does not interact with it at all, except to refresh (N). This is not a benefit however, since the main page initially does not show (or even have) information queried from NS, but rather this information is retrieved via XHRs in response to clicks or button presses. So if a non-idempotent action is performed at the same time as a refresh through Breeze, the non-idempotent action is performed but the resulting page is a fresh instance of the main page containing no data, so if anything it's a gameplay detriment for this to happen.
Reliant's prep page also does XHRs and is only interacted with by Breeze through refreshes. Here, a refresh at the same time as an action is not a gameplay detriment (since the page is loaded again with information from Reliant's local state), but there is also no advantage there.
On region pages, Reliant hijacks the move button to replace it with a XHR. Breeze clicks that button, but no violation occurs as explained above. Reliant also adds other buttons but Breeze does not interact with them. If the buttons were brought to a state where Reliant would issue a restricted action bound to the M key, which also triggers a Breeze move, that also won't lead to a violation since the move button is now subject to Reliant's simultaneity handling. If anything is bound to Breeze' N key to refresh, that would lead to simultaneous requests but without gameplay benefit since the target page is once again the region page but with its Reliant state reset (same as with the main page).
On nation pages, Reliant does not hijack the endorsement button, and adds its own buttons that can be used to issue other endorsements (clickable through a keybind). Here, at first glance, one could think that two non-idempotent actions could take place at the same time: If the list of nations to cross-endorse with is already loaded, and Reliant's endorsekey is mapped to E or C, then pressing that key would endorse both the nation in question as well as its first endorsee at the same time with simultaneous requests. However, Reliant prioritizes endorsing the target nation over processing the cross list, so this reverts to both Reliant and Breeze clicking a form button at the same time which, as described above, does not lead to simultaneous requests.
Putting this together, I could not find a case where there is a theoretical gameplay benefit to be had from using Reliant and Breeze at the same time. Once again, though, I am most certainly biased and also human, so I may have missed a case.
[the test script, totalling 4806 characters over 156 lines, was printed here in the original GHR, but it has been removed as the script violates simultaneity and I don't want to be dinged for it]
by Syberis » Sat May 28, 2022 7:57 am
Zaolat wrote:WHO THE F*** IS SYBERIS
by Roavin » Sat May 28, 2022 8:05 am
Syberis wrote:Great writeup Roavin. To your knowledge, was there any admin response to the GHRs sent
Syberis wrote:was any of the suggested lookup or testing performed?
by Roavin » Sat May 28, 2022 9:23 am
Sedgistan wrote:
- We do not believe it is likely that the script was written with the intention of operating illegally.
- The players who have developed and used Reliant have, to the best of our knowledge, cooperated in good faith with us since our announcement.
Sedgistan wrote:
- We do not believe it is likely that all usage of Reliant was illegal, and it is probable that it was only in some cases that it violated the rules.
Sedgistan wrote:
- Nonetheless, in those cases, the use of Reliant in an illegal fashion is likely to have provided in-game advantage to those using it, potentially significantly so in some cases.
Sedgistan wrote:This was observed with both requests to move region and to endorse nations - I don't think I need to explain the in-game benefit of carrying those out quicker?
Sedgistan wrote:
- We believe it is highly likely that those players that benefited from using Reliant in an illegal fashion could not have been unaware that they were violating the rules.
by Bormiar » Sat May 28, 2022 12:19 pm
Wymondham wrote:I just want to note that, around 20 minutes ago, GCR Delegate North East Somerset achieved 6 endorsements in a second with no scripts at all and no containers; despite living over 4,500 miles from vancouver with an internet speed of 18.4Mb/s download and 5.4Mb/s upload.
(Image)
You do not even need to live 100km from Vancouver or have 1.5Gb/s internet to manage 6 endorsements in a second, so it's not even as if Luca's endorsement rate is unique to even a small group of people, I have managed 4 endorsements in a second myself in the past without scripts. Would the moderation team therefore be able to explain how achieving 6 endorsements in a second can therefore be taken as an indication of rulebreaking activity when it can easily be achieved with no scripts by someone with a poor internet connection living over 4,500 miles away from the server?
If the moderation team would like more examples of this being possible with no scripts, crap ping and abysmal internet, I'm more than happy to try and find some more.
by Altmoras » Sat May 28, 2022 3:31 pm
Sedgistan wrote:If you're asking for examples of the illegal behaviour, the majority of that comes in the form of server logs, which I'm not going to reformat for the sake of publishing (sorry; I've also spent a significant amount of my own time on the Reliant case and trying to get us to a resolution on it, and there's only so much more I'll put into it). I don't mind posting the publicly observable national happenings that were cited in the original GHR report:
2/14/2022, 5:48:22 PM MST: Emnietom endorsed Lunaflower-2.
2/14/2022, 5:48:22 PM MST: Emnietom endorsed Nivilons.
2/14/2022, 5:48:22 PM MST: Emnietom endorsed Imperial Sword.
2/14/2022, 5:48:22 PM MST: Emnietom endorsed Zequinha do Abacaxi.
2/14/2022, 5:48:22 PM MST: Emnietom endorsed Expansivian Onionist Revolutionary Force.
2/14/2022, 5:48:22 PM MST: Emnietom endorsed Little Mermraider.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed Venicos Fiancee.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed The Airforce Guy.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed The Toukaian Night Bomber Squadron.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed Scorchy Boi 1.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed Tablerepublic.
2/14/2022, 5:55:57 PM MST: Lucabaduka endorsed Giraffe Liberator.
We believe it is highly likely that those players that benefited from using Reliant in an illegal fashion could not have been unaware that they were violating the rules.
by Syberis » Sun May 29, 2022 10:25 am
Zaolat wrote:WHO THE F*** IS SYBERIS
by Sedgistan » Sun May 29, 2022 12:57 pm
Advertisement
Users browsing this forum: Abyssaly, Cot Deviet, Ferret Civilization, Great Indonesian Republic, Kinegiener, Lunayria, Oiapoque-Calcoene
Advertisement