// Path: src/main/java/com/sigopt/exception/APIException.java
// public class APIException extends SigoptException {
//     APIMethod apiMethod;
// 
//     public APIException(String message, APIMethod apiMethod) {
//         super(message);
//         this.apiMethod = apiMethod;
//     }
// 
//     public APIMethod getApiMethod() {
//         return apiMethod;
//     }
// 
//     public String getBody() {
//         return apiMethod.response.body;
//     }
// 
//     public Integer getCode() {
//         return apiMethod.response.code;
//     }
// }
// 
// Path: src/main/java/com/sigopt/exception/SigoptException.java
// public abstract class SigoptException extends Exception {
//     private static final long serialVersionUID = 1L;
// 
//     public SigoptException(String message) {
//         super(message, null);
//     }
// 
//     public SigoptException(String message, Throwable e) {
//         super(message, e);
//     }
// }
// 
// Path: src/main/java/com/sigopt/net/APIMethodCaller.java
// public class APIMethodCaller<T extends APIObject> {
//     APIMethod apiMethod;
//     APIMethod.Builder apiMethodBuilder = new APIMethod.Builder();
//     Class<T> klass;
//     Type typeOfT;
//     String path;
// 
//     public APIMethodCaller(String method, String path) {
//         this(method, path, null);
//     }
//     public APIMethodCaller(String method, String path, Class<T> klass) {
//         this.apiMethodBuilder.method(method).path(path);
//         this.path = path;
//         this.klass = klass;
//     }
// 
//     public T call() throws SigoptException {
//         this.apiMethod = apiMethodBuilder.build();
//         apiMethod.execute();
//         return this.processBody(apiMethod.response.body);
//     }
// 
//     protected T processBody(String body) {
//         return APIResource.constructFromJson(apiMethod.response.body, this.klass, this.path);
//     }
// 
//     public APIMethod getApiMethod() {
//         return apiMethod;
//     }
// 
//     public Map<String, Object> getParams() {
//         return Collections.unmodifiableMap(MapHelper.ensure(this.apiMethodBuilder.params));
//     }
// 
//     public APIMethodCaller<T> data(APIObject data) {
//         return this.data(data.toJson());
//     }
// 
//     public APIMethodCaller<T> data(String data) {
//         this.apiMethodBuilder.data(data);
//         return this;
//     }
// 
//     public APIMethodCaller<T> params(Map<String, Object> params) {
//         this.apiMethodBuilder.params(params);
//         return this;
//     }
// 
//     public APIMethodCaller<T> addParam(String key, Object value) {
//         this.apiMethodBuilder.addParam(key, value);
//         return this;
//     }
// 
//     public APIMethodCaller<T> removeParam(String key) {
//         this.apiMethodBuilder.removeParam(key);
//         return this;
//     }
// 
//     public APIMethodCaller<T> addPathComponent(String key, String value) {
//         this.apiMethodBuilder.addPathComponent(key, value);
//         return this;
//     }
// 
//     public APIMethodCaller<T> headers(Map<String, String> headers) {
//         this.apiMethodBuilder.headers(headers);
//         return this;
//     }
// 
//     public APIMethodCaller<T> addHeader(String key, String value) {
//         this.apiMethodBuilder.addHeader(key, value);
//         return this;
//     }
// }


import com.sigopt.exception.APIException;
import com.sigopt.exception.SigoptException;
import com.sigopt.net.APIMethodCaller;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
        return ret;
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}

class PaginationIterable<T extends APIObject> implements Iterable {
    Pagination<T> pagination;

    public PaginationIterable(Pagination<T> pagination) {
        this.pagination = pagination;
    }

    public Iterator<T> iterator() {
        return ((Iterator<T>) new PaginationIterator<T>(this.pagination));
    }
}

public class Pagination<T extends APIObject> extends StructObject {
    Class<T> klass;
    APIMethodCaller<Pagination<T>> apiMethodCaller;

    public Pagination(Class<T> klass) {
        super();
        this.klass = klass;
        this.apiMethodCaller = null;
    }

// Path: src/main/java/com/sigopt/exception/APIException.java
// public class APIException extends SigoptException {
//     APIMethod apiMethod;
// 
//     public APIException(String message, APIMethod apiMethod) {
//         super(message);
//         this.apiMethod = apiMethod;
//     }
// 
//     public APIMethod getApiMethod() {
//         return apiMethod;
//     }
// 
//     public String getBody() {
//         return apiMethod.response.body;
//     }
// 
//     public Integer getCode() {
//         return apiMethod.response.code;
//     }
// }
// 
// Path: src/main/java/com/sigopt/exception/SigoptException.java
// public abstract class SigoptException extends Exception {
//     private static final long serialVersionUID = 1L;
// 
//     public SigoptException(String message) {
//         super(message, null);
//     }
// 
//     public SigoptException(String message, Throwable e) {
//         super(message, e);
//     }
// }
// 
// Path: src/main/java/com/sigopt/net/APIMethodCaller.java
// public class APIMethodCaller<T extends APIObject> {
//     APIMethod apiMethod;
//     APIMethod.Builder apiMethodBuilder = new APIMethod.Builder();
//     Class<T> klass;
//     Type typeOfT;
//     String path;
// 
//     public APIMethodCaller(String method, String path) {
//         this(method, path, null);
//     }
//     public APIMethodCaller(String method, String path, Class<T> klass) {
//         this.apiMethodBuilder.method(method).path(path);
//         this.path = path;
//         this.klass = klass;
//     }
// 
//     public T call() throws SigoptException {
//         this.apiMethod = apiMethodBuilder.build();
//         apiMethod.execute();
//         return this.processBody(apiMethod.response.body);
//     }
// 
//     protected T processBody(String body) {
//         return APIResource.constructFromJson(apiMethod.response.body, this.klass, this.path);
//     }
// 
//     public APIMethod getApiMethod() {
//         return apiMethod;
//     }
// 
//     public Map<String, Object> getParams() {
//         return Collections.unmodifiableMap(MapHelper.ensure(this.apiMethodBuilder.params));
//     }
// 
//     public APIMethodCaller<T> data(APIObject data) {
//         return this.data(data.toJson());
//     }
// 
//     public APIMethodCaller<T> data(String data) {
//         this.apiMethodBuilder.data(data);
//         return this;
//     }
// 
//     public APIMethodCaller<T> params(Map<String, Object> params) {
//         this.apiMethodBuilder.params(params);
//         return this;
//     }
// 
//     public APIMethodCaller<T> addParam(String key, Object value) {
//         this.apiMethodBuilder.addParam(key, value);
//         return this;
//     }
// 
//     public APIMethodCaller<T> removeParam(String key) {
//         this.apiMethodBuilder.removeParam(key);
//         return this;
//     }
// 
//     public APIMethodCaller<T> addPathComponent(String key, String value) {
//         this.apiMethodBuilder.addPathComponent(key, value);
//         return this;
//     }
// 
//     public APIMethodCaller<T> headers(Map<String, String> headers) {
//         this.apiMethodBuilder.headers(headers);
//         return this;
//     }
// 
//     public APIMethodCaller<T> addHeader(String key, String value) {
//         this.apiMethodBuilder.addHeader(key, value);
//         return this;
//     }
// }


// Path: src/main/java/com/sigopt/model/Pagination.java
import com.sigopt.exception.APIException;
import com.sigopt.exception.SigoptException;
import com.sigopt.net.APIMethodCaller;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

        return ret;
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}

class PaginationIterable<T extends APIObject> implements Iterable {
    Pagination<T> pagination;

    public PaginationIterable(Pagination<T> pagination) {
        this.pagination = pagination;
    }

    public Iterator<T> iterator() {
        return ((Iterator<T>) new PaginationIterator<T>(this.pagination));
    }
}

public class Pagination<T extends APIObject> extends StructObject {
    Class<T> klass;
    APIMethodCaller<Pagination<T>> apiMethodCaller;

    public Pagination(Class<T> klass) {
        super();
        this.klass = klass;
        this.apiMethodCaller = null;
    }

    public void bind(APIMethodCaller<Pagination<T>> apiMethodCaller) {