src/main/java/com/github/kskelm/baringo/model/Notification.java
public class Notification {

	/**
	 * Get the ID of the notification
	 * @return the id
	 */
	public long getId() {
		return id;
	}

	/**
	 * Get the User ID for the notification
	 * @return the userId
	 */
	public int getUserId() {
		return userId;
	}

	/**
	 * Whether or not the associated entity has been viewed yet
	 * @return the viewed
	 */
	public boolean isViewed() {
		return viewed;
	}

	/**
	 * Returns metadata about the content the notification is for
	 * @return the content
	 */
	public Object getContent() {
		return content;
	}


	// ==================================================
	private long id;
	@SerializedName("account_id")
	private int userId;
	private boolean viewed;
// TODO look into why this needs to exist
private int thisTriggersWarningIconSoILookAtThisLater;
	private Object content; // likely to be a comment, conversation, or message
	
	public String toString() {
		return Utils.toString( this );
	} // toString
	
} 
src/main/java/com/github/kskelm/baringo/model/gallery/GalleryProfile.java
public class GalleryProfile {

	
	/**
	 * Total number of comments this user has made in the gallery
	 * @return the commentCount
	 */
	public int getCommentCount() {
		return commentCount;
	}

	/**
	 * Total number of items favorited by this user in the gallery
	 * @return the favoriteCount
	 */
	public int getFavoriteCount() {
		return favoriteCount;
	}

	/**
	 * Total number of images submitted by this user
	 * @return the submissionCount
	 */
	public int getSubmissionCount() {
		return submissionCount;
	}

	/**
	 * A list of the trophies the user has earned
	 * @return the trophies
	 */
	public ArrayList<Trophy> getTrophies() {
		return trophies;
	}

	// ===================================================
	@SerializedName("total_gallery_comments")
	private int commentCount;
	@SerializedName("total_gallery_favorites")
	private int favoriteCount;
	@SerializedName("total_gallery_submissions")
	private int submissionCount;
	private ArrayList<Trophy> trophies;
	
	@Override
	public String toString() {
		return Utils.toString( this );
	}

} // class AccountSettings
src/main/java/com/github/kskelm/baringo/model/Album.java
public class Album {


	/**
	 * An Album has a privacy level. See <a href="https://help.imgur.com/hc/en-us/articles/201746817-Image-and-album-privacy-explained-">Imgur's documentation</a>.
	 */
	public enum Privacy {
		/**
		 * An album will be visible to public. Default.
		 */
		@SerializedName("public") Public,
		/**
		 * An album will be visible to public, but it won't show up in galleries
		 */
		@SerializedName("hidden") Hidden,
		/**
		 * An album will be invisible to everyone but its owner
		 */
		@SerializedName("secret") Secret
	}

	/**
	 * An Album has a layout. See <a href="https://help.imgur.com/hc/en-us/articles/201746817-Image-and-album-privacy-explained-">Imgur's documentation</a>.
	 */
	public enum Layout {
		/**
		 * An album will be rendered in blog format
		 */
		@SerializedName("blog") Blog,
		/**
		 * An album will be rendered as a grid of images
		 */
		@SerializedName("grid") Grid,
		/**
		 * An album will be rendered with images side-by-side
		 */
		@SerializedName("horizontal") Horizontal,
		/**
		 * An album will be rendered vertically
		 */
		@SerializedName("vertical") Vertical
	}

	
	/**
	 * The id for the album
	 * @return the id
	 */
	public String getId() {
		return id;
	}


	/**
	 * The title of the album
	 * @return the title
	 */
	public String getTitle() {
		return title;
	}


	/**
	 * The description of the album
	 * @return the description
	 */
	public String getDescription() {
		return description;
	}


	/**
	 * The date/time the album was created
	 * @return the createdAt
	 */
	public Date getCreatedAt() {
		return createdAt;
	}


	/**
	 * The image ID of the album cover image
	 * @return the coverId
	 */
	public String getCoverId() {
		return coverId;
	}


	/**
	 * The width in pixels of the cover image
	 * @return the coverWidth
	 */
	public int getCoverWidth() {
		return coverWidth;
	}


	/**
	 * The height in pixels of the cover image
	 * @return the coverHeight
	 */
	public int getCoverHeight() {
		return coverHeight;
	}


	/**
	 * The userName of the account that created the album
	 * @return the userName
	 */
	public String getUserName() {
		return userName;
	}


	/**
	 * The userId of the account that created the album
	 * @return the userId
	 */
	public int getUserId() {
		return userId;
	}


	/**
	 * The privacy setting of the album
	 * @return the privacy
	 */
	public Privacy getPrivacy() {
		return privacy;
	}


	/**
	 * The view layout of the album
	 * @return the layout
	 */
	public Layout getLayout() {
		return layout;
	}


	/**
	 * The number of times the album has been viewed
	 * @return the view count
	 */
	public int getViewCount() {
		return viewCount;
	}


	/**
	 * The URL of the album
	 * @return the link
	 */
	public String getLink() {
		return link;
	}


	/**
	 * If an authenticated account is logged into the client,
	 * returns true if the user favorited this album
	 * @return the favorite
	 */
	public boolean isFavorite() {
		return favorite;
	}


	/**
	 * Returns true if the album is marked as nsfw. Defaults to false.
	 * @return the nsfw
	 */
	public boolean isNsfw() {
		return nsfw;
	}


	/**
	 * If the image has been categorized by the back-end, this will
	 * name the section it belongs in. (funny, cats, adviceanimals, wtf, etc)
	 * @return the section
	 */
	public String getSection() {
		return section;
	}


	/**
	 * If an authenticated account is logged into the client, this
	 * will contain the deleteHash necessary to ask Imgur to delete the
	 * album.
	 * @return the deleteHash
	 */
	public String getDeleteHash() {
		return deleteHash;
	}

	/**
	 * An array of all of the images in the album (but only when the album
	 * is being requested directly via its ID)
	 * @return the images
	 */
	public List<Image> getImages() {
		return images;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	/**
	 * Set the description for the album
	 * @param description the description to set
	 */
	public void setDescription(String description) {
		this.description = description;
	}


	/**
	 * Set the id of the cover image for the album
	 * @param coverId the coverId to set
	 */
	public void setCoverId(String coverId) {
		this.coverId = coverId;
	}


	/**
	 * Set the privacy level for the album
	 * @param privacy the privacy to set
	 */
	public void setPrivacy(Privacy privacy) {
		this.privacy = privacy;
	}


	/**
	 * Set the layout of the album
	 * @param layout the layout to set
	 */
	public void setLayout(Layout layout) {
		this.layout = layout;
	}


	/**
	 * Set whether the album is favorited by
	 * the currently-logged-in account.  Does
	 * nothing if not logged in.
	 * @param favorite the favorite to set
	 */
	public void setFavorite(boolean favorite) {
		this.favorite = favorite;
	}


	/**
	 * The list of images in the album.
	 * @param images the images to set
	 */
	public void setImages(List<Image> images) {
		this.images = images;
	}

	/**
	 * This is for determining the proper ID
	 * to send Imgur when referencing this
	 * album.  If the album is anonymous,
	 * return the deletehash instead of the
	 * album id.
	 * @return the id imgur will need to work on the album
	 */
	public String getAPIReferenceKey() {
		if( this.userId == 0 ) {
			return this.deleteHash;
		} else {
			return this.id;
		} // if-else
	} // getAPIReferenceKey
	
	public String toString() {
		return Utils.toString( this );
	} // toString


	// =========================================================

	// Internal only -- copy Image array to id array for save
	public void prepareForSave() {
		ids = null;
		if( images != null && images.size() > 0 ) {
			this.ids = new String[images.size()];
			int index = 0;
			for( Image image : images ) {
				this.ids[index++] = image.getId();
			} // for
		} // if
	} // prepareForSave
	
	
	private String id;
	private String title;
	private String description;
	@SerializedName("datetime")
	private Date createdAt;
	@SerializedName("cover")
	private String coverId;
	@SerializedName("cover_width")
	private int coverWidth;
	@SerializedName("cover_height")
	private int coverHeight;
	@SerializedName("account_url")
	private String userName;
	@SerializedName("account_id")
	private int userId;
	private Privacy privacy = Privacy.Public;
	private Layout layout = Layout.Vertical;
	@SerializedName("views")
	private int viewCount;
	private String link;
	private boolean favorite;
	private boolean nsfw;
	private String section;
	@SerializedName("deletehash")
	private String deleteHash;
	private String[] ids;
	private List<Image> images;
	
	/**
	 * internal only
	 * @param hash set the delete hash (result of saving to imgur)
	 */
	public void setDeleteHash( String hash ) {
		this.deleteHash = hash;
	}

	/**
	 * internal only
	 * @param src Album object to copy from
	 */
	public void copyFrom( Album src ) {
        Field[] fields = Album.class.getDeclaredFields();
        for (Field field : fields) {
        		field.setAccessible( true );
        	    try {
					field.set( this, field.get( src ) );
				} catch (IllegalArgumentException | IllegalAccessException e) {
					e.printStackTrace();
				}
        } // for
	} // copyFrom
} // Album
src/main/java/com/github/kskelm/baringo/model/OAuth2.java
public class OAuth2 {

	/**
	 * 
	 * This isn't really used anywhere but the
	 * BaringoAuthDemo where it's just to show
	 * what kind of token has come back.
	 *
	 */
	public enum TokenType {
		/**
		 * Bearer tokens are the keys to the kingdom if you
		 * have them.
		 */
		@SerializedName( "bearer" )
		Bearer,
		/**
		 * Basic authentication
		 */
		@SerializedName( "basic" )
		Basic,
		/**
		 * Authentication via "anonymous" client id
		 */
		@SerializedName( "client" )
		Client
	}

	public static final int MIN_EXPIRE_THRESHOLD = 60; // if < 60 secs til expire, refresh

	/**
	 * Returns true if we should go ahead and update the access token.
	 * @return is expiring within our expiration window?
	 */
	public boolean isExpiringSoon() {
		return getExpiresIn() < MIN_EXPIRE_THRESHOLD;
	}
	
	/**
	 * Returns the access token that is used on a per-call basis
	 * @return the accessToken
	 */
	public String getAccessToken() {
		return accessToken;
	}

	/**
	 * Returns the refresh token that's used to update the access
	 * token when it expires
	 * @return the refreshToken
	 */
	public String getRefreshToken() {
		return refreshToken;
	}

	/**
	 * Returns the number of seconds the access token expires in.
	 * 
	 * @return the expires_in
	 */
	public int getExpiresIn() {
		long start = createdDate.getTime();
		long now = System.currentTimeMillis();
		int secsOld = (int)((now-start) / 1000);
		return expiresIn-secsOld;
	}

	/**
	 * Returns the date/time when the access token expires, subject
	 * to the same conditions as {@link #getExpiresIn}
	 * @return the date/time on which the access token expires
	 */
	public Date getExpiresOn() {
		long expSecs = createdDate.getTime() + (long)expiresIn * 1000;
		return new Date( expSecs );
	}

	/**
	 * Returns the token type.  Probably Bearer.
	 * @return the tokenType
	 */
	public TokenType getTokenType() {
		return tokenType;
	}

	/**
	 * Returns the scope of the token's authorization.
	 * Probably null = everything.
	 * @return the scope
	 */
	public String getScope() {
		return scope;
	}

	/**
	 * Returns the numeric ID of the authenticated user.
	 * @return the userId
	 */
	public int getUserId() {
		return userId;
	}

	/**
	 * Returns the userName of the authenticated user.
	 * @return the userName
	 */
	public String getUserName() {
		return userName;
	}

	// ===================================================
	@SerializedName( "access_token")
	private String accessToken;
	@SerializedName( "refresh_token")
	private String refreshToken;
	@SerializedName( "expires_in")
	private int expiresIn;
	@SerializedName( "token_type")
	private TokenType tokenType;
	private String scope;
	@SerializedName( "account_id")
	private int userId;
	@SerializedName( "account_username")
	private String userName;
	private Date createdDate = new Date( System.currentTimeMillis() );
	
	@Override
	public String toString() {
		return Utils.toString( this );
	}

} // class OAuth2
src/main/java/com/github/kskelm/baringo/model/Conversation.java
public class Conversation {

	
	/**
	 * Returns the id of the conversation
	 * @return the id
	 */
	public long getId() {
		return id;
	}
	/**
	 * Returns a short summary of the beginning of the message
	 * @return the lastMessagePreview
	 */
	public String getLastMessagePreview() {
		return lastMessagePreview;
	}
	/**
	 * Returns the date/time on which the most recent message was
	 * posted (could be used to keep track of badging or whatever)
	 * @return the lastMessageDate
	 */
	public Date getLastMessageDate() {
		return lastMessageDate;
	}
	/**
	 * Returns the userId of the author
	 * @return the authorId
	 */
	public int getAuthorId() {
		return authorId;
	}
	/**
	 * Returns the userName of the author
	 * @return the authorName
	 */
	public String getAuthorName() {
		return authorName;
	}
	
	/**
	 * Returns the list of Message objects associated
	 * with this conversation.  Messages are returned
	 * by the API in pages. They are returned in reverse-
	 * chronological order; the most recent messages will
	 * be at the top.
	 * @return the messages
	 */
	public List<Message> getMessages() {
		return messages;
	}
	
	/**
	 * Returns the total number of messages in the conversation.
	 * @return the messageCount
	 */
	public int getMessageCount() {
		return messageCount;
	}
	
	public String toString() {
		return Utils.toString( this );
	} // toString

	
	// ================================================
	private long id;
	@SerializedName("last_message_preview")
	private String lastMessagePreview;
	@SerializedName("datetime")
	private Date lastMessageDate;
	@SerializedName("with_account_id")
	private int authorId;
	@SerializedName("with_account")
	private String authorName;
	@SerializedName("message_count")
	private int messageCount;
	private List<Message> messages = new ArrayList<>();
	
}
src/main/java/com/github/kskelm/baringo/model/Image.java
public class Image {
	
	
	/**
	 * A list of the available thumbnail sizes for images
	 */
	public enum ThumbnailType {
		/**
		 * Small square 90x90 (not proportional)
		 */
		SmallSquare,
		/**
		 * Big square 160x160 (not proportional)
		 */
		BigSquare,
		/**
		 * Small 160x160
		 */
		Small,
		/**
		 * Medium 320x320
		 */
		Medium,
		/**
		 * Large 640x640
		 */
		Large,
		/**
		 * Huge 1024x1024
		 */
		Huge
	}
	
	/**
	 * Given a thumbnail size, returns the link for the
	 * corresponding thumbnail file.
	 * @param tt the thumbnail time
	 * @return thumbnail link
	 */
	public String getThumbnailLink( ThumbnailType tt ) {
		int dotAt = link.lastIndexOf( '.' );
		String suffix = suffixes.get(tt);
		return link.substring( 0, dotAt ) + suffix + link.substring( dotAt );
	} // getThumbnailLink
	
	/**
	 * The ID for the image
	 * @return the id
	 */
	public String getId() {
		return id;
	}

	/**
	 * The title of the image.
	 * @return the title
	 */
	public String getTitle() {
		return title;
	}

	/**
	 * Description of the image.
	 * @return the description
	 */
	public String getDescription() {
		return description;
	}

	/**
	 * Date/time of upload
	 * @return the uploadDate
	 */
	public Date getUploadDate() {
		return uploadDate;
	}

	/**
	 *  	Image MIME type.
	 *  @return the mimeType
	 */
	public String getMimeType() {
		return mimeType;
	}

	/**
	 *  	is the image animated
	 *  @return the animated
	 */
	public boolean isAnimated() {
		return animated;
	}

	/**
	 *  	The width of the image in pixels
	 *  @return the width
	 */
	public int getWidth() {
		return width;
	}

	/**
	 *  	The height of the image in pixels
	 *  @return the height
	 */
	public int getHeight() {
		return height;
	}

	/**
	 * The size of the image in bytes
	 * @return the size
	 */
	public int getSize() {
		return size;
	}

	/**
	 * The number of image views
	 * @return the views
	 */
	public int getViewCount() {
		return viewCount;
	}

	/**
	 * Total internet bandwidth wasted by the image in bytes
	 * @return the bandwidth
	 */
	public long getBandwidth() {
		return bandwidth;
	}

	/**
	 *  	The deletehash for an image is a means of modifying/deleting
	 *  it without necessarily owning it. if you're logged in as the
	 *  image owner then you can delete it by the delete hash or via
	 *  the image id.  If it's an anonymous image not owned by anyone,
	 *  it is deletable only with this value.
	 *  <p>
	 *  If the image is "anonymous," you'll never see this value again
	 *  unless you keep a copy of it yourself after image creation.
	 * @return the deletehash
	 */
	public String getDeleteHash() {
		return deleteHash;
	}

	/**
	 *  The original filename.  This will only be filled in if you're
	 *  logged in as the owner (assuming it was set at upload)
	 *  @return the name
	 */
	public String getFileName() {
		return name;
	}

	/**
	 * If the image has been categorized by the backend then this will contain the section the image belongs in. (funny, cats, adviceanimals, wtf, etc) link
	 * @return the section
	 */
	public String getSection() {
		return section;
	}

	/**
	 * The direct link to the the image.
	 * <p>
	 * NOTE: if fetching an animated GIF that was over 20MB in original size, a .gif thumbnail will be returned.
	 * @return the link
	 */
	public String getLink() {
		return link;
	}

	/**
	 * The .gifv link. Only available if the image is animated and type is 'image/gif'.
	 * @return the gifv
	 */
	public String getGifv() {
		return gifv;
	}

	/**
	 * The direct link to the .mp4. Only available if the image is animated and type is 'image/gif'.
	 * @return the mp4
	 */
	public String getMp4() {
		return mp4;
	}

	/**
	 *  The direct link to the .webm. Only available if the image is animated and type is 'image/gif'.
	 *  @return the webm
	 */
	public String getWebm() {
		return webm;
	}

	/**
	 * Whether the image has a looping animation. Only available if the image is animated and type is 'image/gif'.
	 * @return the looping
	 */
	public boolean isLooping() {
		return looping;
	}

	/**
	 * Indicates if the image has been marked as nsfw or not. Defaults to false if information is not available.
	 * @return the nsfw
	 */
	public boolean isNsfw() {
		return nsfw;
	}

	/**
	 * Indicates if the current user favorited the image. False if not signed in.
	 * @return the favorite
	 */
	public boolean isFavorite() {
		return favorite;
	}

	/**
	 * Sets the favorite status on the image.
	 * <p>
	 * <b>DO NOT USE THIS...</b>
	 * this is used by the ImageService.  Instead call ImageService's
	 * favoriteImage() and unfavoriteImage() and the image object
	 * will be updated accordingly.
	 * @param favorite true if favorited
	 */
	public void setFavorite(boolean favorite) {
		this.favorite = favorite;
	}
	

	/**
	 *  	The current user's vote on the album. null if not signed in, if the user hasn't voted on it, or if not submitted to the gallery.
	 *  @return the vote
	 */
	public String getVote() {
		return vote;
	}

	// =====================================================
	
	private String id;
	private String title;
	private String description;
	@SerializedName("datetime")
	private Date uploadDate;
	@SerializedName("type")
	private String mimeType;
	private boolean animated;
	private int width;
	private int height;
	private int size;
	@SerializedName("views")
	private int viewCount;
	private long bandwidth;
	@SerializedName("deletehash")
	private String deleteHash;
	private String name;
	private String section;
	private String link;
	private String gifv;
	private String mp4;
	private String webm;
	private boolean looping;
	private boolean nsfw;
	private boolean favorite;
	private String vote;

	private static HashMap<ThumbnailType,String> suffixes = new HashMap<>();
	static {
		suffixes.put( ThumbnailType.SmallSquare, "s" );
		suffixes.put( ThumbnailType.BigSquare, "b" );
		suffixes.put( ThumbnailType.Small, "t" );
		suffixes.put( ThumbnailType.Medium, "m" );
		suffixes.put( ThumbnailType.Large, "l" );
		suffixes.put( ThumbnailType.Huge, "h" );
	}
	

	public String toString() {
		return Utils.toString( this );
	} // toString
}
src/main/java/com/github/kskelm/baringo/model/AccountSettings.java
public class AccountSettings {

	/**
	 * Get the username of the account
	 * @return the accountUrl
	 */
	public String getUserName() {
		return userName;
	}


	/**
	 * Get the email address of the account
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}


	/**
	 * Returns whether or not the user is able to upload higher quality images with less compression
	 * @return the highQuality
	 */
	public boolean isHighQuality() {
		return highQuality;
	}


	/**
	 * Returns whether or not the user's new images are automatically publicly accessible
	 * @return the publicImages
	 */
	public boolean isPublicImages() {
		return publicImages;
	}

 	/**
	 * Gets the default privacy value for new albums for this user
	 * @return the albumPrivacy
	 */
	public Album.Privacy getAlbumPrivacy() {
		return albumPrivacy;
	}


	/**
	 * The date on which this accounts professional status expires, or null if not pro
	 * @return the proExpiration
	 */
	public Date getProExpiration() {
		return proExpiration;
	}


	/**
	 * Get whether or not this user has accepted the gallery terms
	 * @return the acceptedGalleryTerms
	 */
	public boolean isAcceptedGalleryTerms() {
		return acceptedGalleryTerms;
	}


	/**
	 * Get an list of the email addresses that have been activated to allow uploading
	 * @return the activeEmails
	 */
	public ArrayList<String> getActiveEmails() {
		return activeEmails;
	}


	/**
	 * Get whether the user is accepting incoming messages or not
	 * @return the messagingEnabled
	 */
	public boolean isMessagingEnabled() {
		return messagingEnabled;
	}


	/**
	 * Get a list of users this account has blocked
	 * @return the blockedUsers
	 */
	public ArrayList<BlockedUser> getBlockedUsers() {
		return blockedUsers;
	}


	/**
	 * Get whether or not this account has opted to see mature content in the gallery lists.
	 * @return the showMature
	 */
	public boolean isShowMature() {
		return showMature;
	}


	// ============================================================
	@SerializedName("account_url")
	private String userName;
	private String email;
	@SerializedName("high_quality")
	private boolean highQuality;
	@SerializedName("public_images")
	private boolean publicImages;
	@SerializedName("album_privacy")
	private Album.Privacy albumPrivacy;
	@SerializedName("pro_expiration")
	private Date proExpiration;
	@SerializedName("accepted_gallery_terms")
	private boolean acceptedGalleryTerms;
	@SerializedName("active_emails")
	private ArrayList<String> activeEmails;
	@SerializedName("messaging_enabled")
	private boolean messagingEnabled;
	@SerializedName("blocked_users")
	private ArrayList<BlockedUser> blockedUsers;
	@SerializedName("show_mature")
	private boolean showMature;

	private AccountSettings() {}

	@Override
	public String toString() {
		return Utils.toString( this );
	}

} // class AccountSettings
src/main/java/com/github/kskelm/baringo/model/ImgurResponseWrapper.java
public class ImgurResponseWrapper<T> {

	/**
	 * Actual payload
	 */
	private T data;
	/**
	 * Success status
	 */
	private boolean success;
	/**
	 * HTTP status
	 */
	private int status;
	
	
	/**
	 * @return the data
	 */
	public T getData() {
		return data;
	}


	/**
	 * @param data the data to set
	 */
	public void setData(T data) {
		this.data = data;
	}


	/**
	 * @return the success
	 */
	public boolean isSuccess() {
		return success;
	}


	/**
	 * @param success the success to set
	 */
	public void setSuccess(boolean success) {
		this.success = success;
	}


	/**
	 * @return the status
	 */
	public int getStatus() {
		return status;
	}


	/**
	 * @param status the status to set
	 */
	public void setStatus(int status) {
		this.status = status;
	}


	@Override
	public String toString() {
		return String.format(
				"ImgurResponseWrapper[success=%b, status=%d, data=%s]",
				success, status, data );
	} // toString

} // class ImgurResponseWrapper
src/main/java/com/github/kskelm/baringo/model/TagGallery.java
public class TagGallery {

	
	/**
	 * Returns the name of the tag gallery (this will be the tag itself)
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * This is the number of users following this tag
	 * @return the followerCount
	 */
	public int getFollowerCount() {
		return followerCount;
	}
	/**
	 * This is the number of items tagged with this word
	 * @return the itemCount
	 */
	public int getItemCount() {
		return itemCount;
	}
	/**
	 * If there currently an authenticated user, this will indicate
	 * whether they are following this tag or not.  Instances of
	 * this object created before authenticating a user or before
	 * following the tag in CustomGallery will not match current
	 * server state.
	 * @return the following
	 */
	public boolean isFollowing() {
		return following;
	}
	/**
	 * Returns the current page of results for the gallery.
	 * @return the items
	 */
	public List<GalleryItem> getItems() {
		return _convertedItems;
	}
	@Override
	public String toString() {
		return Utils.toString( this );
	}


	// ==========================================
	
	/**
	 * INTERNAL ONLY
	 * @param items converts proxy objects to real GalleryItem objects
	 */
	public void setConvertedItems(List<GalleryItem> items ) {
		this._convertedItems = items;
	}
	
	/**
	 * INTERNAL ONLY
	 * @return list of proxy objects that you shouldn't use for anything
	 */
	public List<GalleryItemProxy> getInternalItems() {
		return _internalItems;
	}
	

	private String name;
	private int followerCount;
	@SerializedName("total_items")
	private int itemCount;
	private boolean following;
	private List<GalleryItem> _convertedItems;
	@SerializedName("items")
	private List<GalleryItemProxy> _internalItems;
	
}
src/main/java/com/github/kskelm/baringo/model/gallery/CustomGallery.java
public class CustomGallery {


	/**
	 * Returns the name of the user that created the gallery
	 * @return the userName
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * Returns a link to the URL for the gallery
	 * @return the link
	 */
	public String getLink() {
		return link;
	}

	/**
	 * Returns the list of tags associated with the custom gallery
	 * @return the tags
	 */
	public List<String> getTags() {
		return tags;
	}

	/**
	 * Get the number of items in the gallery total
	 * @return the itemCount
	 */
	public int getItemCount() {
		return itemCount;
	}

	/**
	 * Return the list of items in the custom gallery.
	 * Each item can be cast to its more specific
	 * GalleryImage or GalleryAlbum, as necessary.
	 * @return the items list of GalleryItems
	 */
	public List<GalleryItem> getItems() {
		return _convertedItems;
	}

	// ================================================
	@SerializedName("account_url")
	private String userName;
	private String link;
	private List<String> tags;
	@SerializedName("item_count")
	private int itemCount;
	@SerializedName("items")
	private List<GalleryItemProxy> _internalItems;
	private List<GalleryItem> _convertedItems;

	// internal filth only
	public void setConvertedItems(List<GalleryItem> items ) {
		this._convertedItems = items;
	}
	
	/**
	 * Internal only, don't use this
	 * @return list of proxy objects
	 */
	public List<GalleryItemProxy> getInternalItems() {
		return _internalItems;
	}
	
	public String toString() {
		return Utils.toString( this );
	} // toString
}
src/main/java/com/github/kskelm/baringo/CommentService.java
public class CommentListWrapper implements JsonDeserializer<CommentListWrapper> {
	List<Comment> comms = null;

	@Override
	public CommentListWrapper deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {

		JsonElement elem = json.getAsJsonObject();
		CommentListWrapper wrap = new CommentListWrapper();
		wrap.comms = new ArrayList<Comment>();
		if (elem.isJsonArray()) {
			Comment[] comms = context.deserialize(elem.getAsJsonArray(), Comment[].class);
			for( Comment comm : comms ) {
				wrap.comms.add( comm );
			} // for
		} else if (elem.isJsonObject()) {
			Comment comm = (Comment) context.deserialize(elem.getAsJsonObject(), Comment.class);
			wrap.comms.add( comm );
		} else {
			throw new JsonParseException("Unsupported type of comment list element");
		} // if-else
		return wrap;
	}
}
src/main/java/com/github/kskelm/baringo/model/Account.java
public class Account {

	/**
	 * When returning gallery items, sort by this
	 */
	public enum GallerySort {
		/**
		 * Order results newest first
		 */
		newest,
		/**
		 * Order results oldest first
		 */
		oldest
	}

	/**
	 * Account ID for the username requested
	 * @return  user account id
	 */
	public int getId() {
		return id;
	}

	/**
	 * Returns the userName associated with this account
	 * @return Account's userName
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * Returns the basic description the user filled out to appear in their gallery page.
	 * This is set via setAccountSettings()
	 * @return description
	 */
	public String getBio() {
		return bio;
	}

	/**
	 * Returns The reputation for the account, in its numerical format
	 * @return reputation
	 */
	public double getReputation() {
		return reputation;
	}

	/**
	 * Returns the date/time the account was created.
	 * @return Date of account creation.
	 */
	public Date getCreated() {
		return created;
	}

	// ================================================
	
	protected Account() {}
	
	private int id;
	@SerializedName("url")
	private String userName;
	private String bio;
	private double reputation;
	private Date created;
	@SerializedName("pro_expiration")
	private Date proExpiration;

	public String toString() {
		return Utils.toString( this );
	} // toString
} // class Account
src/main/java/com/github/kskelm/baringo/model/Votes.java
public class Votes {

	/**
	 * The number of upvotes the item has received
	 * @return the upVotes
	 */
	public int getUpVotes() {
		return upVotes;
	}

	/**
	 * The number of downvotes the item has received
	 * @return the downVotes
	 */
	public int getDownVotes() {
		return downVotes;
	}

	// ===================================================
	
	protected Votes() {}
	
	@SerializedName("ups")
	private int upVotes;
	@SerializedName("downs")
	private int downVotes;
	
	@Override
	public String toString() {
		return Utils.toString( this );
	}

} // class AccountSettings
src/main/java/com/github/kskelm/baringo/model/TagVoteList.java
public class TagVoteList {

	/**
	 * Returns the tag votes
	 * @return the tag
	 */
	public List<TagVote> getList() {
		return tagVotes;
	}

	@Override
	public String toString() {
		return Utils.toString( this );
	}

	// =============================================
	
	@SerializedName("tags")
	private List<TagVote> tagVotes;

}
src/main/java/com/github/kskelm/baringo/model/gallery/GalleryItemProxy.java
@SuppressWarnings("unused")
public class GalleryItemProxy {

// TODO: SWITCH THIS OVER TO THE JSONDESERIALIZER APPROACH USED IN COMMENTSERVICE
	public boolean isAlbum() {
		return album;
	}
	
	public String id;
	public String title;
	public String description;
	@SerializedName("datetime")
	public Date uploadDate;
	public int views;
	public String link;
	public String vote;
	public int ups;
	public int downs;
	public int points;
	public int score;
	public boolean favorite;
	public boolean nsfw;
	@SerializedName("comment_count")
	public int commentCount;
	@SerializedName("comment_preview")
	public List<Comment> commentPreview;
	public String topic;
	@SerializedName("topic_id")
	public int topicId;
	@SerializedName("account_url")
	public String userName;
	@SerializedName("account_id")
	public int userId;
	@SerializedName("type")
	public String mimeType;
	public boolean animated;
	public int width;
	public int height;
	public int size;
	public long bandwidth;
	@SerializedName("deletehash")
	public String deleteHash;
	public String gifvLink;
	public String mp4Link;
	public String webmLink;
	public boolean looping;
	public GalleryItem.Section section;
	public String coverId;
	public int coverWidth;
	public int coverHeight;
	public Privacy privacy;
	public Layout layout;
	@SerializedName("images_count")
	public int imageCount;
	public List<Image> images;
	@SerializedName("is_album")
	public boolean album;
	// only for meme subclasses
// UPDATE: apparently Imgur doesn't really support this anymore at least
// as of 6/24/15.  https://groups.google.com/forum/#!msg/imgur/BEyZryAhGi0/yfOFyixuPy4J
//	@SerializedName("is_album")
//	protected MemeMetaData memeMetaData;

	// only for subreddit classes
// UPDATE: apparently Imgur doesn't really support this anymore
//	@SerializedName("reddit_comments")
//	protected String redditCommentsUrl;
	
}
src/main/java/com/github/kskelm/baringo/model/Topic.java
public class Topic {
	
	
	/**
	 * Returns the id of the topic
	 * @return the id
	 */
	public int getId() {
		return id;
	}
	/**
	 * Returns the name of the topic
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * This returns the topic's description
	 * @return the description
	 */
	public String getDescription() {
		return description;
	}
	/**
	 * This is the CSS class used on the Imgur website to style the ephemeral topics
	 * @return the cssClass
	 */
	public String getCssClass() {
		return cssClass;
	}
	/** 
	 * Whether or not the topic is ephemeral, e.g. current events
	 * @return the ephemeral
	 */
	public boolean isEphemeral() {
		return ephemeral;
	}
	/**
	 * The current top image or album in this top
	 * @return the topItem
	 */
	public GalleryItem getTopItem() {
		return _convertedTopItem;
	}
	
	@Override
	public String toString() {
		return Utils.toString( this );
	}


	// ===================================================
	
	public Topic() { }
	
	
	private int id;
	private String name;
	private String description;
	@SerializedName("css")
	private String cssClass;
	private boolean ephemeral;
	@SerializedName("topPost")
	private GalleryItemProxy _internalTopItem;
	private GalleryItem _convertedTopItem;

	/**
	 * internal filth, don't use this.
	 * @return a proxy object
	 */
	public GalleryItemProxy getItemProxy() {
		return _internalTopItem;
	}
	
	/**
	 * internal filth, don't use this
	 * @param item - an item 
	 */
	public void setConvertedItem( GalleryItem item ) {
		_convertedTopItem = item;
	}

} 
src/main/java/com/github/kskelm/baringo/model/Comment.java
public class Comment {

	
	/**
	 * When requesting a list of comments this is the order.
	 * Note that loading comments for an image/album is done
	 * from those services, not this one.
	 */
	public enum Sort {
		/**
		 * Sort comments with the newest ones first.
		 */
		@SerializedName("newest") Newest,
		/**
		 * Sort comments with the oldest first
		 */
		@SerializedName("oldest") Oldest,
		/**
		 * Sort comments with the top-rated ones first
		 */
		@SerializedName("best") Best,
		/**
		 * Sort comments with the worst-rated ones first
		 */
		@SerializedName("worst") Worst;
	}
	
	/**
	 * The ID of the comment
	 * @return the id
	 */
	public long getId() {
		return id;
	}


	/**
	 * The ID of the image the comment is for
	 * @return the imageId
	 */
	public String getImageId() {
		return imageId;
	}


	/**
	 * The comment itself
	 * @return the comment
	 */
	public String getComment() {
		return comment;
	}


	/**
	 * The userName of the author
	 * @return the author
	 */
	public String getAuthorName() {
		return authorName;
	}


	/**
	 * The account ID of the author
	 * @return the authorId
	 */
	public int getAuthorId() {
		return authorId;
	}


	/**
	 * True if the comment was made on an album
	 * @return the onAlbum
	 */
	public boolean isOnAlbum() {
		return onAlbum;
	}


	/**
	 * The ID of the album cover image to display with this comment, if any
	 * @return the albumCover
	 */
	public String getAlbumCover() {
		return albumCover;
	}


	/**
	 * Number of upvotes for the comment
	 * @return the ups
	 */
	public int getUps() {
		return ups;
	}


	/**
	 * Number of downvotes for the comment
	 * @return the downs
	 */
	public int getDowns() {
		return downs;
	}


	/**
	 * Number of upvotes-downvotes
	 * @return the points
	 */
	public int getPoints() {
		return points;
	}


	/**
	 * Date/time the comment was created
	 * @return the createdAt
	 */
	public Date getCreatedAt() {
		return createdAt;
	}


	/**
	 * If this is a reply, the comment ID it is replying to
	 * @return the parentId, or 0 if none
	 */
	public long getParentId() {
		return parentId;
	}


	/**
	 * True if this comment has been deleted
	 * @return the deleted
	 */
	public boolean isDeleted() {
		return deleted;
	}


	/**
	 * The current authenticated user's vote on this comment.
	 * Null if not currently signed in or if the user hasn't offered
	 * an opinion yet.
	 * @return the vote
	 */
	public Vote getVote() {
		return vote;
	}


	/**
	 * Get all of the replies for this comment.  If none, this
	 * will be an empty list rather than a null.
	 * @return the children
	 */
	public List<Comment> getChildren() {
		return children;
	}

	public String toString() {
		return Utils.toString( this );
	} // toString
	
	
	// ================================================
	private long id;
	@SerializedName("image_id")
	private String imageId;
	private String comment;
	@SerializedName("author")
	private String authorName;
	@SerializedName("author_id")
	private int authorId;
	@SerializedName("on_album")
	private boolean onAlbum;
	@SerializedName("album_cover")
	private String albumCover;
	private int ups;
	private int downs;
	private int points;
	@SerializedName("datetime")
	private Date createdAt;
	@SerializedName("parent_id")
	private long parentId;
	private boolean deleted;
	private Vote vote;
	private List<Comment> children = new ArrayList<>();

}
src/main/java/com/github/kskelm/baringo/model/gallery/GalleryImage.java
public class GalleryImage extends GalleryItem {

	
	/**
	 * Return the mimeType of the image
	 * @return the mimeType
	 */
	public String getMimeType() {
		return mimeType;
	}

	/**
	 * Returns true if the image is animated
	 * @return the animated
	 */
	public boolean isAnimated() {
		return animated;
	}

	/**
	 * Returns the width of the image in pixels
	 * @return the width
	 */
	public int getWidth() {
		return width;
	}

	/**
	 * Returns the height of the image in pixels
	 * @return the height
	 */
	public int getHeight() {
		return height;
	}

	/**
	 * Returns the size of the image in bytes
	 * @return the size
	 */
	public int getSize() {
		return size;
	}

	/**
	 * Returns the total number of bytes of Internet bandwidth this image has wasted
	 * @return the bandwidth
	 */
	public long getBandwidth() {
		return bandwidth;
	}

	/**
	 * If the client is currently logged into a user and that user owns this image, this is the hash that can be used to delete the image, else null.
	 * @return the deleteHash
	 */
	public String getDeleteHash() {
		return deleteHash;
	}

	/**
	 * If the image is animated, this is a link to a gifv formatted version
	 * @return the gifvLink
	 */
	public String getGifvLink() {
		return gifvLink;
	}

	/**
	 * If the image is animated, this is a link to an mp4 formatted version
	 * @return the mp4Link
	 */
	public String getMp4Link() {
		return mp4Link;
	}

	/**
	 * If the image is animated, this is a link to a webm formatted version
	 * @return the webmLink
	 */
	public String getWebmLink() {
		return webmLink;
	}

	/**
	 * Returns true if the image is animated and it loops continuously
	 * @return the looping
	 */
	public boolean isLooping() {
		return looping;
	}

	/**
	 * If the backend has classified this image into a section like cat, wtf, etc, that value is here.
	 * @return the section
	 */
	public GalleryItem.Section getSection() {
		return section;
	}

	
	public String toString() {
		HashMap<String,Object> fields = Utils.toHashMap( this, GalleryImage.class );
		fields.putAll( Utils.toHashMap( this, GalleryItem.class ) );
		return Utils.toString( fields, GalleryImage.class.getSimpleName() );
	} // toString
	
	// ======================================================
	
	/**
	 * Internal only
	 */
	public GalleryImage() { }
	
	/**
	 * Internal only
	 * @param p proxy object
	 */
	public GalleryImage( GalleryItemProxy p ) {
		super( p );
		copyFrom( p, GalleryImage.class );
	} // lame copy constructor
	
	@SerializedName("type")
	protected String mimeType;
	protected boolean animated;
	protected int width;
	protected int height;
	protected int size;
	protected long bandwidth;
	@SerializedName("deletehash")
	protected String deleteHash;
	protected String gifvLink;
	protected String mp4Link;
	protected String webmLink;
	protected boolean looping;
	protected GalleryItem.Section section;


} // GalleryImage
src/main/java/com/github/kskelm/baringo/model/NotificationList.java
public class NotificationList {
	
	
	
	/**
	 * Get the message notifications
	 * @return the messages
	 */
	public List<Notification> getMessageNotifications() {
		return messages;
	}


	/**
	 * Get the message notifications
	 * @return the reply notifications
	 */
	public List<Notification> getReplyNotifications() {
		return replies;
	}


	@Override
	public String toString() {
		return Utils.toString( this );
	}


	// ===================================================
	
	public NotificationList() { }
	
	private List<Notification> messages;
	private List<Notification> replies;
} 
src/main/java/com/github/kskelm/baringo/model/ChangedAccountSettings.java
public class ChangedAccountSettings {

	/**
	 * To help alleviate the asymmetry of the account settings/bio
	 * objects, this copies AccountSettings to ChangedAccountSettings
	 * so it's easier to make changes.
	 * <p>
	 * <b>NOTE: no API call from Imgur returns newsletter_subscribed so
	 * that will get lost unless you magically know somehow.</b>
	 * @param settings the original AccountSettings to copy in
	 * @param acct the Account object to get bio from
	 */
	public ChangedAccountSettings( AccountSettings settings, Account acct ) {
		if( acct != null ) {
			this.bio = acct.getBio();
			this.userName = acct.getUserName();
		} // if
		if( settings != null ) {
			this.acceptedGalleryTerms = settings.isAcceptedGalleryTerms();
			this.messagingEnabled = settings.isMessagingEnabled();
			this.publicImages = settings.isPublicImages();
			this.showMature = settings.isShowMature();
		} // if
	}
	
	/**
	 * Get the biography of the user that's displayed in the gallery profile page.
	 * @return the bio
	 */
	public String getBio() {
		return bio;
	}

	/**
	 * Set the biography of the user to be displayed in the gallery profile page.
	 * @param bio the bio to set
	 */
	public void setBio(String bio) {
		this.bio = bio;
	}

	/**
	 * Get whether or not the user's new images default to public instead of private.
	 * @return the publicImages
	 */
	public boolean isPublicImages() {
		return publicImages;
	}

	/**
	 * Set whether or not the user's new images default to public instead of private.
	 * @param publicImages the publicImages to set
	 */
	public void setPublicImages(boolean publicImages) {
		this.publicImages = publicImages;
	}

	/**
	 * Get whether or not the user has opted to receive private messages.
	 * @return the messagingEnabled
	 */
	public boolean isMessagingEnabled() {
		return messagingEnabled;
	}

	/**
	 * Set whether or not the user has opted to receive private messages.
	 * @param messagingEnabled the messagingEnabled to set
	 */
	public void setMessagingEnabled(boolean messagingEnabled) {
		this.messagingEnabled = messagingEnabled;
	}

	/**
	 * Get whether or not the user has accepted the Imgur Gallery terms.
	 * @return the acceptedGalleryTerms
	 */
	public boolean isAcceptedGalleryTerms() {
		return acceptedGalleryTerms;
	}

	/**
	 * Set whether or not the user has accepted the Imgur Gallery terms.
	 * @param acceptedGalleryTerms the acceptedGalleryTerms to set
	 */
	public void setAcceptedGalleryTerms(boolean acceptedGalleryTerms) {
		this.acceptedGalleryTerms = acceptedGalleryTerms;
	}

	/**
	 * Get the user's username.
	 * @return the userName
	 */
	public String getUserName() {
		return userName;
	}

	/**
	 * Set the user's username, 4-63 characters, must be unique.
	 * @param userName the userName to set
	 */
	public void setUserName(String userName) {
		this.userName = userName;
	}

	/**
	 * Get whether or not the user has opted to see mature content in the galleries.
	 * @return the showMature
	 */
	public boolean getShowMature() {
		return showMature;
	}

	/**
	 * Set whether or not the user has opted to see mature content in the galleries.
	 * @param showMature the showMature to set
	 */
	public void setShowMature(boolean showMature) {
		this.showMature = showMature;
	}

	/**
	 * Get whether or not the user is subscribed to receive the email newsletters
	 * @return the newsletterSubscribed
	 */
	public boolean isNewsletterSubscribed() {
		return newsletterSubscribed;
	}

	/**
	 * Set whether or not the user is subscribed to receive the email newsletters.
	 * @param newsletterSubscribed the newsletterSubscribed to set
	 */
	public void setNewsletterSubscribed(boolean newsletterSubscribed) {
		this.newsletterSubscribed = newsletterSubscribed;
	}

	// ============================================================
	private String bio;
	@SerializedName("public_images")
	private boolean publicImages;
	@SerializedName("messaging_enabled")
	private boolean messagingEnabled;
// TODO: reference Album object
//		@SerializedName("album_privacy")
//		private Album.Privacy albumPrivacy;
	@SerializedName("accepted_gallery_terms")
	private boolean acceptedGalleryTerms;
	@SerializedName("username")
	private String userName;
	@SerializedName("show_mature")
	private boolean showMature;
	@SerializedName("newsletter_subscribed")
	private boolean newsletterSubscribed;

	public ChangedAccountSettings() {
// TODO: Add Album.Privacy as albumPrivacy
	}

	@Override
	public String toString() {
		return Utils.toString( this );
	}

} // class AccountSettings


Question: import java.util.List;
import java.util.Map;
import com.github.kskelm.baringo.CommentService.CommentListWrapper;
import com.github.kskelm.baringo.model.Account;
import com.github.kskelm.baringo.model.AccountSettings;
import com.github.kskelm.baringo.model.Album;
import com.github.kskelm.baringo.model.ImgurResponseWrapper;
import com.github.kskelm.baringo.model.ChangedAccountSettings;
import com.github.kskelm.baringo.model.Comment;
import com.github.kskelm.baringo.model.Conversation;
import com.github.kskelm.baringo.model.Image;
import com.github.kskelm.baringo.model.Notification;
import com.github.kskelm.baringo.model.NotificationList;
import com.github.kskelm.baringo.model.OAuth2;
import com.github.kskelm.baringo.model.TagGallery;
import com.github.kskelm.baringo.model.TagVoteList;
import com.github.kskelm.baringo.model.Topic;
import com.github.kskelm.baringo.model.Votes;
import com.github.kskelm.baringo.model.gallery.CustomGallery;
import com.github.kskelm.baringo.model.gallery.GalleryImage;
import com.github.kskelm.baringo.model.gallery.GalleryItemProxy;
import com.github.kskelm.baringo.model.gallery.GalleryProfile;
import com.squareup.okhttp.RequestBody;
import retrofit.Call;
import retrofit.http.Body;
import retrofit.http.DELETE;
import retrofit.http.Field;
import retrofit.http.FormUrlEncoded;
import retrofit.http.GET;
import retrofit.http.HEAD;
import retrofit.http.Multipart;
import retrofit.http.POST;
import retrofit.http.PUT;
import retrofit.http.Part;
import retrofit.http.Path;
import retrofit.http.Query;
/** This file is released under the Apache License 2.0. See the LICENSE file for details. **/
package com.github.kskelm.baringo.util;




/**
 * 
 * This class is not meant to be seen by human eyes. It's
 * the Retrofit2-compatible annotated interface calls used
 * to connect with Imgur's API 3.
 *
 * @author Kevin Kelm (triggur@gmail.com)
 * 
 */
public interface RetrofittedImgur {

	// apparently Retrofit 2 doesn't want to support multiple
	// interfaces in the same API.  There's logic to this, but
	// It's onerous and a pain to create multiple clients for
	// the same API, so we're just going to jam them all in here.
	
	// ============================================================
	// ============================================================
	// ============================================================
	// ============================================================
	// ============================================================
	// ACCOUNT CALLS
	// ============================================================

	@GET("/3/account/{username}")
	Call<ImgurResponseWrapper<Account>> getAccount(
			@Path("username") String userName );

	@GET("/3/account/{username}/gallery_favorites/{page}/{sort}")
	Call<ImgurResponseWrapper<List<GalleryItemProxy>>> listAccountGalleryFavorites(
			@Path("username") String userName,
			@Path("page") int page,
			@Path("sort") Account.GallerySort sort );

	@GET("/3/account/{username}/favorites")
	Call<ImgurResponseWrapper<List<GalleryItemProxy>>> listAccountFavorites(
			@Path("username") String userName );

	@GET("/3/account/{username}/submissions/{page}")
	Call<ImgurResponseWrapper<List<GalleryItemProxy>>> listAccountSubmissions(
			@Path("username") String userName,
			@Path("page") int page );

	@GET("/3/account/{username}/settings")
	Call<ImgurResponseWrapper<AccountSettings>> getAccountSettings(
			@Path("username") String userName );

	@PUT("/3/account/{username}/settings")
	Call<ImgurResponseWrapper<Object>> setAccountSettings(
			@Path("username") String userName,
			@Body ChangedAccountSettings settings );

	@GET("/3/account/{username}/gallery_profile")
	Call<ImgurResponseWrapper<GalleryProfile>> getAccountGalleryProfile(
			@Path("username") String userName );
	
	@GET("/3/account/{username}/verifyemail")
	Call<ImgurResponseWrapper<Boolean>> isAccountVerified(
			@Path("username") String userName );
	
	@POST("/3/account/{username}/verifyemail")
	Call<ImgurResponseWrapper<Boolean>> sendAccountVerificationEmail(
			@Path("username") String userName );

	@GET("/3/account/{username}/albums/{page}")
	Call<ImgurResponseWrapper<List<Album>>> listAccountAlbums(
			@Path("username") String userName,
			@Path("page") int page );

	@GET("/3/account/{username}/albums/ids/{page}")
	Call<ImgurResponseWrapper<List<String>>> listAccountAlbumIds(
			@Path("username") String userName,
			@Path("page") int page );

	@GET("/3/account/{username}/albums/count")
	Call<ImgurResponseWrapper<Integer>> getAccountAlbumCount(
			@Path("username") String userName );


	@GET("/3/account/{username}/comments/{sort}/{page}")
	Call<ImgurResponseWrapper<List<Comment>>> listAccountComments(
			@Path("username") String userName,
			@Path("sort") Comment.Sort sort,
			@Path("page") int page
			);

	@GET("/3/account/{username}/comments/ids/{sort}/{page}")
	Call<ImgurResponseWrapper<List<Integer>>> listAccountCommentIds(
			@Path("username") String userName,
			@Path("sort") Comment.Sort sort,
			@Path("page") int page
			);

	@GET("/3/account/{username}/comments/count")
	Call<ImgurResponseWrapper<Integer>> getAccountCommentCount(
			@Path("username") String userName);

	@GET("/3/account/{username}/images/{page}")
Answer: 	Call<ImgurResponseWrapper<List<Image>>> listAccountImages(