Перевод мода с версии 1.7.10 на 1.12.2 - ошибка компиляции

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.12.2
Всем привет. Переводил мод скриншотера для проекта с версии 1.7.10 на 1.12.2. Потратил достаточно много времени на то, чтобы понять, как работают Capabilites, так как раньше не работал с этим, вроде в эклипсе всё собралось воедино и ошибок выявлено из IDE не было. Однако, при компиляции, Gradle захотел испортить ситуацию и набросал до кучи совершенно бредовых и непонятных ошибок. Ниже приложу пример одной из ошибок и участок кода, на котором она возникает (решение одной будет достаточно для решения остальных, так как они идентичны по смыслу).
Возможно, я что-то упустил при сборке форджа, раз он пытается при компиляции использовать обфусцированные классы, как либы?
Если кто-то встречался с подобной проблемой, то прошу помочь.

Версия Forge: 14.23.5.2847
Ошибка:
Compilation error:
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Events.java:125: error: incompatible types: vg cannot be converted to EntityPlayerMP
        if (event.getEntity() instanceof EntityPlayerMP) {
                           ^
Весь метод, при компиляции кода которого происходит ошибка:
Events.java:
@SubscribeEvent
public void onEntityConstruct(EntityEvent.EntityConstructing event) {
    if (event.getEntity() instanceof EntityPlayerMP) { // строка 125
    ScreenshotUploadTracker.register((EntityPlayerMP)event.getEntity());
    }
}

Благодарю заранее.
 
Не редактировалось, за исключением добавления строки в зависимости, а в зависимостях лежит только серверное ядро 1.12.2
build.gradle:
buildscript {
    repositories {
        jcenter()
        maven { url = "https://files.minecraftforge.net/maven" }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
    }
}
apply plugin: 'net.minecraftforge.gradle.forge'
//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.


version = "1.0"
group = "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "modid"

sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
compileJava {
    sourceCompatibility = targetCompatibility = '1.8'
}

minecraft {
    version = "1.12.2-14.23.5.2847"
    runDir = "run"
 
    // the mappings can be changed at any time, and must be in the following format.
    // snapshot_YYYYMMDD   snapshot are built nightly.
    // stable_#            stables are built at the discretion of the MCP team.
    // Use non-default mappings at your own risk. they may not always work.
    // simply re-run your setup task after changing the mappings to update your workspace.
    mappings = "snapshot_20171003"
    // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
}

dependencies {
    // you may put jars on which you depend on in ./libs
    // or you may define them like so..
    //compile "some.group:artifact:version:classifier"
    //compile "some.group:artifact:version"
   
    // real examples
    //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev'  // adds buildcraft to the dev env
    //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env

    // the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
    //provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'

    // the deobf configurations:  'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided,
    // except that these dependencies get remapped to your current MCP mappings
    //deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev'
    //deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev'

    // for more info...
    // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
    // http://www.gradle.org/docs/current/userguide/dependency_management.html
    compile fileTree(dir: 'libs', include: '*.jar')
}

processResources {
    // this will ensure that this task is redone when the versions change.
    inputs.property "version", project.version
    inputs.property "mcversion", project.minecraft.version

    // replace stuff in mcmod.info, nothing else
    from(sourceSets.main.resources.srcDirs) {
        include 'mcmod.info'
             
        // replace version and mcversion
        expand 'version':project.version, 'mcversion':project.minecraft.version
    }
     
    // copy everything else except the mcmod.info
    from(sourceSets.main.resources.srcDirs) {
        exclude 'mcmod.info'
    }
}
 
Последнее редактирование:
Пока писал сообщение выше, в голову пришла идея того, что я использую ядро, в котором есть Forge и он оттуда берёт классы для компиляции, но она не оправдалась. Заменил в либах ядро на спигот(где форджа нет) и результат не изменился.

UPD: попытка вообще удалить строку, отвечающую за зависимости так же не принесла никакого результата.
 
Последнее редактирование:
1,038
57
229
1,038
57
229
3,005
192
592
1,038
57
229
через gradle, через Eclipse, через IntelliJ, через Java, через .bat, через облако?
Если через gradle, то какой командой?
Наверняка у gradle, Eclipse, IntelliJ, Java, облако - есть полный лог
 
Командой ./gradlew build из git bash.

Лог:
MrLich@GrandProjectPC MINGW64 ~/Desktop/Forge12
$ ./gradlew build
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/2.14/userguide/gradle_daemon.html.
This mapping 'snapshot_20171003' was designed for MC 1.12! Use at your own peril.
#################################################
         ForgeGradle 2.3-SNAPSHOT-6084129e
  https://github.com/MinecraftForge/ForgeGradle
#################################################
                 Powered by MCP
             http://modcoderpack.com
     by: Searge, ProfMobius, R4wk, ZeuX
     Fesh0r, IngisKahn, bspkrs, LexManos
#################################################
:deobfCompileDummyTask
:deobfProvidedDummyTask
:sourceApiJava UP-TO-DATE
:compileApiJava UP-TO-DATE
:processApiResources UP-TO-DATE
:apiClasses UP-TO-DATE
:sourceMainJava UP-TO-DATE
:compileJavaC:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Capability\UploadTrackerCapability.java:20: error: ScreenshotUploadTrackerStorage is not abstract and does not override abstract method readNBT(Capability<IScreenshotUploadTracker>,IScreenshotUploadTracker,fa,gn) in IStorage
        public static class ScreenshotUploadTrackerStorage implements Capability.IStorage<IScreenshotUploadTracker> {
                      ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Capability\UploadTrackerCapability.java:22: error: method does not override or implement a method from a supertype
                @Override
                ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Capability\UploadTrackerCapability.java:28: error: method does not override or implement a method from a supertype
                @Override
                ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Events.java:125: error: incompatible types: vg cannot be converted to EntityPlayerMP
        if (event.getEntity() instanceof EntityPlayerMP) {
                           ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Events.java:126: error: incompatible types: vg cannot be converted to EntityPlayerMP
            ScreenshotUploadTracker.register((EntityPlayerMP)event.getEntity());
                                                                            ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Events.java:134: error: incompatible types: ResourceLocation cannot be converted to nf
                event.addCapability(new ResourceLocation("screener", "uploadTrackerCapability"),(ICapabilityProvider) ScreenshotUploadTracker.register(player));
                                    ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Events.java:143: error: incompatible types: aed cannot be converted to EntityPlayer
                ScreenshotUploadTracker.get(event.player).tick(now);
                                                 ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Message_Screenshot_Response.java:61: error: cannot find symbol
                ScreenshotUploadTracker tracker = ScreenshotUploadTracker.get((EntityPlayer)ctx.getServerHandler().player);
                                                                                                                 ^
  symbol:   variable player
  location: class pa
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Message_Screenshot_Response.java:63: error: incompatible types: TextComponentString cannot be converted to String
                    ctx.getServerHandler().disconnect(new TextComponentString("\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435"));
                                                      ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\Screener.java:61: error: incompatible types: ICommand cannot be converted to bk
        event.registerServerCommand((ICommand)new ScreenshotCommand());
                                    ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\ScreenshotCommand.java:71: error: incompatible types: EntityPlayerMP cannot be converted to oq
                    Screener.mainNetworkChannel.sendTo((IMessage)new Message_Screenshot_Display(i, numParts, sliced, targetPlayer.getCommandSenderEntity().getName(), mode, System.currentTimeMillis()), requester);
                                                                                                                                                                                                       ^
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\ScreenshotCommand.java:104: error: cannot find symbol
            EntityPlayerMP targetPlayer = sender.getServer().getPlayerList().getPlayerByUsername(args[0]);
                                                            ^
  symbol:   method getPlayerList()
  location: class MinecraftServer
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\ScreenshotCommand.java:127: error: cannot find symbol
            EntityPlayerMP targetPlayer = sender.getServer().getPlayerList().getPlayerByUsername(args[0]);
                                                            ^
  symbol:   method getPlayerList()
  location: class MinecraftServer
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\ScreenshotUploadTracker.java:66: error: reference to getCapability is ambiguous
        return (ScreenshotUploadTracker) player.getCapability(UploadTrackerCapability.CAPABILITY_SCREENSHOT_TRACKER, null);
                                               ^
  both method <T#1>getCapability(Capability<T#1>,fa) in ICapabilityProvider andmethod <T#2>getCapability(Capability<T#2>,EnumFacing) in EntityPlayer match
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>getCapability(Capability<T#1>,fa)
    T#2 extends Object declared in method <T#2>getCapability(Capability<T#2>,EnumFacing)
C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\ScreenshotUploadTracker.java:88: error: incompatible types: EntityPlayerMP cannot be converted to oq
        Screener.mainNetworkChannel.sendTo((IMessage)new Message_Screenshot_Request(), this.player);
                                                                                          ^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: C:\Users\MrLich\Desktop\Forge12\build\sources\main\java\net\eahraeh\Screener\ScreenshotUploadTracker.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Note: Some messages have been simplified; recompile with -Xdiags:verbose to getfull output
15 errors
 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
[QUOTE] Compilation failed; see the compiler error output for details.[/QUOTE]

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debugoption to get more log output.

BUILD FAILED

Total time: 13.28 secs
 
1,038
57
229
1,038
57
229
@Agravaine :j он запускает в среде MinGW, вместо того чтобы запустить тот же PowerShell или командную консоль, которая настроена на Windows окружение. Да, git bash тоже можно настроить на компиляцию, но для начала надо установить там jdk, убедиться что используется именно 32х битная или 64х битная версия java. Промучиться с этим несколько дней, вместо того чтобы
запустить тот же PowerShell или командную консоль, которая настроена на Windows окружение
Это либо высер и парню нечего деалть, либо он посчитал что он с этим справится (пусть справляется в этом случае)
Можно ссылочку на тутор где написано что надо использовать git bash для компиляции?
 
Последнее редактирование:
Спасибо, попробую gradlew clean setupDecompWorkspace, а пока что отвечу на сообщение. По поводу результатов отпишусь чуть позже.
Это либо высер и парню нечего деалть, либо он посчитал что он с этим справится (пусть справляется в этом случае)
Можно ссылочку на тутор где написано что надо использовать git bash для компиляции?
А почему бы и не справлюсь? Чем гит баш отличается от обычной консоли винды в плане запуска компилятора? Проблема явно в скрипте компиляции, а не в гит баше. К слову, запускать через командную строку компиляцию тоже пробовал, но ничего от этого не меняется.
Вроде бы, я пользовался только одним тутором с вики, когда пытался скомпить мод в первый раз. Хотя там и не написано ничего про гит баш, но им пользоваться намного удобнее, чем командной строкой 7-й винды, лично для меня.
Кстати, никаких проблем не встретил при установке и настройке гит баша, совершенно какая-то другая история, не связанная со мной.
 
1,038
57
229
Кстати, никаких проблем не встретил при установке и настройке гит баша
а у него и не должно быть проблем, это free software продукт
Изначально твой src должен быть почти пустым (содержащим example mod), откуда там net\eahraeh\Screener?
Верни как было и запусти снова, или скачай новый mcp и запусти gradlew build
Прежде чем переводить мод, нужно убедиться в том что стандартный мод хотя бы компилируется. А значит зависимости подгружены и можно работать дальше
 
Изначально твой src должен быть почти пустым (содержащим example mod), откуда там net\eahraeh\Screener?
Верни как было и запусти снова, или скачай новый mcp и запусти gradlew build
Прежде чем переводить мод, нужно убедиться в том что стандартный мод хотя бы компилируется. А значит зависимости подгружены и можно работать дальше
Example mod скомпилировался без проблем, а скринер таки не хочет.

Попробуй действительно полностью переставить среду, gradlew clean setupDecompWorkspace.
Операция успешна, но к положительному результату при компиляции скринера это не привело, те же самые ошибки.
 
1,038
57
229
лог ошибок и файл с кодом по самой верхней из них

Компилирую уже с другой папки, перекачал mdk форджа для проверки.
Gradle (Groovy):
Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Users\MrLich>cd C:\Users\MrLich\Desktop\TestGradle

C:\Users\MrLich\Desktop\TestGradle>gradlew build
To honour the JVM settings for this build a new JVM will be forked. Please consi
der using the daemon: https://docs.gradle.org/2.14/userguide/gradle_daemon.html.

This mapping 'snapshot_20171003' was designed for MC 1.12! Use at your own peril
.
#################################################
         ForgeGradle 2.3-SNAPSHOT-6084129e
  https://github.com/MinecraftForge/ForgeGradle
#################################################
                 Powered by MCP
             http://modcoderpack.com
     by: Searge, ProfMobius, R4wk, ZeuX
     Fesh0r, IngisKahn, bspkrs, LexManos
#################################################
:deobfCompileDummyTask
:deobfProvidedDummyTask
:sourceApiJava UP-TO-DATE
:compileApiJava UP-TO-DATE
:processApiResources UP-TO-DATE
:apiClasses UP-TO-DATE
:sourceMainJava UP-TO-DATE
:compileJava
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Capability\UploadTrackerCapability.java:20: error: ScreenshotUp
loadTrackerStorage is not abstract and does not override abstract method readNBT
(Capability<IScreenshotUploadTracker>,IScreenshotUploadTracker,fa,gn) in IStorag
e
        public static class ScreenshotUploadTrackerStorage implements Capability
.IStorage<IScreenshotUploadTracker> {
                      ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Capability\UploadTrackerCapability.java:22: error: method does
not override or implement a method from a supertype
                @Override
                ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Capability\UploadTrackerCapability.java:28: error: method does
not override or implement a method from a supertype
                @Override
                ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Events.java:125: error: incompatible types: vg cannot be conver
ted to EntityPlayerMP
        if (event.getEntity() instanceof EntityPlayerMP) {
                           ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Events.java:126: error: incompatible types: vg cannot be conver
ted to EntityPlayerMP
            ScreenshotUploadTracker.register((EntityPlayerMP)event.getEntity());

                                                                            ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Events.java:134: error: incompatible types: ResourceLocation ca
nnot be converted to nf
                event.addCapability(new ResourceLocation("screener", "uploadTrac
kerCapability"),(ICapabilityProvider) ScreenshotUploadTracker.register(player));

                                    ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Events.java:143: error: incompatible types: aed cannot be conve
rted to EntityPlayer
                ScreenshotUploadTracker.get(event.player).tick(now);
                                                 ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Message_Screenshot_Response.java:61: error: cannot find symbol
                ScreenshotUploadTracker tracker = ScreenshotUploadTracker.get((E
ntityPlayer)ctx.getServerHandler().player);

                                  ^
  symbol:   variable player
  location: class pa
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Message_Screenshot_Response.java:63: error: incompatible types:
 TextComponentString cannot be converted to String
                    ctx.getServerHandler().disconnect(new TextComponentString("\
u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0438\u
043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u043a\u0440\u
0438\u043d\u0448\u043e\u0442\u0435"));
                                                      ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\Screener.java:61: error: incompatible types: ICommand cannot be
 converted to bk
        event.registerServerCommand((ICommand)new ScreenshotCommand());
                                    ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\ScreenshotCommand.java:71: error: incompatible types: EntityPla
yerMP cannot be converted to oq
                    Screener.mainNetworkChannel.sendTo((IMessage)new Message_Scr
eenshot_Display(i, numParts, sliced, targetPlayer.getCommandSenderEntity().getNa
me(), mode, System.currentTimeMillis()), requester);


                                         ^
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\ScreenshotCommand.java:104: error: cannot find symbol
            EntityPlayerMP targetPlayer = sender.getServer().getPlayerList().get
PlayerByUsername(args[0]);
                                                            ^
  symbol:   method getPlayerList()
  location: class MinecraftServer
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\ScreenshotCommand.java:127: error: cannot find symbol
            EntityPlayerMP targetPlayer = sender.getServer().getPlayerList().get
PlayerByUsername(args[0]);
                                                            ^
  symbol:   method getPlayerList()
  location: class MinecraftServer
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\ScreenshotUploadTracker.java:66: error: reference to getCapabil
ity is ambiguous
        return (ScreenshotUploadTracker) player.getCapability(UploadTrackerCapab
ility.CAPABILITY_SCREENSHOT_TRACKER, null);
                                               ^
  both method <T#1>getCapability(Capability<T#1>,fa) in ICapabilityProvider and
method <T#2>getCapability(Capability<T#2>,EnumFacing) in EntityPlayer match
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>getCapability(Capability<T#1>,fa)

    T#2 extends Object declared in method <T#2>getCapability(Capability<T#2>,Enu
mFacing)
C:\Users\MrLich\Desktop\TestGradle\build\sources\main\java\net\
eahraeh\Screener\ScreenshotUploadTracker.java:88: error: incompatible types: Ent
ityPlayerMP cannot be converted to oq
        Screener.mainNetworkChannel.sendTo((IMessage)new Message_Screenshot_Requ
est(), this.player);

           ^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: C:\Users\MrLich\Desktop\TestGradle\build\sources\main\jav
a\net\eahraeh\Screener\ScreenshotUploadTracker.java uses unchecked or unsafe ope
rations.
Note: Recompile with -Xlint:unchecked for details.
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get
full output
15 errors
:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':compileJava'.
[QUOTE] Compilation failed; see the compiler error output for details.[/QUOTE]

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug
option to get more log output.

BUILD FAILED

Total time: 11.979 secs

Исходники с первой ошибки:
UploadTrackerCapability.java:
package net.eahraeh.Screener.Capability;
import net.eahraeh.Screener.ScreenshotUploadTracker;
import net.minecraft.nbt.NBTBase;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.ICapabilityProvider;

public class UploadTrackerCapability {

    @CapabilityInject(IScreenshotUploadTracker.class)
    public static final Capability<IScreenshotUploadTracker> CAPABILITY_SCREENSHOT_TRACKER = null;
    
    public static void registerCapabilities() {
        CapabilityManager.INSTANCE.register(IScreenshotUploadTracker.class, new ScreenshotUploadTrackerStorage(), ScreenshotUploadTracker.class);
    }
    
    public static class ScreenshotUploadTrackerStorage implements Capability.IStorage<IScreenshotUploadTracker> {

        @Override
        public void readNBT(Capability<IScreenshotUploadTracker> arg0, IScreenshotUploadTracker arg1, EnumFacing arg2,
                NBTBase arg3) {
            return;
        }

        @Override
        public NBTBase writeNBT(Capability<IScreenshotUploadTracker> arg0, IScreenshotUploadTracker arg1, EnumFacing arg2) {
            return null;
        }
    }
    
}
 
7,099
324
1,510
что надо использовать git bash для компиляции?
Не сказал бы, что надо, но по крайней мере можно
1574180521079.png
А если Gradle установлен в системе и не используется gradle wrapper, можно вызывать его без sh
~~~
javac и scalac при этом тоже доступен, хотя я ничего не настраивал
1574180609554.png
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху