// Path: Proton/src/main/java/proton/inject/ProvisionException.java
// public class ProvisionException extends ProtonRuntimeException {
//     private static final long serialVersionUID = 8834973331199731825L;
// 
//     public ProvisionException() {
//         super();
//     }
// 
//     public ProvisionException(String detailMessage, Throwable throwable) {
//         super(detailMessage, throwable);
//     }
// 
//     public ProvisionException(String detailMessage) {
//         super(detailMessage);
//     }
// 
//     public ProvisionException(Throwable throwable) {
//         super(throwable);
//     }
// }
// 
// Path: Proton/src/main/java/proton/inject/util/InjectorUtils.java
// public final class InjectorUtils {
//     private InjectorUtils() {
//     }
// 
//     public static Class<?> toActualClass(Type type) {
//         if (type instanceof ParameterizedType
//                 && (((ParameterizedType) type).getRawType() == Provider.class || ((ParameterizedType) type)
//                 .getRawType() == Provider.class))
//             return (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[0];
//         return (Class<?>) type;
//     }
// 
//     public static boolean isAbstract(Class<?> clazz) {
//         return clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers());
//     }
// 
//     public static Class<? extends Annotation> getScopeAnnotation(Class<?> clazz) {
//         Annotation[] anns = clazz.getAnnotations();
//         for (Annotation a : anns) {
//             Class<? extends Annotation> annClass = a.annotationType();
//             if (ApplicationScoped.class == annClass || Dependent.class == annClass || ContextScoped.class == annClass)
//                 return annClass;
// 
//         }
//         return ContextScoped.class;
//     }
// 
//     public static void setField(Object receiver, Field field, Object value) {
//         try {
//             field.set(receiver, value);
//         } catch (IllegalAccessException exp) {
//             throw new ProvisionException(exp);
//         }
//     }
// 
//     public static Object getField(Object receiver, Field field) {
//         try {
//             return field.get(receiver);
//         } catch (IllegalAccessException exp) {
//             throw new ProvisionException(exp);
//         }
//     }
// 
//     public static Object newInstance(Constructor<?> constructor, Object[] args) {
//         try {
//             return constructor.newInstance(args);
//         } catch (IllegalAccessException exp) {
//             throw new ProvisionException(exp);
//         } catch (InvocationTargetException exp) {
//             throw new ProvisionException(exp);
//         } catch (InstantiationException exp) {
//             throw new ProvisionException(exp);
//         }
//     }
// }
// 
// Path: Proton/src/main/java/proton/inject/util/SparseClassArray.java
// public class SparseClassArray<T> {
//     private SparseArray<T> mArray = new SparseArray<T>();
// 
//     public void put(Class<?> key, T value) {
//         mArray.put(key.hashCode(), value);
//     }
// 
//     public T get(Class<?> key) {
//         return mArray.get(key.hashCode());
//     }
// 
//     public void remove(Class<?> key) {
//         mArray.remove(key.hashCode());
//     }
// 
//     public void clear() {
//         mArray.clear();
//     }
// }


import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import proton.inject.ProvisionException;
import proton.inject.util.InjectorUtils;
import proton.inject.util.SparseClassArray;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.SparseArray;
                if (value == null && state.field.getType().isPrimitive())
                    continue;

                InjectorUtils.setField(state.receiver, state.field, value);
            }
        }
    }

    public void registerAndRestore(Context context, Object receiver, Field field) {
        synchronized (this) {
            register(context, receiver, field);
            restore(context, receiver, field);
        }
    }

    private void register(Context context, Object receiver, Field field) {
        List<State> list = mSaveStates.get(context);
        if (list == null) {
            list = new ArrayList<State>();
            mSaveStates.put(context, list);
        }

        list.add(new State(receiver, field));
    }

    private void restore(Context context, Object receiver, Field field) {
        Bundle bundle = mSavedStateBundles.get(context);
        if (bundle == null)
            return;

// Path: Proton/src/main/java/proton/inject/ProvisionException.java
// public class ProvisionException extends ProtonRuntimeException {
//     private static final long serialVersionUID = 8834973331199731825L;
// 
//     public ProvisionException() {
//         super();
//     }
// 
//     public ProvisionException(String detailMessage, Throwable throwable) {
//         super(detailMessage, throwable);
//     }
// 
//     public ProvisionException(String detailMessage) {
//         super(detailMessage);
//     }
// 
//     public ProvisionException(Throwable throwable) {
//         super(throwable);
//     }
// }
// 
// Path: Proton/src/main/java/proton/inject/util/InjectorUtils.java
// public final class InjectorUtils {
//     private InjectorUtils() {
//     }
// 
//     public static Class<?> toActualClass(Type type) {
//         if (type instanceof ParameterizedType
//                 && (((ParameterizedType) type).getRawType() == Provider.class || ((ParameterizedType) type)
//                 .getRawType() == Provider.class))
//             return (Class<?>) ((ParameterizedType) type).getActualTypeArguments()[0];
//         return (Class<?>) type;
//     }
// 
//     public static boolean isAbstract(Class<?> clazz) {
//         return clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers());
//     }
// 
//     public static Class<? extends Annotation> getScopeAnnotation(Class<?> clazz) {
//         Annotation[] anns = clazz.getAnnotations();
//         for (Annotation a : anns) {
//             Class<? extends Annotation> annClass = a.annotationType();
//             if (ApplicationScoped.class == annClass || Dependent.class == annClass || ContextScoped.class == annClass)
//                 return annClass;
// 
//         }
//         return ContextScoped.class;
//     }
// 
//     public static void setField(Object receiver, Field field, Object value) {
//         try {
//             field.set(receiver, value);
//         } catch (IllegalAccessException exp) {
//             throw new ProvisionException(exp);
//         }
//     }
// 
//     public static Object getField(Object receiver, Field field) {
//         try {
//             return field.get(receiver);
//         } catch (IllegalAccessException exp) {
//             throw new ProvisionException(exp);
//         }
//     }
// 
//     public static Object newInstance(Constructor<?> constructor, Object[] args) {
//         try {
//             return constructor.newInstance(args);
//         } catch (IllegalAccessException exp) {
//             throw new ProvisionException(exp);
//         } catch (InvocationTargetException exp) {
//             throw new ProvisionException(exp);
//         } catch (InstantiationException exp) {
//             throw new ProvisionException(exp);
//         }
//     }
// }
// 
// Path: Proton/src/main/java/proton/inject/util/SparseClassArray.java
// public class SparseClassArray<T> {
//     private SparseArray<T> mArray = new SparseArray<T>();
// 
//     public void put(Class<?> key, T value) {
//         mArray.put(key.hashCode(), value);
//     }
// 
//     public T get(Class<?> key) {
//         return mArray.get(key.hashCode());
//     }
// 
//     public void remove(Class<?> key) {
//         mArray.remove(key.hashCode());
//     }
// 
//     public void clear() {
//         mArray.clear();
//     }
// }


// Path: Proton/src/main/java/proton/inject/state/StateManager.java
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import proton.inject.ProvisionException;
import proton.inject.util.InjectorUtils;
import proton.inject.util.SparseClassArray;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.SparseArray;

                if (value == null && state.field.getType().isPrimitive())
                    continue;

                InjectorUtils.setField(state.receiver, state.field, value);
            }
        }
    }

    public void registerAndRestore(Context context, Object receiver, Field field) {
        synchronized (this) {
            register(context, receiver, field);
            restore(context, receiver, field);
        }
    }

    private void register(Context context, Object receiver, Field field) {
        List<State> list = mSaveStates.get(context);
        if (list == null) {
            list = new ArrayList<State>();
            mSaveStates.put(context, list);
        }

        list.add(new State(receiver, field));
    }

    private void restore(Context context, Object receiver, Field field) {
        Bundle bundle = mSavedStateBundles.get(context);
        if (bundle == null)
            return;

        Object value = bundle.get(key(receiver, field));