// Path: lib-collections/src/main/java/xdroid/collections/Indexed.java
// public interface Indexed<E> {
//     int size();
// 
//     E get(int location);
// 
//     E set(int location, E object);
// }
// 
// Path: lib-collections/src/main/java/xdroid/collections/IndexedIterator.java
// public class IndexedIterator<E> implements Iterator<E> {
//     private final Indexed<E> mIndexed;
//     private int mCursor;
// 
//     public IndexedIterator(Indexed<E> indexed) {
//         mIndexed = notNull(indexed);
//         mCursor = -1;
//     }
// 
//     @Override
//     public boolean hasNext() {
//         return mCursor + 1 < mIndexed.size();
//     }
// 
//     @Override
//     public E next() {
//         return mIndexed.get(++mCursor);
//     }
// 
//     @Override
//     public void remove() {
//         throw new UnsupportedOperationException();
//     }
// }
// 
// Path: lib-core/src/main/java/xdroid/core/ParcelUtils.java
// public final class ParcelUtils {
//     public static final int VAL_PARCELABLE = 0x01;
//     public static final int VAL_SERIALIZABLE = 0x02;
//     public static final int VAL_NULL = 0x03;
// 
//     private ParcelUtils() {
//         // disallow public access
//     }
// 
//     public static void writeParcelableOrSerializable(Parcel out, int flags, Object value) {
//         if (value instanceof Parcelable) {
//             out.writeInt(VAL_PARCELABLE);
//             out.writeParcelable((Parcelable) value, flags);
//         } else if (value instanceof Serializable) {
//             out.writeInt(VAL_SERIALIZABLE);
//             out.writeSerializable((Serializable) value);
//         } else {
//             out.writeInt(VAL_NULL);
//         }
//     }
// 
//     public static <T> T readParcelableOrSerializable(Parcel in, ClassLoader classLoader) {
//         switch (in.readInt()) {
//             case VAL_PARCELABLE:
//                 //noinspection unchecked
//                 return (T) in.readParcelable(classLoader);
// 
//             case VAL_SERIALIZABLE:
//                 //noinspection unchecked
//                 return (T) in.readSerializable();
// 
//             case VAL_NULL:
//                 // fall down
// 
//             default:
//                 return null;
//         }
//     }
// 
//     public static void writeSparseIntArray(Parcel out, SparseIntArray value) {
//         if (value == null) {
//             out.writeInt(-1);
//         } else {
//             int count = value.size();
//             out.writeInt(count);
// 
//             for (int i = 0; i < count; ++i) {
//                 out.writeInt(value.keyAt(i));
//                 out.writeInt(value.valueAt(i));
//             }
//         }
//     }
// 
//     public static SparseIntArray readSparseIntArray(Parcel in) {
//         int count = in.readInt();
//         if (count < 0) {
//             return null;
//         }
// 
//         SparseIntArray result = new SparseIntArray();
// 
//         for (int i = 0; i < count; ++i) {
//             int key = in.readInt();
//             int value = in.readInt();
// 
//             result.put(key, value);
//         }
// 
//         return result;
//     }
// }


import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.Iterator;
import java.util.List;
import xdroid.collections.Indexed;
import xdroid.collections.IndexedIterator;
import xdroid.core.ParcelUtils;
        if (convertView == null) {
            result = (V) LayoutInflater.from(parent.getContext()).inflate(mLayoutId.get(getItemViewType(position)), parent, false);

            if (mBinder != null) {
                mBinder.onNewView(position, result);
            }
        } else {
            result = (V) convertView;
        }

        if (mBinder != null) {
            mBinder.onNewData(position, result, getItem(position));
        }

        return result;
    }

    @SuppressWarnings("unused")
    public D getFirstItem() {
        return getCount() > 0 ? getItem(0) : null;
    }

    @SuppressWarnings("unused")
    public D getLastItem() {
        int count = getCount();
        return count > 0 ? getItem(count - 1) : null;
    }

    @Override
    public Iterator<D> iterator() {
// Path: lib-collections/src/main/java/xdroid/collections/Indexed.java
// public interface Indexed<E> {
//     int size();
// 
//     E get(int location);
// 
//     E set(int location, E object);
// }
// 
// Path: lib-collections/src/main/java/xdroid/collections/IndexedIterator.java
// public class IndexedIterator<E> implements Iterator<E> {
//     private final Indexed<E> mIndexed;
//     private int mCursor;
// 
//     public IndexedIterator(Indexed<E> indexed) {
//         mIndexed = notNull(indexed);
//         mCursor = -1;
//     }
// 
//     @Override
//     public boolean hasNext() {
//         return mCursor + 1 < mIndexed.size();
//     }
// 
//     @Override
//     public E next() {
//         return mIndexed.get(++mCursor);
//     }
// 
//     @Override
//     public void remove() {
//         throw new UnsupportedOperationException();
//     }
// }
// 
// Path: lib-core/src/main/java/xdroid/core/ParcelUtils.java
// public final class ParcelUtils {
//     public static final int VAL_PARCELABLE = 0x01;
//     public static final int VAL_SERIALIZABLE = 0x02;
//     public static final int VAL_NULL = 0x03;
// 
//     private ParcelUtils() {
//         // disallow public access
//     }
// 
//     public static void writeParcelableOrSerializable(Parcel out, int flags, Object value) {
//         if (value instanceof Parcelable) {
//             out.writeInt(VAL_PARCELABLE);
//             out.writeParcelable((Parcelable) value, flags);
//         } else if (value instanceof Serializable) {
//             out.writeInt(VAL_SERIALIZABLE);
//             out.writeSerializable((Serializable) value);
//         } else {
//             out.writeInt(VAL_NULL);
//         }
//     }
// 
//     public static <T> T readParcelableOrSerializable(Parcel in, ClassLoader classLoader) {
//         switch (in.readInt()) {
//             case VAL_PARCELABLE:
//                 //noinspection unchecked
//                 return (T) in.readParcelable(classLoader);
// 
//             case VAL_SERIALIZABLE:
//                 //noinspection unchecked
//                 return (T) in.readSerializable();
// 
//             case VAL_NULL:
//                 // fall down
// 
//             default:
//                 return null;
//         }
//     }
// 
//     public static void writeSparseIntArray(Parcel out, SparseIntArray value) {
//         if (value == null) {
//             out.writeInt(-1);
//         } else {
//             int count = value.size();
//             out.writeInt(count);
// 
//             for (int i = 0; i < count; ++i) {
//                 out.writeInt(value.keyAt(i));
//                 out.writeInt(value.valueAt(i));
//             }
//         }
//     }
// 
//     public static SparseIntArray readSparseIntArray(Parcel in) {
//         int count = in.readInt();
//         if (count < 0) {
//             return null;
//         }
// 
//         SparseIntArray result = new SparseIntArray();
// 
//         for (int i = 0; i < count; ++i) {
//             int key = in.readInt();
//             int value = in.readInt();
// 
//             result.put(key, value);
//         }
// 
//         return result;
//     }
// }


// Path: lib-adapter/src/main/java/xdroid/adapter/AdapterX.java
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.Iterator;
import java.util.List;
import xdroid.collections.Indexed;
import xdroid.collections.IndexedIterator;
import xdroid.core.ParcelUtils;

        if (convertView == null) {
            result = (V) LayoutInflater.from(parent.getContext()).inflate(mLayoutId.get(getItemViewType(position)), parent, false);

            if (mBinder != null) {
                mBinder.onNewView(position, result);
            }
        } else {
            result = (V) convertView;
        }

        if (mBinder != null) {
            mBinder.onNewData(position, result, getItem(position));
        }

        return result;
    }

    @SuppressWarnings("unused")
    public D getFirstItem() {
        return getCount() > 0 ? getItem(0) : null;
    }

    @SuppressWarnings("unused")
    public D getLastItem() {
        int count = getCount();
        return count > 0 ? getItem(count - 1) : null;
    }

    @Override
    public Iterator<D> iterator() {
        return new IndexedIterator<D>(mData);