#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

-dontshrink
-dontoptimize

-keepattributes Signature
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keepclasseswithmembers class com.intel.bigdatamem.* {
 	*** <init>(...);
}

-keep class com.intel.bigdatamem.GenericField* {
  public <methods>;
}

-keepclassmembers,allowoptimization enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembernames class * {
    java.lang.Class class$(java.lang.String);
    java.lang.Class class$(java.lang.String, boolean);
}

-keep class org.flowcomputing.commons.resgc.ResHolder {
	public <methods>;
}

-keepclasseswithmembers class com.intel.bigdatamem.ByteBufferBacked* {
	public <methods>;
}

-keepclasseswithmembers class ** extends javax.annotation.processing.AbstractProcessor {
	public <methods>;
}

-keepclasseswithmembers class ** extends java.lang.RuntimeException {
	public <methods>;
}

-keepclasseswithmembers class ** extends java.lang.Exception {
	public <methods>;
}

-keepclasseswithmembers class ** extends com.intel.bigdatamem.Reclaim {
	public <methods>;
}

-keep public class com.intel.bigdatamem.CachePool* {
	public *;
}

-keep public class com.intel.bigdatamem.MemClustering* {
	public *;
}

-keep public interface ** {
	public <methods>;
}

-keep public enum ** {
	*;
}

-keep class ** extends com.intel.bigdatamem.CommonAllocator {
	public <methods>;
}

-keep class ** extends com.intel.bigdatamem.MemHolder {
	public <methods>;
}

-keep class com.intel.bigdatamem.Utils {
	public <methods>;
	public final <fields>;
}

-keep @NonVolatileEntity class * {
	public <methods>;
}

-keep public @interface ** {
	*;
}

-keepclasseswithmembers class * {
    native <methods>;
}

