Merge branch 'master' of https://github.com/Anuken/Mindustry into tileable-logic-displays

# Conflicts:
#	core/assets/icons/icons.properties
#	core/assets/logicids.dat
This commit is contained in:
Anuken
2025-04-14 22:50:47 -04:00
494 changed files with 17743 additions and 9826 deletions

View File

@@ -73,7 +73,7 @@ jobs:
cd ../MindustryBuilds
echo "Updating version to ${RELEASE_VERSION:1}"
BNUM=$(($GITHUB_RUN_NUMBER + 1000))
echo versionName=7-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${BNUM} > version_fdroid.txt
echo versionName=8-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${BNUM} > version_fdroid.txt
git add .
git commit -m "Updating to build ${RELEASE_VERSION:1}"
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds

4
.gitignore vendored
View File

@@ -23,6 +23,7 @@ ios/libs/
/tools/build/
/tests/build/
/server/build/
ios/libs/
changelog
saves/
/core/assets-raw/fontgen/out/
@@ -167,3 +168,6 @@ android/libs/
# ignored due to frequent branch conflicts.
core/assets/logicids.dat
# project files for the sectors
core/assets-raw/sprites/ui/sectors/*.json

View File

@@ -13,11 +13,13 @@ If you are submitting a new block, make sure it has a name and description, and
### Do not make large changes before discussing them first.
If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) - either via PM or by posting in the `#pulls` channel.
For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it.
For most changes, this should not be necessary. I just want to know if you're doing something big, so I can offer advice and/or make sure you're not wasting your time on it.
### Do not make formatting PRs.
### Do not make formatting or "cleanup" PRs.
Yes, there are occurrences of trailing spaces, extra newlines, empty indents, and other tiny errors. No, I don't want to merge, view, or get notified by your 1-line PR fixing it. If you're implementing a PR with modification of *actual code*, feel free to fix formatting in the general vicinity of your changes, but please don't waste everyone's time with pointless changes.
I **especially** do not want to see PRs that apply any kind of automated analysis to the source code to "optimize" anything - my IDE can do that already. If the PR doesn't actually change anything useful, I'm not going to review or merge it.
## Style Guidelines
### Follow the formatting guidelines.
@@ -34,7 +36,7 @@ This means:
Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry.
### Do not use incompatible Java features (java.util.function, java.awt).
### Do not use incompatible Java features (java.util.function, java.awt, java.lang.Objects).
Android and RoboVM (iOS) do not support many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code.
If you need to use functional interfaces, use the ones in `arc.func`, which are more or less the same with different naming schemes.
@@ -66,7 +68,7 @@ Otherwise, use the `Tmp` variables for things like vector/shape operations, or c
If using a list, make it a static variable and clear it every time it is used. Re-use as much as possible.
### Avoid bloated code and unnecessary getters/setters.
This is situational, but in essence what it means is to avoid using any sort of getters and setters unless absolutely necessary. Public or protected fields should suffice for most things.
This is situational, but in essence, what it means is to avoid using any sort of getters and setters unless absolutely necessary. Public or protected fields should suffice for most things.
If something needs to be encapsulated in the future, IntelliJ can handle it with a few clicks.

View File

@@ -1,4 +1,4 @@
# Note: Server list review is currently on pause. No new servers will be merged until v8 is released!
# Note: The v7 server list is frozen. No new servers will be accepted. All v8 server PRs should be made [here](https://github.com/Anuken/MindustryServerList/blob/main/servers_v8.json).
*PRs to edit addresses of existing servers will still be accepted, although very infrequently.*

View File

@@ -17,7 +17,8 @@
android:usesCleartextTraffic="true"
android:appCategory="game"
android:label="@string/app_name"
android:fullBackupContent="@xml/backup_rules">
android:fullBackupContent="@xml/backup_rules"
android:largeHeap="true">
<meta-data android:name="android.max_aspect" android:value="2.1"/>
<activity
android:name="mindustry.android.AndroidLauncher"

View File

@@ -54,6 +54,8 @@ public class Annotations{
/** Whether to generate a base class for this components.
* An entity cannot have two base classes, so only one component can have base be true. */
boolean base() default false;
/** Whether to generate a proper interface for this component class. */
boolean genInterface() default true;
}
/** Indicates that a method is implemented by the annotation processor. */
@@ -182,18 +184,16 @@ public class Annotations{
/** A set of two booleans, one specifying server and one specifying client. */
public enum Loc{
/** Method can only be invoked on the client from the server. */
/** Server only. */
server(true, false),
/** Method can only be invoked on the server from the client. */
/** Client only. */
client(false, true),
/** Method can be invoked from anywhere */
/** Both server and client. */
both(true, true),
/** Neither server nor client. */
none(false, false);
/** If true, this method can be invoked ON clients FROM servers. */
public final boolean isServer;
/** If true, this method can be invoked ON servers FROM clients. */
public final boolean isClient;
Loc(boolean server, boolean client){
@@ -222,16 +222,16 @@ public class Annotations{
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Remote{
/** Specifies the locations from which this method can be invoked. */
/** Specifies the locations from which this method can cause remote invocations (This -> Remote) [Default: Server -> Client]. */
Loc targets() default Loc.server;
/** Specifies which methods are generated. Only affects server-to-client methods. */
/** Specifies which methods are generated. Only affects server-to-client methods (Server -> Client(s)) [Default: Server -> Client & Server -> All Clients]. */
Variant variants() default Variant.all;
/** The local locations where this method is called locally, when invoked. */
/** The locations where this method is called locally, when invoked locally (This -> This) [Default: No local invocations]. */
Loc called() default Loc.none;
/** Whether to forward this packet to all other clients upon receival. Client only. */
/** Whether the server should forward this packet to all other clients upon receival from a client (Client -> Server -> Other Clients). [Default: Don't Forward Client Invocations] */
boolean forward() default false;
/**

View File

@@ -19,6 +19,7 @@ import javax.annotation.processing.*;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import java.lang.annotation.*;
import java.util.*;
@SupportedAnnotationTypes({
"mindustry.annotations.Annotations.EntityDef",
@@ -97,6 +98,8 @@ public class EntityProcess extends BaseProcessor{
//create component interfaces
for(Stype component : allComponents){
TypeSpec.Builder inter = TypeSpec.interfaceBuilder(interfaceName(component))
.addModifiers(Modifier.PUBLIC).addAnnotation(EntityInterface.class);
@@ -116,45 +119,47 @@ public class EntityProcess extends BaseProcessor{
inter.addSuperinterface(ClassName.get(packageName, interfaceName(type)));
}
ObjectSet<String> signatures = new ObjectSet<>();
if(component.annotation(Component.class).genInterface()){
ObjectSet<String> signatures = new ObjectSet<>();
//add utility methods to interface
for(Smethod method : component.methods()){
//skip private methods, those are for internal use.
if(method.isAny(Modifier.PRIVATE, Modifier.STATIC)) continue;
//add utility methods to interface
for(Smethod method : component.methods()){
//skip private methods, those are for internal use.
if(method.isAny(Modifier.PRIVATE, Modifier.STATIC)) continue;
//keep track of signatures used to prevent dupes
signatures.add(method.e.toString());
//keep track of signatures used to prevent dupes
signatures.add(method.e.toString());
inter.addMethod(MethodSpec.methodBuilder(method.name())
.addJavadoc(method.doc() == null ? "" : method.doc())
.addExceptions(method.thrownt())
.addTypeVariables(method.typeVariables().map(TypeVariableName::get))
.returns(method.ret().toString().equals("void") ? TypeName.VOID : method.retn())
.addParameters(method.params().map(v -> ParameterSpec.builder(v.tname(), v.name())
.build())).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT).build());
}
//generate interface getters and setters for all "standard" fields
for(Svar field : component.fields().select(e -> !e.is(Modifier.STATIC) && !e.is(Modifier.PRIVATE) && !e.has(Import.class))){
String cname = field.name();
//getter
if(!signatures.contains(cname + "()")){
inter.addMethod(MethodSpec.methodBuilder(cname).addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC)
.addAnnotations(Seq.with(field.annotations()).select(a -> a.toString().contains("Null") || a.toString().contains("Deprecated")).map(AnnotationSpec::get))
.addJavadoc(field.doc() == null ? "" : field.doc())
.returns(field.tname()).build());
inter.addMethod(MethodSpec.methodBuilder(method.name())
.addJavadoc(method.doc() == null ? "" : method.doc())
.addExceptions(method.thrownt())
.addTypeVariables(method.typeVariables().map(TypeVariableName::get))
.returns(method.ret().toString().equals("void") ? TypeName.VOID : method.retn())
.addParameters(method.params().map(v -> ParameterSpec.builder(v.tname(), v.name())
.build())).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT).build());
}
//setter
if(!field.is(Modifier.FINAL) && !signatures.contains(cname + "(" + field.mirror().toString() + ")") &&
!field.annotations().contains(f -> f.toString().equals("@mindustry.annotations.Annotations.ReadOnly"))){
inter.addMethod(MethodSpec.methodBuilder(cname).addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC)
.addJavadoc(field.doc() == null ? "" : field.doc())
.addParameter(ParameterSpec.builder(field.tname(), field.name())
.addAnnotations(Seq.with(field.annotations())
.select(a -> a.toString().contains("Null") || a.toString().contains("Deprecated")).map(AnnotationSpec::get)).build()).build());
//generate interface getters and setters for all "standard" fields
for(Svar field : component.fields().select(e -> !e.is(Modifier.STATIC) && !e.is(Modifier.PRIVATE) && !e.has(Import.class))){
String cname = field.name();
//getter
if(!signatures.contains(cname + "()")){
inter.addMethod(MethodSpec.methodBuilder(cname).addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC)
.addAnnotations(Seq.with(field.annotations()).select(a -> a.toString().contains("Null") || a.toString().contains("Deprecated")).map(AnnotationSpec::get))
.addJavadoc(field.doc() == null ? "" : field.doc())
.returns(field.tname()).build());
}
//setter
if(!field.is(Modifier.FINAL) && !signatures.contains(cname + "(" + field.mirror().toString() + ")") &&
!field.annotations().contains(f -> f.toString().equals("@mindustry.annotations.Annotations.ReadOnly"))){
inter.addMethod(MethodSpec.methodBuilder(cname).addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC)
.addJavadoc(field.doc() == null ? "" : field.doc())
.addParameter(ParameterSpec.builder(field.tname(), field.name())
.addAnnotations(Seq.with(field.annotations())
.select(a -> a.toString().contains("Null") || a.toString().contains("Deprecated")).map(AnnotationSpec::get)).build()).build());
}
}
}
@@ -416,19 +421,34 @@ public class EntityProcess extends BaseProcessor{
//add all methods from components
for(ObjectMap.Entry<String, Seq<Smethod>> entry : methods){
if(entry.value.contains(m -> m.has(Replace.class))){
//check replacements
if(entry.value.count(m -> m.has(Replace.class)) > 1){
err("Type " + type + " has multiple components replacing method " + entry.key + ".");
}
Smethod base = entry.value.find(m -> m.has(Replace.class));
entry.value.clear();
entry.value.add(base);
}
//check multi return
if(entry.value.count(m -> !m.isAny(Modifier.NATIVE, Modifier.ABSTRACT) && !m.isVoid()) > 1){
err("Type " + type + " has multiple components implementing non-void method " + entry.key + ".");
//there are multiple @Replace implementations, or multiple non-void implementations.
if(entry.value.size > 1 && (entry.value.contains(m -> m.has(Replace.class)) || entry.value.count(m -> !m.isAny(Modifier.NATIVE, Modifier.ABSTRACT) && !m.isVoid()) > 1)){
//remove clutter
entry.value.removeAll(s -> s.is(Modifier.ABSTRACT));
Comparator<Smethod> comp = Structs.comps(
Structs.comps(
//highest priority first
Structs.comparingFloat(m -> m.has(MethodPriority.class) ? m.annotation(MethodPriority.class).value() : 0f),
//replacement means priority
Structs.comparingBool(m -> m.has(Replace.class))
),
//otherwise, the 'highest' subclass (most dependencies)
Structs.comparingInt(m -> getDependencies(m.type()).size)
);
Smethod best = entry.value.max(comp);
if(entry.value.contains(s -> best != s && comp.compare(s, best) == 0)){
err("Type " + type + " has multiple components implementing method " + entry.value.first() + " in an ambiguous way. Use MethodPriority to designate which one should be used. Implementations: " +
entry.value.map(s -> s.descString()));
}
entry.value.clear();
entry.value.add(best);
}
entry.value.sort(Structs.comps(Structs.comparingFloat(m -> m.has(MethodPriority.class) ? m.annotation(MethodPriority.class).value() : 0), Structs.comparing(s -> s.up().getSimpleName().toString())));

View File

@@ -28,6 +28,10 @@ public class Stype extends Selement<TypeElement>{
return interfaces().flatMap(s -> s.allInterfaces().add(s)).distinct();
}
public boolean isInterface(){
return e.getKind() == ElementKind.INTERFACE;
}
public Seq<Stype> superclasses(){
return Seq.with(BaseProcessor.typeu.directSupertypes(mirror())).map(Stype::of);
}

View File

@@ -26,8 +26,8 @@ buildscript{
}
plugins{
id "org.jetbrains.kotlin.jvm" version "1.6.0"
id "org.jetbrains.kotlin.kapt" version "1.6.0"
id "org.jetbrains.kotlin.jvm" version "2.1.10"
id "org.jetbrains.kotlin.kapt" version "2.1.10"
}
allprojects{
@@ -37,8 +37,8 @@ allprojects{
group = 'com.github.Anuken'
ext{
versionNumber = '7'
if(!project.hasProperty("versionModifier")) versionModifier = 'release'
versionNumber = '8'
if(!project.hasProperty("versionModifier")) versionModifier = 'beta'
if(!project.hasProperty("versionType")) versionType = 'official'
appName = 'Mindustry'
steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94'
@@ -309,7 +309,7 @@ project(":core"){
task assetsJar(type: Jar, dependsOn: ":tools:pack"){
archiveClassifier = 'assets'
from files("assets"){
exclude "config", "cache", "music", "sounds"
exclude "config", "cache", "music", "sounds", "sprites/fallback"
}
}
@@ -366,7 +366,6 @@ project(":core"){
//these are completely unnecessary
tasks.kaptGenerateStubsKotlin.onlyIf{ false }
tasks.compileKotlin.onlyIf{ false }
tasks.inspectClassesForKotlinIC.onlyIf{ false }
}
//comp** classes are only used for code generation

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 508 B

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 483 B

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 732 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,2 +1,3 @@
mschxœE<C593><EFBFBD>
ƒ0 „¯¦þÀ`{Ž>T¦A µ–*Œ½ûÀõg°@øÂå.<2E>Æ  =on)Õãv쎣 ìÅA¯lºMü,ý“ÏSâã&ÓÊÞNìÌ­s¸/ÃjO1!Êq` ûK¢ñû,&<26>[ÀÿR Œ¤(O€®»6 EÖ * ?»Ê».¡šëº>hRSÉ-êTQBTP5PýAÙù–Ø(¢
mschxœE<C593>Á
ƒ0DÇ$FA(úù¢Òê‹
1Jb)ý÷RJ÷ò™a…B- - m©cMX-y³c 5Ñl¡v{Tí;ûÚ…û‰ÜÜ“5ƒŸ­Åeô´MóÎfóÚm}²7nØÄºÑDs1a}øž\ñŸ"CäMžTË$œQ$¡H<E28098>žŽÐñ!q¼<71>ãøDGüÊJ䲌"ã¼!ó

View File

@@ -0,0 +1,2 @@
mschËA
Fá_Ú´m7ðDÑÂraRÑ ë—¾õ÷ ¡ŒÑÞŒÍR

View File

@@ -0,0 +1,2 @@
mschxœ%ÊA
@Á§Em;€èDÑÂê#i¨Ñõ£šõ Ñ

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,4 @@
mschxœ-‹Ñ
@0F<>
)”GðžH.Æþ¤fÓ¬äíQúÎÕé|hMîÍ.4³IIâÝû`…ÚʹÄíH[ð@éÌ,îD<C3AE>“¢ýËÁ™¸
Ý.‰Ãwû

Binary file not shown.

View File

@@ -0,0 +1,4 @@
mschxśMQËÓ0śÄ/ŮΓĺqŕŔ7Žś(ލâHqĐÚZÇ"Ąd;a?…oŕ«ř¸pŰbMŹ”ĄHĘęÔ3ꞡm"ŠŤ<(zů^š¦3íî<C3AD>lvďdŰ*·{;š/€×T6ŞŻ]w:k<>(ŐňZéžź~}űţęŁrÇQŰĎ/(éĄ>YZ {ëşńPťĄÖ´MSÝČz°î޶˝ŐŇUGi”®µŠâĆZGëÎś”TSőŕ(E"ă
éĘÝh{®Z9(µó)b4ÚJ\RĽ—ť¦ô <C3B4>Jëk×5­Şţ×g$şJ}ś—AĹŃžq`l<>z·Ł©˝µôňrÖ×rŕ`sPő^š®şj\}<>†®,ăü¤ŞŁł·Ę—.ű¦Ş<C2A6> ˛Ô†FW+tî
˙E!J¤DsÂ_F>śGWĚ™15¤‡ `ź#qÎ˙ *
@LCBQH=« ®C%`N~ň5ČZb ň

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,3 @@
mschxœMMnÛ0…Dz~h1qíÚˆv=AÑeº,º %FP “%9õQz†žª]tÛ1û†Tçq8óøqDW´[SjÔQÓ<C393>Ê4<C38A>i÷ŸT³·ÿ ÚV»d£ÇÚuÃÔYCDy¯ºéí—?ßÜÖn˜{{ÿ^<5E>zPnúzKÅX«iÒŽn®kZ]ÕÖœôÙ:ÿLL<4C>mëìlšêAÕ“ugºm¯\5(£û
ªÕTÛ™ò£6
Û>)¬+ýmr¡ÊÁ>!al£I<Φ¤ùhSÈC¯Æ©j\×÷$ûxEœÐÐ<C390>=i‡üIWƒ³<C692>:˜ÉqÆ©ÕÄ$»I«Ñήָz…—VáGëÂ{çýå7%X¦È d¬V$¸ rÛ×!Á&9:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More