class GCSRepositoryPlugin extends Plugin implements RepositoryPlugin {

    private final GCSService service;

    public GCSRepositoryPlugin() {
        this.service = new GCSService();
    }

    @Override
    public List<Setting<?>> getSettings() {
        return List.of(
            GCSRepository.COMPRESS_SETTING,
            GCSRepository.BUCKET_SETTING,
            GCSRepository.BASE_PATH_SETTING,
            GCSRepository.CHUNK_SIZE_SETTING,
            GCSClientSettings.PROJECT_ID_SETTING,
            GCSClientSettings.PRIVATE_KEY_ID_SETTING,
            GCSClientSettings.PRIVATE_KEY_SETTING,
            GCSClientSettings.CLIENT_EMAIL_SETTING,
            GCSClientSettings.CLIENT_ID_SETTING,
            GCSClientSettings.ENDPOINT_SETTING,
            GCSClientSettings.TOKEN_URI_SETTING,
            GCSClientSettings.CONNECT_TIMEOUT_SETTING,
            GCSClientSettings.READ_TIMEOUT_SETTING
            );
    }

    @Override
    public Map<String, Repository.Factory> getRepositories(
        Environment environment, NamedXContentRegistry namedXContentRegistry,
        ClusterService clusterService, RecoverySettings recoverySettings) {
        return Map.of(
            "gcs", new Repository.Factory() {
                @Override
                public TypeSettings settings() {<FILL_FUNCTION_BODY>}

                @Override
                public Repository create(RepositoryMetadata metadata) {
                    return new GCSRepository(metadata, namedXContentRegistry, clusterService, service, recoverySettings);
                }
            }
        );
    }
}

                    return new TypeSettings(
                        // Required settings
                        List.of(
                            GCSRepository.BUCKET_SETTING,
                            GCSClientSettings.PROJECT_ID_SETTING,
                            GCSClientSettings.PRIVATE_KEY_ID_SETTING,
                            GCSClientSettings.PRIVATE_KEY_SETTING,
                            GCSClientSettings.CLIENT_ID_SETTING,
                            GCSClientSettings.CLIENT_EMAIL_SETTING
                        ),
                        // Optional settings
                        List.of(
                            GCSRepository.CHUNK_SIZE_SETTING,
                            GCSRepository.COMPRESS_SETTING,
                            GCSRepository.BASE_PATH_SETTING,
                            GCSClientSettings.ENDPOINT_SETTING,
                            GCSClientSettings.TOKEN_URI_SETTING,
                            GCSClientSettings.CONNECT_TIMEOUT_SETTING,
                            GCSClientSettings.READ_TIMEOUT_SETTING
                        )
                    );
                
<methods>public non-sealed void <init>() ,public org.elasticsearch.common.settings.Settings additionalSettings() ,public void close() throws java.io.IOException,public Collection<java.lang.Object> createComponents(org.elasticsearch.client.Client, org.elasticsearch.cluster.service.ClusterService, org.elasticsearch.threadpool.ThreadPool, org.elasticsearch.common.xcontent.NamedXContentRegistry, org.elasticsearch.env.Environment, org.elasticsearch.env.NodeEnvironment, org.elasticsearch.common.io.stream.NamedWriteableRegistry, Supplier<org.elasticsearch.repositories.RepositoriesService>) ,public Collection<org.elasticsearch.common.inject.Module> createGuiceModules() ,public List<org.elasticsearch.bootstrap.BootstrapCheck> getBootstrapChecks() ,public UnaryOperator<Map<java.lang.String,org.elasticsearch.cluster.metadata.Metadata.Custom>> getCustomMetadataUpgrader() ,public Collection<Class<? extends org.elasticsearch.common.component.LifecycleComponent>> getGuiceServiceClasses() ,public BiFunction<org.elasticsearch.cluster.metadata.IndexMetadata,org.elasticsearch.cluster.metadata.IndexTemplateMetadata,org.elasticsearch.cluster.metadata.IndexMetadata> getIndexMetadataUpgrader() ,public UnaryOperator<Map<java.lang.String,org.elasticsearch.cluster.metadata.IndexTemplateMetadata>> getIndexTemplateMetadataUpgrader() ,public List<org.elasticsearch.common.io.stream.NamedWriteableRegistry.Entry> getNamedWriteables() ,public List<org.elasticsearch.common.xcontent.NamedXContentRegistry.Entry> getNamedXContent() ,public Set<org.elasticsearch.cluster.node.DiscoveryNodeRole> getRoles() ,public List<SettingUpgrader<?>> getSettingUpgraders() ,public List<Setting<?>> getSettings() ,public void onIndexModule(org.elasticsearch.index.IndexModule) <variables>