!1 Package init

Merge pull request !1 from jeff200902/master
This commit is contained in:
openeuler-ci-bot 2020-08-24 10:23:47 +08:00 committed by Gitee
commit 4f6057f47a
5 changed files with 678 additions and 0 deletions

95
avoid-bundling-asm.patch Normal file
View File

@ -0,0 +1,95 @@
--- byte-buddy/pom.xml.orig 2018-11-22 17:18:25.000000000 +0000
+++ byte-buddy/pom.xml 2018-11-30 17:48:48.655978937 +0000
@@ -26,8 +26,6 @@
-->
<properties>
- <shade.source>org.objectweb.asm</shade.source>
- <shade.target>net.bytebuddy.jar.asm</shade.target>
<packages.list>
net.bytebuddy,
net.bytebuddy.agent.builder,
@@ -61,10 +59,7 @@
net.bytebuddy.pool,
net.bytebuddy.utility,
net.bytebuddy.utility.privilege,
- net.bytebuddy.utility.visitor,
- ${shade.target},
- ${shade.target}.signature,
- ${shade.target}.commons
+ net.bytebuddy.utility.visitor
</packages.list>
</properties>
@@ -77,7 +72,17 @@
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>byte-buddy-dep</artifactId>
- <version>${project.version}</version>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm</artifactId>
+ <version>${version.asm}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-commons</artifactId>
+ <version>${version.asm}</version>
</dependency>
</dependencies>
@@ -99,47 +104,19 @@
<createDependencyReducedPom>true</createDependencyReducedPom>
<createSourcesJar>true</createSourcesJar>
<shadeSourcesContent>true</shadeSourcesContent>
- <relocations>
- <relocation>
- <pattern>${shade.source}</pattern>
- <shadedPattern>${shade.target}</shadedPattern>
- </relocation>
- </relocations>
- <filters>
- <filter>
- <artifact>org.ow2.asm:asm-commons</artifact>
- <includes>
- <include>org/objectweb/asm/commons/Remapper.class</include>
- <include>org/objectweb/asm/commons/SimpleRemapper.class</include>
- <include>org/objectweb/asm/commons/ClassRemapper.class</include>
- <include>org/objectweb/asm/commons/AnnotationRemapper.class</include>
- <include>org/objectweb/asm/commons/FieldRemapper.class</include>
- <include>org/objectweb/asm/commons/MethodRemapper.class</include>
- <include>org/objectweb/asm/commons/ModuleRemapper.class</include>
- <include>org/objectweb/asm/commons/SignatureRemapper.class</include>
- </includes>
- </filter>
- </filters>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>net.bytebuddy.build.Plugin$Engine$Default</mainClass>
</transformer>
</transformers>
+ <artifactSet>
+ <excludes>
+ <exclude>org.ow2.asm:*</exclude>
+ </excludes>
+ </artifactSet>
</configuration>
</execution>
</executions>
- <dependencies>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm</artifactId>
- <version>${version.asm}</version>
- </dependency>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm-commons</artifactId>
- <version>${version.asm}</version>
- </dependency>
- </dependencies>
</plugin>
<!-- Disable pitest as it fails for empty modules -->
<plugin>

BIN
byte-buddy-1.9.5.tar.gz Normal file

Binary file not shown.

119
byte-buddy.spec Normal file
View File

@ -0,0 +1,119 @@
%bcond_with bootstrap
Name: byte-buddy
Version: 1.9.5
Release: 1
Summary: Runtime code generation for the Java virtual machine
License: ASL 2.0
URL: http://bytebuddy.net/
Source0: https://github.com/raphw/byte-buddy/archive/byte-buddy-%{version}.tar.gz
Patch0: no-unixsocket.patch
Patch1: avoid-bundling-asm.patch
BuildRequires: maven-local
%if %{without bootstrap}
BuildRequires: mvn(junit:junit) mvn(net.bytebuddy:byte-buddy)
BuildRequires: mvn(net.bytebuddy:byte-buddy-dep) mvn(net.bytebuddy:byte-buddy-maven-plugin)
BuildRequires: mvn(org.apache.maven:maven-compat)
BuildRequires: mvn(org.apache.maven.plugin-testing:maven-plugin-testing-harness)
BuildRequires: mvn(org.mockito:mockito-core) mvn(org.ow2.asm:asm-analysis)
BuildRequires: mvn(org.ow2.asm:asm-util)
%endif
BuildRequires: mvn(org.apache.felix:maven-bundle-plugin) mvn(org.apache.maven:maven-core)
BuildRequires: mvn(org.apache.maven:maven-plugin-api)
BuildRequires: mvn(org.apache.maven.plugins:maven-plugin-plugin)
BuildRequires: mvn(org.apache.maven.plugins:maven-shade-plugin)
BuildRequires: mvn(org.apache.maven.plugin-tools:maven-plugin-annotations)
BuildRequires: mvn(org.codehaus.mojo:build-helper-maven-plugin)
BuildRequires: mvn(org.eclipse.aether:aether-api) mvn(org.eclipse.aether:aether-util)
BuildRequires: mvn(org.ow2.asm:asm) mvn(org.ow2.asm:asm-commons)
BuildArch: noarch
%description
Byte Buddy is a code generation library for creating Java classes during the
runtime of a Java application and without the help of a compiler. Other than
the code generation utilities that ship with the Java Class Library, Byte Buddy
allows the creation of arbitrary classes and is not limited to implementing
interfaces for the creation of runtime proxies.
%package agent
Summary: Byte Buddy Java agent
%description agent
The Byte Buddy Java agent allows to access the JVM's HotSwap feature.
%package maven-plugin
Summary: Byte Buddy Maven plugin
%description maven-plugin
A plugin for post-processing class files via Byte Buddy in a Maven build.
%package parent
Summary: Byte Buddy parent POM
%description parent
The parent artifact contains configuration information that
concern all modules.
%package javadoc
Summary: Javadoc for %{name}
%description javadoc
This package contains API documentation for %{name}.
%prep
%setup -q -n %{name}-%{name}-%{version}
%patch0
%patch1
find -name *.jar -delete
find -name *.class -delete
mv byte-buddy-dep/src/precompiled/java/net/bytebuddy/build/*.java \
byte-buddy-dep/src/main/java/net/bytebuddy/build
mkdir -p byte-buddy-dep/src/test/java/net/bytebuddy/test/precompiled/
mv byte-buddy-dep/src/precompiled/java/net/bytebuddy/test/precompiled/*.java \
byte-buddy-dep/src/test/java/net/bytebuddy/test/precompiled/
%pom_disable_module byte-buddy-android
%pom_disable_module byte-buddy-benchmark
%pom_disable_module byte-buddy-gradle-plugin
%pom_remove_plugin :jacoco-maven-plugin
%pom_remove_plugin :license-maven-plugin
%pom_remove_plugin :pitest-maven
%pom_remove_plugin :coveralls-maven-plugin
%pom_remove_plugin :spotbugs-maven-plugin
%pom_remove_plugin :jitwatch-jarscan-maven-plugin
%pom_remove_plugin :clirr-maven-plugin
%pom_remove_plugin :maven-release-plugin
%pom_xpath_set "pom:createSourcesJar" "false" byte-buddy
%pom_remove_dep :findbugs-annotations
sed -i -e '/SuppressFBWarnings/d' $(grep -lr SuppressFBWarnings)
%pom_remove_plugin -r :modulemaker-maven-plugin
%if %{with bootstrap}
%pom_remove_plugin :byte-buddy-maven-plugin byte-buddy-dep
%endif
%build
%if %{with bootstrap}
%mvn_build -s -f -- -P'java8,!checks'
%else
%mvn_build -s -- -P'java8,!checks' -Dsourcecode.test.version=1.8 -Dmaven.test.failure.ignore=true
%endif
%install
%mvn_install
%files -f .mfiles-%{name} -f .mfiles-%{name}-dep
%doc README.md release-notes.md
%license LICENSE NOTICE
%files agent -f .mfiles-%{name}-agent
%license LICENSE NOTICE
%files maven-plugin -f .mfiles-%{name}-maven-plugin
%files parent -f .mfiles-%{name}-parent
%license LICENSE NOTICE
%files javadoc -f .mfiles-javadoc
%license LICENSE NOTICE
%changelog
* Fri Aug 14 2020 leiju <leiju4@huawei.com> - 1.9.5-1
- Package init

4
byte-buddy.yaml Normal file
View File

@ -0,0 +1,4 @@
version_control: github
src_repo: raphw/byte-buddy
tag_prefix: "byte-buddy-"
seperator: "."

460
no-unixsocket.patch Normal file
View File

@ -0,0 +1,460 @@
--- byte-buddy-agent/pom.xml.orig 2018-11-30 11:43:29.016481386 +0000
+++ byte-buddy-agent/pom.xml 2018-11-30 11:43:42.676439662 +0000
@@ -15,7 +15,6 @@
<bytebuddy.agent>net.bytebuddy.agent.Installer</bytebuddy.agent>
<attach.package.sun>com.sun.tools.attach</attach.package.sun>
<attach.package.ibm>com.ibm.tools.attach</attach.package.ibm>
- <version.unixsocket>2.0.4</version.unixsocket>
<packages.list>net.bytebuddy.agent</packages.list>
</properties>
@@ -30,12 +29,6 @@
<dependencies>
<dependency>
- <groupId>com.kohlschutter.junixsocket</groupId>
- <artifactId>junixsocket-native-common</artifactId>
- <version>${version.unixsocket}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${version.junit}</version>
--- byte-buddy-agent/src/main/java/net/bytebuddy/agent/ByteBuddyAgent.java.orig 2018-11-30 11:22:23.274443432 +0000
+++ byte-buddy-agent/src/main/java/net/bytebuddy/agent/ByteBuddyAgent.java 2018-11-30 11:42:22.236685381 +0000
@@ -541,8 +541,7 @@
ForStandardToolsJarVm.JVM_ROOT,
ForStandardToolsJarVm.JDK_ROOT,
ForStandardToolsJarVm.MACINTOSH,
- ForUserDefinedToolsJar.INSTANCE,
- ForUnixHotSpotVm.INSTANCE);
+ ForUserDefinedToolsJar.INSTANCE);
/**
* Attempts the creation of an accessor for a specific JVM's attachment API.
@@ -922,28 +921,6 @@
}
}
}
-
- /**
- * An attachment provider using a custom protocol implementation for HotSpot on Unix.
- */
- enum ForUnixHotSpotVm implements AttachmentProvider {
-
- /**
- * The singleton instance.
- */
- INSTANCE;
-
- /**
- * {@inheritDoc}
- */
- public Accessor attempt() {
- try {
- return new Accessor.Simple.WithoutExternalAttachment(VirtualMachine.ForHotSpot.OnUnix.assertAvailability());
- } catch (Throwable ignored) {
- return Accessor.Unavailable.INSTANCE;
- }
- }
- }
/**
* A compound attachment provider that attempts the attachment by delegation to other providers. If
--- byte-buddy-agent/src/main/java/net/bytebuddy/agent/VirtualMachine.java.orig 2018-11-30 11:22:55.830341642 +0000
+++ byte-buddy-agent/src/main/java/net/bytebuddy/agent/VirtualMachine.java 2018-11-30 11:38:21.698438915 +0000
@@ -16,8 +16,6 @@
package net.bytebuddy.agent;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import org.newsclub.net.unix.AFUNIXSocket;
-import org.newsclub.net.unix.AFUNIXSocketAddress;
import java.io.File;
import java.io.IOException;
@@ -172,213 +170,5 @@
*/
protected abstract void write(byte[] buffer) throws IOException;
- /**
- * A virtual machine implementation for a HotSpot VM running on Unix.
- */
- public static class OnUnix extends ForHotSpot {
-
- /**
- * The default amount of attempts to connect.
- */
- private static final int DEFAULT_ATTEMPTS = 10;
-
- /**
- * The default pause between two attempts.
- */
- private static final long DEFAULT_PAUSE = 200;
-
- /**
- * The default socket timeout.
- */
- private static final long DEFAULT_TIMEOUT = 5000;
-
- /**
- * The temporary directory on Unix systems.
- */
- private static final String TEMPORARY_DIRECTORY = "/tmp";
-
- /**
- * The name prefix for a socket.
- */
- private static final String SOCKET_FILE_PREFIX = ".java_pid";
-
- /**
- * The name prefix for an attachment file indicator.
- */
- private static final String ATTACH_FILE_PREFIX = ".attach_pid";
-
- /**
- * The Unix socket to use for communication. The containing object is supposed to be an instance
- * of {@link AFUNIXSocket} which is however not set to avoid eager loading
- */
- private final Object socket;
-
- /**
- * The number of attempts to connect.
- */
- private final int attempts;
-
- /**
- * The time to pause between attempts.
- */
- private final long pause;
-
- /**
- * The socket timeout.
- */
- private final long timeout;
-
- /**
- * The time unit of the pause time.
- */
- private final TimeUnit timeUnit;
-
- /**
- * Creates a new VM implementation for a HotSpot VM running on Unix.
- *
- * @param processId The process id of the target VM.
- * @param socket The Unix socket to use for communication.
- * @param attempts The number of attempts to connect.
- * @param pause The pause time between two VMs.
- * @param timeout The socket timeout.
- * @param timeUnit The time unit of the pause time.
- */
- public OnUnix(String processId, Object socket, int attempts, long pause, long timeout, TimeUnit timeUnit) {
- super(processId);
- this.socket = socket;
- this.attempts = attempts;
- this.pause = pause;
- this.timeout = timeout;
- this.timeUnit = timeUnit;
- }
-
- /**
- * Asserts the availability of this virtual machine implementation. If the Unix socket library is missing or
- * if this VM does not support Unix socket communication, a {@link Throwable} is thrown.
- *
- * @return This virtual machine type.
- * @throws Throwable If this attachment method is not available.
- */
- public static Class<?> assertAvailability() throws Throwable {
- try {
- Class<?> moduleType = Class.forName("java.lang.Module");
- Method getModule = Class.class.getMethod("getModule"), canRead = moduleType.getMethod("canRead", moduleType);
- Object thisModule = getModule.invoke(OnUnix.class), otherModule = getModule.invoke(AFUNIXSocket.class);
- if (!(Boolean) canRead.invoke(thisModule, otherModule)) {
- moduleType.getMethod("addReads", moduleType).invoke(thisModule, otherModule);
- }
- return doAssertAvailability();
- } catch (ClassNotFoundException ignored) {
- return doAssertAvailability();
- }
- }
-
- /**
- * Asserts the availability of this virtual machine implementation.
- *
- * @return This virtual machine type.
- */
- private static Class<?> doAssertAvailability() {
- if (!AFUNIXSocket.isSupported()) {
- throw new IllegalStateException("POSIX sockets are not supported on the current system");
- } else if (!System.getProperty("java.vm.name").toLowerCase(Locale.US).contains("hotspot")) {
- throw new IllegalStateException("Cannot apply attachment on non-Hotspot compatible VM");
- } else {
- return OnUnix.class;
- }
- }
-
- /**
- * Attaches to the supplied VM process.
- *
- * @param processId The process id of the target VM.
- * @return An appropriate virtual machine implementation.
- * @throws IOException If an I/O exception occurs.
- */
- public static VirtualMachine attach(String processId) throws IOException {
- return new OnUnix(processId, AFUNIXSocket.newInstance(), DEFAULT_ATTEMPTS, DEFAULT_PAUSE, DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
- }
-
- /**
- * {@inheritDoc}
- */
- @SuppressFBWarnings(value = "DMI_HARDCODED_ABSOLUTE_FILENAME", justification = "This is a Unix-specific implementation")
- protected void connect() throws IOException {
- File socketFile = new File(TEMPORARY_DIRECTORY, SOCKET_FILE_PREFIX + processId);
- if (!socketFile.exists()) {
- String target = ATTACH_FILE_PREFIX + processId, path = "/proc/" + processId + "/cwd/" + target;
- File attachFile = new File(path);
- try {
- if (!attachFile.createNewFile() && !attachFile.isFile()) {
- throw new IllegalStateException("Could not create attach file: " + attachFile);
- }
- } catch (IOException ignored) {
- attachFile = new File(TEMPORARY_DIRECTORY, target);
- if (!attachFile.createNewFile() && !attachFile.isFile()) {
- throw new IllegalStateException("Could not create attach file: " + attachFile);
- }
- }
- try {
- // The HotSpot attachment API attempts to send the signal to all children of a process
- Process process = Runtime.getRuntime().exec("kill -3 " + processId);
- int attempts = this.attempts;
- boolean killed = false;
- do {
- try {
- if (process.exitValue() != 0) {
- throw new IllegalStateException("Error while sending signal to target VM: " + processId);
- }
- killed = true;
- break;
- } catch (IllegalThreadStateException ignored) {
- attempts -= 1;
- Thread.sleep(timeUnit.toMillis(pause));
- }
- } while (attempts > 0);
- if (!killed) {
- throw new IllegalStateException("Target VM did not respond to signal: " + processId);
- }
- attempts = this.attempts;
- while (attempts-- > 0 && !socketFile.exists()) {
- Thread.sleep(timeUnit.toMillis(pause));
- }
- if (!socketFile.exists()) {
- throw new IllegalStateException("Target VM did not respond: " + processId);
- }
- } catch (InterruptedException exception) {
- throw new IllegalStateException("Interrupted during wait for process", exception);
- } finally {
- if (!attachFile.delete()) {
- attachFile.deleteOnExit();
- }
- }
- }
- if (timeout != 0) {
- ((AFUNIXSocket) socket).setSoTimeout((int) timeUnit.toMillis(timeout));
- }
- ((AFUNIXSocket) socket).connect(new AFUNIXSocketAddress(socketFile));
- }
-
- /**
- * {@inheritDoc}
- */
- public int read(byte[] buffer) throws IOException {
- return ((AFUNIXSocket) this.socket).getInputStream().read(buffer);
- }
-
- /**
- * {@inheritDoc}
- */
- public void write(byte[] buffer) throws IOException {
- ((AFUNIXSocket) this.socket).getOutputStream().write(buffer);
- }
-
- /**
- * {@inheritDoc}
- */
- public void detach() throws IOException {
- ((AFUNIXSocket) this.socket).close();
- }
- }
}
}
--- byte-buddy-agent/src/test/java/net/bytebuddy/test/utility/UnixSocketRule.java 2018-11-22 17:18:25.000000000 +0000
+++ /dev/null 2018-10-26 11:27:39.627999956 +0100
@@ -1,48 +0,0 @@
-package net.bytebuddy.test.utility;
-
-import org.junit.rules.MethodRule;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.Statement;
-import org.newsclub.net.unix.AFUNIXSocket;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.util.logging.Logger;
-
-public class UnixSocketRule implements MethodRule {
-
- private final boolean enabled;
-
- public UnixSocketRule() {
- boolean enabled;
- try {
- Class.forName(AFUNIXSocket.class.getName(), true, UnixSocketRule.class.getClassLoader());
- enabled = true;
- } catch (Throwable ignored) {
- enabled = false;
- }
- this.enabled = enabled;
- }
-
- public Statement apply(Statement base, FrameworkMethod method, Object target) {
- return enabled || method.getAnnotation(Enforce.class) == null
- ? base
- : new NoOpStatement();
- }
-
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface Enforce {
-
- }
-
- private static class NoOpStatement extends Statement {
-
- public void evaluate() {
- Logger.getLogger("net.bytebuddy").warning("Ignoring Unix sockets on this machine");
- }
- }
-}
-
--- byte-buddy-agent/src/test/java/net/bytebuddy/agent/VirtualMachineForHotSpotTest.java 2018-11-22 17:18:25.000000000 +0000
+++ /dev/null 2018-10-26 11:27:39.627999956 +0100
@@ -1,116 +0,0 @@
-package net.bytebuddy.agent;
-
-import net.bytebuddy.test.utility.UnixSocketRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.MethodRule;
-import org.mockito.InOrder;
-
-import java.io.IOException;
-
-import static org.mockito.Mockito.inOrder;
-import static org.mockito.Mockito.spy;
-
-public class VirtualMachineForHotSpotTest {
-
- @Rule
- public MethodRule unixSocketRule = new UnixSocketRule();
-
- @Test
- @UnixSocketRule.Enforce
- public void testAttachment() throws Exception {
- VirtualMachine.ForHotSpot virtualMachine = spy(new PseudoMachine(
- "0".getBytes("UTF-8"),
- new byte[]{10}
- ));
- virtualMachine.loadAgent("foo", "bar");
- InOrder order = inOrder(virtualMachine);
- order.verify(virtualMachine).connect();
- order.verify(virtualMachine).write("1".getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- order.verify(virtualMachine).write("load".getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- order.verify(virtualMachine).write("instrument".getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- order.verify(virtualMachine).write(Boolean.FALSE.toString().getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- order.verify(virtualMachine).write("foo=bar".getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- }
-
- @Test
- @UnixSocketRule.Enforce
- public void testAttachmentWithoutArgument() throws Exception {
- VirtualMachine.ForHotSpot virtualMachine = spy(new PseudoMachine(
- "0".getBytes("UTF-8"),
- new byte[]{10}
- ));
- virtualMachine.loadAgent("foo", null);
- InOrder order = inOrder(virtualMachine);
- order.verify(virtualMachine).connect();
- order.verify(virtualMachine).write("1".getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- order.verify(virtualMachine).write("load".getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- order.verify(virtualMachine).write("instrument".getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- order.verify(virtualMachine).write(Boolean.FALSE.toString().getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- order.verify(virtualMachine).write("foo".getBytes("UTF-8"));
- order.verify(virtualMachine).write(new byte[1]);
- }
-
- @Test(expected = IOException.class)
- @UnixSocketRule.Enforce
- public void testAttachmentIncompatibleProtocol() throws Exception {
- new PseudoMachine(
- "1".getBytes("UTF-8"),
- "0".getBytes("UTF-8"),
- "1".getBytes("UTF-8"),
- new byte[]{10}
- ).loadAgent("foo", null);
- }
-
- @Test(expected = IllegalStateException.class)
- @UnixSocketRule.Enforce
- public void testAttachmentUnknownError() throws Exception {
- new PseudoMachine(
- "1".getBytes("UTF-8"),
- new byte[]{10},
- "foo".getBytes("UTF-8")
- ).loadAgent("foo", null);
- }
-
- private static class PseudoMachine extends VirtualMachine.ForHotSpot {
-
- private final byte[][] read;
-
- private int index;
-
- private PseudoMachine(byte[]... read) {
- super(null);
- this.read = read;
- }
-
- public void detach() {
- /* empty */
- }
-
- protected void connect() {
- /* empty */
- }
-
- protected int read(byte[] buffer) {
- if (index == read.length) {
- return -1;
- }
- byte[] read = this.read[index++];
- System.arraycopy(read, 0, buffer, 0, read.length);
- return read.length;
- }
-
- protected void write(byte[] buffer) {
- /* empty */
- }
- }
-}
\ No newline at end of file