while (tried < 5) {
                try {
                    workGetImage(imageView);
                    return 1;
                } catch (Exception e) {
                    tried++;
                }
            }

package com.hkm.slider.SliderTypes;

import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.hkm.slider.CapturePhotoUtils;
import com.hkm.slider.LoyalUtil;
import com.hkm.slider.R;
import com.hkm.slider.SliderLayout;
import com.squareup.picasso.Callback;
import com.squareup.picasso.MemoryPolicy;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import com.squareup.picasso.Target;
import java.io.File;
import java.lang.ref.WeakReference;

/**
 * When you want to make your own slider view, you must extends from this class.
 * BaseSliderView provides some useful methods.
 * I provide two example: {@link com.hkm.slider.SliderTypes.DefaultSliderView} and
 * {@link com.hkm.slider.SliderTypes.TextSliderView}
 * if you want to show progressbar, you just need to set a progressbar id as @+id/loading_bar.
 */
public abstract class BaseSliderView {

    protected Object current_image_holder;

    protected Context mContext;

    protected boolean imageLoaded = false;

    private RequestCreator rq = null;

    private final Bundle mBundle;

    protected int mTargetWidth, mTargetHeight;

    /**
     * Error place holder image.
     */
    private int mErrorPlaceHolderRes;

    /**
     * Empty imageView placeholder.
     */
    private int mEmptyPlaceHolderRes;

    private String mUrl;

    private File mFile;

    private int mRes;

    private int mSlideNumber;

    protected OnSliderClickListener mOnSliderClickListener;

    protected boolean mErrorDisappear, mLongClickSaveImage;

    protected boolean mImageLocalStorageEnable;

    private ImageLoadListener mLoadListener;

    private String mDescription;

    private Uri touch_information;

    /**
     * Scale type of the image.
     */
    protected ScaleType mScaleType = ScaleType.Fit;

    /**
     * reference of the parent
     */
    protected WeakReference<SliderLayout> sliderContainer;

    protected Typeface mTypeface;

    public void setSliderContainerInternal(SliderLayout b) {
        this.sliderContainer = new WeakReference<SliderLayout>(b);
    }

    public enum ScaleType {

        CenterCrop, CenterInside, Fit, FitCenterCrop
    }

    protected BaseSliderView(Context context) {
        mContext = context;
        this.mBundle = new Bundle();
        mLongClickSaveImage = false;
        mImageLocalStorageEnable = false;
    }

    public final void setSlideOrderNumber(final int order) {
        mSlideNumber = order;
    }

    public final int getSliderOrderNumber() {
        return mSlideNumber;
    }

    /**
     * the placeholder image when loading image from url or file.
     *
     * @param resId Image resource id
     * @return BaseSliderView
     */
    public BaseSliderView empty(int resId) {
        mEmptyPlaceHolderRes = resId;
        return this;
    }

    public BaseSliderView descriptionTypeface(Typeface typeface) {
        mTypeface = typeface;
        return this;
    }

    protected void setupDescription(TextView descTextView) {
        descTextView.setText(mDescription);
        if (mTypeface != null) {
            descTextView.setTypeface(mTypeface);
        }
    }

    /**
     * determine whether remove the image which failed to download or load from file
     *
     * @param disappear boolean
     * @return BaseSliderView
     */
    public BaseSliderView errorDisappear(boolean disappear) {
        mErrorDisappear = disappear;
        return this;
    }

    /**
     * if you set errorDisappear false, this will set a error placeholder image.
     *
     * @param resId image resource id
     * @return BaseSliderView
     */
    public BaseSliderView error(int resId) {
        mErrorPlaceHolderRes = resId;
        return this;
    }

    /**
     * the description of a slider image.
     *
     * @param description String
     * @return BaseSliderView
     */
    public BaseSliderView description(String description) {
        mDescription = description;
        return this;
    }

    /**
     * the url of the link or something related when the touch happens.
     *
     * @param info Uri
     * @return BaseSliderView
     */
    public BaseSliderView setUri(Uri info) {
        touch_information = info;
        return this;
    }

    /**
     * set a url as a image that preparing to load
     *
     * @param url String
     * @return BaseSliderView
     */
    public BaseSliderView image(String url) {
        if (mFile != null || mRes != 0) {
            throw new IllegalStateException("Call multi image function," + "you only have permission to call it once");
        }
        mUrl = url;
        return this;
    }

    /**
     * set a file as a image that will to load
     *
     * @param file java.io.File
     * @return BaseSliderView
     */
    public BaseSliderView image(File file) {
        if (mUrl != null || mRes != 0) {
            throw new IllegalStateException("Call multi image function," + "you only have permission to call it once");
        }
        mFile = file;
        return this;
    }

    public BaseSliderView image(@DrawableRes int res) {
        if (mUrl != null || mFile != null) {
            throw new IllegalStateException("Call multi image function," + "you only have permission to call it once");
        }
        mRes = res;
        return this;
    }

    /**
     * get the url of the image path
     *
     * @return the path in string
     */
    public String getUrl() {
        return mUrl;
    }

    /**
     * get the url from the touch event
     *
     * @return the touch event URI
     */
    public Uri getTouchURI() {
        return touch_information;
    }

    public boolean isErrorDisappear() {
        return mErrorDisappear;
    }

    public int getEmpty() {
        return mEmptyPlaceHolderRes;
    }

    public int getError() {
        return mErrorPlaceHolderRes;
    }

    public String getDescription() {
        return mDescription;
    }

    public Context getContext() {
        return mContext;
    }

    /**
     * set a slider image click listener
     *
     * @param l the listener
     * @return the base slider
     */
    public BaseSliderView setOnSliderClickListener(OnSliderClickListener l) {
        mOnSliderClickListener = l;
        return this;
    }

    protected View.OnLongClickListener mDefaultLongClickListener = null;

    protected WeakReference<FragmentManager> fmg;

    /**
     * to enable the slider for saving images
     *
     * @param mfmg FragmentManager
     * @return this thing
     */
    public BaseSliderView enableSaveImageByLongClick(FragmentManager mfmg) {
        mLongClickSaveImage = true;
        mDefaultLongClickListener = null;
        this.fmg = new WeakReference<FragmentManager>(mfmg);
        return this;
    }

    /**
     * to set custom listener for long click event
     *
     * @param listen the listener
     * @return thos thomg
     */
    public BaseSliderView setSliderLongClickListener(View.OnLongClickListener listen) {
        mDefaultLongClickListener = listen;
        mLongClickSaveImage = false;
        return this;
    }

    public BaseSliderView setSliderLongClickListener(View.OnLongClickListener listen, FragmentManager mfmg) {
        mDefaultLongClickListener = listen;
        mLongClickSaveImage = false;
        this.fmg = new WeakReference<FragmentManager>(mfmg);
        return this;
    }

    public BaseSliderView resize(int targetWidth, int targetHeight) {
        if (targetWidth < 0) {
            throw new IllegalArgumentException("Width must be positive number or 0.");
        }
        if (targetHeight < 0) {
            throw new IllegalArgumentException("Height must be positive number or 0.");
        }
        if (targetHeight == 0 && targetWidth == 0) {
            throw new IllegalArgumentException("At least one dimension has to be positive number.");
        }
        mTargetWidth = targetWidth;
        mTargetHeight = targetHeight;
        return this;
    }

    public BaseSliderView enableImageLocalStorage() {
        mImageLocalStorageEnable = true;
        return this;
    }

    protected void hideLoadingProgress(View mView) {
        if (mView.findViewById(R.id.ns_loading_progress) != null) {
            hideoutView(mView.findViewById(R.id.ns_loading_progress));
        }
    }

    /**
     * when {@link #mLongClickSaveImage} is true and this function will be triggered to watch the long action run
     *
     * @param mView the slider view object
     */
    private void triggerOnLongClick(View mView) {
        if (mLongClickSaveImage && fmg != null) {
            if (mDefaultLongClickListener == null) {
                mDefaultLongClickListener = new View.OnLongClickListener() {

                    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
                    @Override
                    public boolean onLongClick(View v) {
                        final saveImageDialog saveImageDial = new saveImageDialog();
                        saveImageDial.show(fmg.get(), mDescription);
                        return false;
                    }
                };
            }
            mView.setOnLongClickListener(mDefaultLongClickListener);
        }
    }

    private final View.OnClickListener click_triggered = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mOnSliderClickListener != null) {
                mOnSliderClickListener.onSliderClick(BaseSliderView.this);
            }
        }
    };

    /**
     * When you want to implement your own slider view, please call this method in the end in `getView()` method
     *
     * @param v               the whole view
     * @param targetImageView where to place image
     */
    protected void bindEventAndShowPicasso(final View v, final ImageView targetImageView) {
        current_image_holder = targetImageView;
        v.setOnClickListener(click_triggered);
        mLoadListener.onStart(this);
        final Picasso p = Picasso.with(mContext);
        rq = null;
        if (mUrl != null) {
            rq = p.load(mUrl);
        } else if (mFile != null) {
            rq = p.load(mFile);
        } else if (mRes != 0) {
            rq = p.load(mRes);
        } else {
            return;
        }
        if (rq == null) {
            return;
        }
        if (getEmpty() != 0) {
            rq.placeholder(getEmpty());
        }
        if (getError() != 0) {
            rq.error(getError());
        }
        if (mTargetWidth > 0 || mTargetHeight > 0) {
            rq.resize(mTargetWidth, mTargetHeight);
        }
        if (mImageLocalStorageEnable) {
            rq.memoryPolicy(MemoryPolicy.NO_STORE, MemoryPolicy.NO_CACHE);
        }
        switch(mScaleType) {
            case Fit:
                rq.fit();
                break;
            case CenterCrop:
                rq.fit().centerCrop();
                break;
            case CenterInside:
                rq.fit().centerInside();
                break;
        }
        rq.into(targetImageView, new Callback() {

            @Override
            public void onSuccess() {
                imageLoaded = true;
                hideLoadingProgress(v);
                triggerOnLongClick(v);
                reportStatusEnd(true);
            }

            @Override
            public void onError() {
                reportStatusEnd(false);
            }
        });
    }

    protected void bindEventShowGlide(final View v, final ImageView targetImageView) {
        RequestOptions requestOptions = new RequestOptions();
        v.setOnClickListener(click_triggered);
        final RequestManager glideRM = Glide.with(mContext);
        RequestBuilder rq;
        if (mUrl != null) {
            rq = glideRM.load(mUrl);
        } else if (mFile != null) {
            rq = glideRM.load(mFile);
        } else if (mRes != 0) {
            rq = glideRM.load(mRes);
        } else {
            return;
        }
        if (getEmpty() != 0) {
            requestOptions.placeholder(getEmpty());
        }
        if (getError() != 0) {
            requestOptions.error(getError());
        }
        switch(mScaleType) {
            case Fit:
                requestOptions.fitCenter();
                break;
            case CenterCrop:
                requestOptions.centerCrop();
                break;
            case CenterInside:
                requestOptions.fitCenter();
                break;
        }
        requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL);
        if (mTargetWidth > 0 || mTargetHeight > 0) {
            requestOptions.override(mTargetWidth, mTargetHeight);
        }
        rq.apply(requestOptions);
        rq.listener(new RequestListener() {

            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, com.bumptech.glide.request.target.Target target, boolean isFirstResource) {
                reportStatusEnd(false);
                return false;
            }

            @Override
            public boolean onResourceReady(Object resource, Object model, com.bumptech.glide.request.target.Target target, DataSource dataSource, boolean isFirstResource) {
                hideLoadingProgress(v);
                triggerOnLongClick(v);
                reportStatusEnd(true);
                return false;
            }
        });
        rq.transition(DrawableTransitionOptions.withCrossFade());
        additionalGlideModifier(rq);
        rq.into(targetImageView);
    }

    protected void additionalGlideModifier(RequestBuilder requestBuilder) {
    }

    protected void applyImageWithGlide(View v, final ImageView targetImageView) {
        current_image_holder = targetImageView;
        LoyalUtil.glideImplementation(getUrl(), targetImageView, getContext());
        hideLoadingProgress(v);
        triggerOnLongClick(v);
        reportStatusEnd(true);
        imageLoaded = true;
    }

    protected void applyImageWithPicasso(View v, final ImageView targetImageView) {
        current_image_holder = targetImageView;
        LoyalUtil.picassoImplementation(getUrl(), targetImageView, getContext());
        hideLoadingProgress(v);
        triggerOnLongClick(v);
        imageLoaded = true;
        reportStatusEnd(true);
    }

    protected void applyImageWithSmartBoth(View v, final ImageView target) {
        current_image_holder = target;
        LoyalUtil.hybridImplementation(getUrl(), target, getContext());
        hideLoadingProgress(v);
        triggerOnLongClick(v);
        imageLoaded = true;
        reportStatusEnd(true);
    }

    protected void applyImageWithSmartBothAndNotifyHeight(View v, final ImageView target) {
        current_image_holder = target;
        LoyalUtil.hybridImplementation(getUrl(), target, getContext(), new Runnable() {

            @Override
            public void run() {
                imageLoaded = true;
                if (sliderContainer == null)
                    return;
                if (sliderContainer.get().getCurrentPosition() == getSliderOrderNumber()) {
                    sliderContainer.get().setFitToCurrentImageHeight();
                }
            }
        });
        hideLoadingProgress(v);
        triggerOnLongClick(v);
        reportStatusEnd(true);
    }

    private void reportStatusEnd(boolean b) {
        if (mLoadListener != null) {
            mLoadListener.onEnd(b, this);
        }
    }

    final android.os.Handler nh = new android.os.Handler();

    private int notice_save_image_success = R.string.success_save_image;

    public final void setMessageSaveImageSuccess(@StringRes final int t) {
        notice_save_image_success = t;
    }

    protected void workAroundGetImagePicasso() {
        final Target target = new Target() {

            @Override
            public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {
            }
        };
    }

    protected void workGetImage(ImageView imageView) {
        imageView.setDrawingCacheEnabled(true);
        imageView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        imageView.layout(0, 0, imageView.getMeasuredWidth(), imageView.getMeasuredHeight());
        imageView.buildDrawingCache(true);
        output_bitmap = Bitmap.createBitmap(imageView.getDrawingCache());
        imageView.setDrawingCacheEnabled(false);
    }

    private Bitmap output_bitmap = null;

    private class getImageTask extends AsyncTask<Void, Void, Integer> {

        private ImageView imageView;

        public getImageTask(ImageView taskTarget) {
            imageView = taskTarget;
        }

        @Override
        protected Integer doInBackground(Void... params) {
            int tried = 0;

            return 0;
        }

        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);
            if (result == 1) {
                CapturePhotoUtils.insertImage(mContext, output_bitmap, mDescription, new CapturePhotoUtils.Callback() {

                    @Override
                    public void complete() {
                        nh.post(new Runnable() {

                            @Override
                            public void run() {
                                if (fmg == null)
                                    return;
                                String note = mContext.getString(notice_save_image_success);
                                final SMessage sm = SMessage.message(note);
                                sm.show(fmg.get(), "done");
                            }
                        });
                    }
                });
            } else {
                String m = mContext.getString(R.string.image_not_read);
                final SMessage sm = SMessage.message(m);
                sm.show(fmg.get(), "try again");
            }
        }
    }

    /**
     * should use OnImageSavedListener instead or other listener for dialogs
     */
    @Deprecated
    @SuppressLint("ValidFragment")
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class SMessage extends DialogFragment {

        public static SMessage message(final String mes) {
            Bundle h = new Bundle();
            h.putString("message", mes);
            SMessage e = new SMessage();
            e.setArguments(h);
            return e;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setMessage(getArguments().getString("message")).setNeutralButton(R.string.okay_now, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
                }
            });
            return builder.create();
        }
    }

    @SuppressLint("ValidFragment")
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public class saveImageDialog extends DialogFragment {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            if (mContext == null)
                return null;
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
            builder.setMessage(R.string.save_image).setPositiveButton(R.string.yes_save, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {
                    saveImageActionTrigger();
                }
            }).setNegativeButton(R.string.no_keep, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
                }
            });
            // Create the AlertDialog object and return it
            return builder.create();
        }
    }

    protected void saveImageActionTrigger() {
        if (current_image_holder == null)
            return;
        if (current_image_holder instanceof ImageView) {
            ImageView fast = (ImageView) current_image_holder;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (mContext.getApplicationContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                } else {
                    getImageTask t = new getImageTask(fast);
                    t.execute();
                }
            } else {
                getImageTask t = new getImageTask(fast);
                t.execute();
            }
        }
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    final protected void hideoutView(@Nullable final View view) {
        if (view == null)
            return;
        view.animate().alpha(0f).withEndAction(new Runnable() {

            @Override
            public void run() {
                view.setVisibility(View.INVISIBLE);
            }
        });
    }

    public BaseSliderView setScaleType(ScaleType type) {
        mScaleType = type;
        return this;
    }

    public ScaleType getScaleType() {
        return mScaleType;
    }

    /**
     * the extended class have to implement getView(), which is called by the adapter,
     * every extended class response to render their own view.
     *
     * @return View
     */
    public abstract View getView();

    /**
     * set a listener to get a message , if load error.
     *
     * @param l ImageLoadListener
     */
    public void setOnImageLoadListener(ImageLoadListener l) {
        mLoadListener = l;
    }

    public interface OnSliderClickListener {

        void onSliderClick(BaseSliderView coreSlider);
    }

    /**
     * when you have some extra information, please put it in this bundle.
     *
     * @return Bundle
     */
    public Bundle getBundle() {
        return mBundle;
    }

    public interface ImageLoadListener {

        void onStart(BaseSliderView target);

        void onEnd(boolean result, BaseSliderView target);
    }

    public Object getImageView() {
        return current_image_holder;
    }

    public interface OnImageSavedListener {

        void onImageSaved(String description);

        void onImageSaveFailed();
    }

    protected OnImageSavedListener onImageSavedListener = null;

    public OnImageSavedListener getOnImageSavedListener() {
        return onImageSavedListener;
    }

    public void setOnImageSavedListener(OnImageSavedListener onImageSavedListener) {
        this.onImageSavedListener = onImageSavedListener;
    }
}


try {
                    workGetImage(imageView);
                    return 1;
                } catch (Exception e) {
                    tried++;
                }

package com.hkm.slider.SliderTypes;

import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.hkm.slider.CapturePhotoUtils;
import com.hkm.slider.LoyalUtil;
import com.hkm.slider.R;
import com.hkm.slider.SliderLayout;
import com.squareup.picasso.Callback;
import com.squareup.picasso.MemoryPolicy;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import com.squareup.picasso.Target;
import java.io.File;
import java.lang.ref.WeakReference;

/**
 * When you want to make your own slider view, you must extends from this class.
 * BaseSliderView provides some useful methods.
 * I provide two example: {@link com.hkm.slider.SliderTypes.DefaultSliderView} and
 * {@link com.hkm.slider.SliderTypes.TextSliderView}
 * if you want to show progressbar, you just need to set a progressbar id as @+id/loading_bar.
 */
public abstract class BaseSliderView {

    protected Object current_image_holder;

    protected Context mContext;

    protected boolean imageLoaded = false;

    private RequestCreator rq = null;

    private final Bundle mBundle;

    protected int mTargetWidth, mTargetHeight;

    /**
     * Error place holder image.
     */
    private int mErrorPlaceHolderRes;

    /**
     * Empty imageView placeholder.
     */
    private int mEmptyPlaceHolderRes;

    private String mUrl;

    private File mFile;

    private int mRes;

    private int mSlideNumber;

    protected OnSliderClickListener mOnSliderClickListener;

    protected boolean mErrorDisappear, mLongClickSaveImage;

    protected boolean mImageLocalStorageEnable;

    private ImageLoadListener mLoadListener;

    private String mDescription;

    private Uri touch_information;

    /**
     * Scale type of the image.
     */
    protected ScaleType mScaleType = ScaleType.Fit;

    /**
     * reference of the parent
     */
    protected WeakReference<SliderLayout> sliderContainer;

    protected Typeface mTypeface;

    public void setSliderContainerInternal(SliderLayout b) {
        this.sliderContainer = new WeakReference<SliderLayout>(b);
    }

    public enum ScaleType {

        CenterCrop, CenterInside, Fit, FitCenterCrop
    }

    protected BaseSliderView(Context context) {
        mContext = context;
        this.mBundle = new Bundle();
        mLongClickSaveImage = false;
        mImageLocalStorageEnable = false;
    }

    public final void setSlideOrderNumber(final int order) {
        mSlideNumber = order;
    }

    public final int getSliderOrderNumber() {
        return mSlideNumber;
    }

    /**
     * the placeholder image when loading image from url or file.
     *
     * @param resId Image resource id
     * @return BaseSliderView
     */
    public BaseSliderView empty(int resId) {
        mEmptyPlaceHolderRes = resId;
        return this;
    }

    public BaseSliderView descriptionTypeface(Typeface typeface) {
        mTypeface = typeface;
        return this;
    }

    protected void setupDescription(TextView descTextView) {
        descTextView.setText(mDescription);
        if (mTypeface != null) {
            descTextView.setTypeface(mTypeface);
        }
    }

    /**
     * determine whether remove the image which failed to download or load from file
     *
     * @param disappear boolean
     * @return BaseSliderView
     */
    public BaseSliderView errorDisappear(boolean disappear) {
        mErrorDisappear = disappear;
        return this;
    }

    /**
     * if you set errorDisappear false, this will set a error placeholder image.
     *
     * @param resId image resource id
     * @return BaseSliderView
     */
    public BaseSliderView error(int resId) {
        mErrorPlaceHolderRes = resId;
        return this;
    }

    /**
     * the description of a slider image.
     *
     * @param description String
     * @return BaseSliderView
     */
    public BaseSliderView description(String description) {
        mDescription = description;
        return this;
    }

    /**
     * the url of the link or something related when the touch happens.
     *
     * @param info Uri
     * @return BaseSliderView
     */
    public BaseSliderView setUri(Uri info) {
        touch_information = info;
        return this;
    }

    /**
     * set a url as a image that preparing to load
     *
     * @param url String
     * @return BaseSliderView
     */
    public BaseSliderView image(String url) {
        if (mFile != null || mRes != 0) {
            throw new IllegalStateException("Call multi image function," + "you only have permission to call it once");
        }
        mUrl = url;
        return this;
    }

    /**
     * set a file as a image that will to load
     *
     * @param file java.io.File
     * @return BaseSliderView
     */
    public BaseSliderView image(File file) {
        if (mUrl != null || mRes != 0) {
            throw new IllegalStateException("Call multi image function," + "you only have permission to call it once");
        }
        mFile = file;
        return this;
    }

    public BaseSliderView image(@DrawableRes int res) {
        if (mUrl != null || mFile != null) {
            throw new IllegalStateException("Call multi image function," + "you only have permission to call it once");
        }
        mRes = res;
        return this;
    }

    /**
     * get the url of the image path
     *
     * @return the path in string
     */
    public String getUrl() {
        return mUrl;
    }

    /**
     * get the url from the touch event
     *
     * @return the touch event URI
     */
    public Uri getTouchURI() {
        return touch_information;
    }

    public boolean isErrorDisappear() {
        return mErrorDisappear;
    }

    public int getEmpty() {
        return mEmptyPlaceHolderRes;
    }

    public int getError() {
        return mErrorPlaceHolderRes;
    }

    public String getDescription() {
        return mDescription;
    }

    public Context getContext() {
        return mContext;
    }

    /**
     * set a slider image click listener
     *
     * @param l the listener
     * @return the base slider
     */
    public BaseSliderView setOnSliderClickListener(OnSliderClickListener l) {
        mOnSliderClickListener = l;
        return this;
    }

    protected View.OnLongClickListener mDefaultLongClickListener = null;

    protected WeakReference<FragmentManager> fmg;

    /**
     * to enable the slider for saving images
     *
     * @param mfmg FragmentManager
     * @return this thing
     */
    public BaseSliderView enableSaveImageByLongClick(FragmentManager mfmg) {
        mLongClickSaveImage = true;
        mDefaultLongClickListener = null;
        this.fmg = new WeakReference<FragmentManager>(mfmg);
        return this;
    }

    /**
     * to set custom listener for long click event
     *
     * @param listen the listener
     * @return thos thomg
     */
    public BaseSliderView setSliderLongClickListener(View.OnLongClickListener listen) {
        mDefaultLongClickListener = listen;
        mLongClickSaveImage = false;
        return this;
    }

    public BaseSliderView setSliderLongClickListener(View.OnLongClickListener listen, FragmentManager mfmg) {
        mDefaultLongClickListener = listen;
        mLongClickSaveImage = false;
        this.fmg = new WeakReference<FragmentManager>(mfmg);
        return this;
    }

    public BaseSliderView resize(int targetWidth, int targetHeight) {
        if (targetWidth < 0) {
            throw new IllegalArgumentException("Width must be positive number or 0.");
        }
        if (targetHeight < 0) {
            throw new IllegalArgumentException("Height must be positive number or 0.");
        }
        if (targetHeight == 0 && targetWidth == 0) {
            throw new IllegalArgumentException("At least one dimension has to be positive number.");
        }
        mTargetWidth = targetWidth;
        mTargetHeight = targetHeight;
        return this;
    }

    public BaseSliderView enableImageLocalStorage() {
        mImageLocalStorageEnable = true;
        return this;
    }

    protected void hideLoadingProgress(View mView) {
        if (mView.findViewById(R.id.ns_loading_progress) != null) {
            hideoutView(mView.findViewById(R.id.ns_loading_progress));
        }
    }

    /**
     * when {@link #mLongClickSaveImage} is true and this function will be triggered to watch the long action run
     *
     * @param mView the slider view object
     */
    private void triggerOnLongClick(View mView) {
        if (mLongClickSaveImage && fmg != null) {
            if (mDefaultLongClickListener == null) {
                mDefaultLongClickListener = new View.OnLongClickListener() {

                    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
                    @Override
                    public boolean onLongClick(View v) {
                        final saveImageDialog saveImageDial = new saveImageDialog();
                        saveImageDial.show(fmg.get(), mDescription);
                        return false;
                    }
                };
            }
            mView.setOnLongClickListener(mDefaultLongClickListener);
        }
    }

    private final View.OnClickListener click_triggered = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mOnSliderClickListener != null) {
                mOnSliderClickListener.onSliderClick(BaseSliderView.this);
            }
        }
    };

    /**
     * When you want to implement your own slider view, please call this method in the end in `getView()` method
     *
     * @param v               the whole view
     * @param targetImageView where to place image
     */
    protected void bindEventAndShowPicasso(final View v, final ImageView targetImageView) {
        current_image_holder = targetImageView;
        v.setOnClickListener(click_triggered);
        mLoadListener.onStart(this);
        final Picasso p = Picasso.with(mContext);
        rq = null;
        if (mUrl != null) {
            rq = p.load(mUrl);
        } else if (mFile != null) {
            rq = p.load(mFile);
        } else if (mRes != 0) {
            rq = p.load(mRes);
        } else {
            return;
        }
        if (rq == null) {
            return;
        }
        if (getEmpty() != 0) {
            rq.placeholder(getEmpty());
        }
        if (getError() != 0) {
            rq.error(getError());
        }
        if (mTargetWidth > 0 || mTargetHeight > 0) {
            rq.resize(mTargetWidth, mTargetHeight);
        }
        if (mImageLocalStorageEnable) {
            rq.memoryPolicy(MemoryPolicy.NO_STORE, MemoryPolicy.NO_CACHE);
        }
        switch(mScaleType) {
            case Fit:
                rq.fit();
                break;
            case CenterCrop:
                rq.fit().centerCrop();
                break;
            case CenterInside:
                rq.fit().centerInside();
                break;
        }
        rq.into(targetImageView, new Callback() {

            @Override
            public void onSuccess() {
                imageLoaded = true;
                hideLoadingProgress(v);
                triggerOnLongClick(v);
                reportStatusEnd(true);
            }

            @Override
            public void onError() {
                reportStatusEnd(false);
            }
        });
    }

    protected void bindEventShowGlide(final View v, final ImageView targetImageView) {
        RequestOptions requestOptions = new RequestOptions();
        v.setOnClickListener(click_triggered);
        final RequestManager glideRM = Glide.with(mContext);
        RequestBuilder rq;
        if (mUrl != null) {
            rq = glideRM.load(mUrl);
        } else if (mFile != null) {
            rq = glideRM.load(mFile);
        } else if (mRes != 0) {
            rq = glideRM.load(mRes);
        } else {
            return;
        }
        if (getEmpty() != 0) {
            requestOptions.placeholder(getEmpty());
        }
        if (getError() != 0) {
            requestOptions.error(getError());
        }
        switch(mScaleType) {
            case Fit:
                requestOptions.fitCenter();
                break;
            case CenterCrop:
                requestOptions.centerCrop();
                break;
            case CenterInside:
                requestOptions.fitCenter();
                break;
        }
        requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL);
        if (mTargetWidth > 0 || mTargetHeight > 0) {
            requestOptions.override(mTargetWidth, mTargetHeight);
        }
        rq.apply(requestOptions);
        rq.listener(new RequestListener() {

            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, com.bumptech.glide.request.target.Target target, boolean isFirstResource) {
                reportStatusEnd(false);
                return false;
            }

            @Override
            public boolean onResourceReady(Object resource, Object model, com.bumptech.glide.request.target.Target target, DataSource dataSource, boolean isFirstResource) {
                hideLoadingProgress(v);
                triggerOnLongClick(v);
                reportStatusEnd(true);
                return false;
            }
        });
        rq.transition(DrawableTransitionOptions.withCrossFade());
        additionalGlideModifier(rq);
        rq.into(targetImageView);
    }

    protected void additionalGlideModifier(RequestBuilder requestBuilder) {
    }

    protected void applyImageWithGlide(View v, final ImageView targetImageView) {
        current_image_holder = targetImageView;
        LoyalUtil.glideImplementation(getUrl(), targetImageView, getContext());
        hideLoadingProgress(v);
        triggerOnLongClick(v);
        reportStatusEnd(true);
        imageLoaded = true;
    }

    protected void applyImageWithPicasso(View v, final ImageView targetImageView) {
        current_image_holder = targetImageView;
        LoyalUtil.picassoImplementation(getUrl(), targetImageView, getContext());
        hideLoadingProgress(v);
        triggerOnLongClick(v);
        imageLoaded = true;
        reportStatusEnd(true);
    }

    protected void applyImageWithSmartBoth(View v, final ImageView target) {
        current_image_holder = target;
        LoyalUtil.hybridImplementation(getUrl(), target, getContext());
        hideLoadingProgress(v);
        triggerOnLongClick(v);
        imageLoaded = true;
        reportStatusEnd(true);
    }

    protected void applyImageWithSmartBothAndNotifyHeight(View v, final ImageView target) {
        current_image_holder = target;
        LoyalUtil.hybridImplementation(getUrl(), target, getContext(), new Runnable() {

            @Override
            public void run() {
                imageLoaded = true;
                if (sliderContainer == null)
                    return;
                if (sliderContainer.get().getCurrentPosition() == getSliderOrderNumber()) {
                    sliderContainer.get().setFitToCurrentImageHeight();
                }
            }
        });
        hideLoadingProgress(v);
        triggerOnLongClick(v);
        reportStatusEnd(true);
    }

    private void reportStatusEnd(boolean b) {
        if (mLoadListener != null) {
            mLoadListener.onEnd(b, this);
        }
    }

    final android.os.Handler nh = new android.os.Handler();

    private int notice_save_image_success = R.string.success_save_image;

    public final void setMessageSaveImageSuccess(@StringRes final int t) {
        notice_save_image_success = t;
    }

    protected void workAroundGetImagePicasso() {
        final Target target = new Target() {

            @Override
            public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {
            }
        };
    }

    protected void workGetImage(ImageView imageView) {
        imageView.setDrawingCacheEnabled(true);
        imageView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        imageView.layout(0, 0, imageView.getMeasuredWidth(), imageView.getMeasuredHeight());
        imageView.buildDrawingCache(true);
        output_bitmap = Bitmap.createBitmap(imageView.getDrawingCache());
        imageView.setDrawingCacheEnabled(false);
    }

    private Bitmap output_bitmap = null;

    private class getImageTask extends AsyncTask<Void, Void, Integer> {

        private ImageView imageView;

        public getImageTask(ImageView taskTarget) {
            imageView = taskTarget;
        }

        @Override
        protected Integer doInBackground(Void... params) {
            int tried = 0;
            while (tried < 5) {

            }
            return 0;
        }

        @Override
        protected void onPostExecute(Integer result) {
            super.onPostExecute(result);
            if (result == 1) {
                CapturePhotoUtils.insertImage(mContext, output_bitmap, mDescription, new CapturePhotoUtils.Callback() {

                    @Override
                    public void complete() {
                        nh.post(new Runnable() {

                            @Override
                            public void run() {
                                if (fmg == null)
                                    return;
                                String note = mContext.getString(notice_save_image_success);
                                final SMessage sm = SMessage.message(note);
                                sm.show(fmg.get(), "done");
                            }
                        });
                    }
                });
            } else {
                String m = mContext.getString(R.string.image_not_read);
                final SMessage sm = SMessage.message(m);
                sm.show(fmg.get(), "try again");
            }
        }
    }

    /**
     * should use OnImageSavedListener instead or other listener for dialogs
     */
    @Deprecated
    @SuppressLint("ValidFragment")
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class SMessage extends DialogFragment {

        public static SMessage message(final String mes) {
            Bundle h = new Bundle();
            h.putString("message", mes);
            SMessage e = new SMessage();
            e.setArguments(h);
            return e;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setMessage(getArguments().getString("message")).setNeutralButton(R.string.okay_now, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
                }
            });
            return builder.create();
        }
    }

    @SuppressLint("ValidFragment")
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public class saveImageDialog extends DialogFragment {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            if (mContext == null)
                return null;
            // Use the Builder class for convenient dialog construction
            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
            builder.setMessage(R.string.save_image).setPositiveButton(R.string.yes_save, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {
                    saveImageActionTrigger();
                }
            }).setNegativeButton(R.string.no_keep, new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
                }
            });
            // Create the AlertDialog object and return it
            return builder.create();
        }
    }

    protected void saveImageActionTrigger() {
        if (current_image_holder == null)
            return;
        if (current_image_holder instanceof ImageView) {
            ImageView fast = (ImageView) current_image_holder;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (mContext.getApplicationContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                } else {
                    getImageTask t = new getImageTask(fast);
                    t.execute();
                }
            } else {
                getImageTask t = new getImageTask(fast);
                t.execute();
            }
        }
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    final protected void hideoutView(@Nullable final View view) {
        if (view == null)
            return;
        view.animate().alpha(0f).withEndAction(new Runnable() {

            @Override
            public void run() {
                view.setVisibility(View.INVISIBLE);
            }
        });
    }

    public BaseSliderView setScaleType(ScaleType type) {
        mScaleType = type;
        return this;
    }

    public ScaleType getScaleType() {
        return mScaleType;
    }

    /**
     * the extended class have to implement getView(), which is called by the adapter,
     * every extended class response to render their own view.
     *
     * @return View
     */
    public abstract View getView();

    /**
     * set a listener to get a message , if load error.
     *
     * @param l ImageLoadListener
     */
    public void setOnImageLoadListener(ImageLoadListener l) {
        mLoadListener = l;
    }

    public interface OnSliderClickListener {

        void onSliderClick(BaseSliderView coreSlider);
    }

    /**
     * when you have some extra information, please put it in this bundle.
     *
     * @return Bundle
     */
    public Bundle getBundle() {
        return mBundle;
    }

    public interface ImageLoadListener {

        void onStart(BaseSliderView target);

        void onEnd(boolean result, BaseSliderView target);
    }

    public Object getImageView() {
        return current_image_holder;
    }

    public interface OnImageSavedListener {

        void onImageSaved(String description);

        void onImageSaveFailed();
    }

    protected OnImageSavedListener onImageSavedListener = null;

    public OnImageSavedListener getOnImageSavedListener() {
        return onImageSavedListener;
    }

    public void setOnImageSavedListener(OnImageSavedListener onImageSavedListener) {
        this.onImageSavedListener = onImageSavedListener;
    }
}


for (int i = begin; i <= end; i++) {
            assertNotSelected(i);
        }

package androidx.recyclerview.selection.testing;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import androidx.recyclerview.selection.DefaultSelectionTracker;
import androidx.recyclerview.selection.Selection;
import androidx.recyclerview.selection.SelectionTracker;

/**
 * Helper class for making assertions against the state of a {@link DefaultSelectionTracker}
 * instance and the consistency of states between {@link DefaultSelectionTracker} and
 * {@link DefaultSelectionTracker.SelectionObserver}.
 */
public final class SelectionProbe {

    private final SelectionTracker<String> mMgr;

    private final TestSelectionObserver<String> mSelectionListener;

    public SelectionProbe(SelectionTracker<String> mgr) {
        mMgr = mgr;
        mSelectionListener = new TestSelectionObserver<String>();
        mMgr.addObserver(mSelectionListener);
    }

    public SelectionProbe(SelectionTracker<String> mgr, TestSelectionObserver<String> selectionListener) {
        mMgr = mgr;
        mSelectionListener = selectionListener;
    }

    public void assertRangeSelected(int begin, int end) {
        for (int i = begin; i <= end; i++) {
            assertSelected(i);
        }
    }

    public void assertRangeNotSelected(int begin, int end) {

    }

    public void assertRangeSelection(int begin, int end) {
        assertSelectionSize(end - begin + 1);
        assertRangeSelected(begin, end);
    }

    public void assertSelectionSize(int expected) {
        Selection<String> selection = mMgr.getSelection();
        assertEquals(selection.toString(), expected, selection.size());
        mSelectionListener.assertSelectionSize(expected);
    }

    public void assertNoSelection() {
        assertSelectionSize(0);
        mSelectionListener.assertNoSelection();
    }

    public void assertSelection(int... ids) {
        assertSelected(ids);
        assertEquals(ids.length, mMgr.getSelection().size());
        mSelectionListener.assertSelectionSize(ids.length);
    }

    public void assertSelected(int... ids) {
        Selection<String> sel = mMgr.getSelection();
        for (int id : ids) {
            String sid = String.valueOf(id);
            assertTrue(sid + " is not in selection " + sel, sel.contains(sid));
            mSelectionListener.assertSelected(sid);
        }
    }

    public void assertNotSelected(int... ids) {
        Selection<String> sel = mMgr.getSelection();
        for (int id : ids) {
            String sid = String.valueOf(id);
            assertFalse(sid + " is in selection " + sel, sel.contains(sid));
            mSelectionListener.assertNotSelected(sid);
        }
    }
}


public Long getAppId() {
        return this.AppId;
    }

package com.tencentcloudapi.emr.v20190103.models;

import com.tencentcloudapi.common.AbstractModel;
import com.google.gson.annotations.SerializedName;
import com.google.gson.annotations.Expose;
import java.util.HashMap;

public class NodeHardwareInfo extends AbstractModel {

    /**
     *  用户APPID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("AppId")
    @Expose
    private Long AppId;

    /**
     *  序列号
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("SerialNo")
    @Expose
    private String SerialNo;

    /**
     *  机器实例ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("OrderNo")
    @Expose
    private String OrderNo;

    /**
     *  master节点绑定外网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("WanIp")
    @Expose
    private String WanIp;

    /**
     *  节点类型。0:common节点；1:master节点
     * ；2:core节点；3:task节点
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("Flag")
    @Expose
    private Long Flag;

    /**
     *  节点规格
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("Spec")
    @Expose
    private String Spec;

    /**
     *  节点核数
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("CpuNum")
    @Expose
    private Long CpuNum;

    /**
     *  节点内存
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("MemSize")
    @Expose
    private Long MemSize;

    /**
     *  节点内存描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("MemDesc")
    @Expose
    private String MemDesc;

    /**
     *  节点所在region
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("RegionId")
    @Expose
    private Long RegionId;

    /**
     *  节点所在Zone
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("ZoneId")
    @Expose
    private Long ZoneId;

    /**
     *  申请时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("ApplyTime")
    @Expose
    private String ApplyTime;

    /**
     *  释放时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("FreeTime")
    @Expose
    private String FreeTime;

    /**
     *  硬盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("DiskSize")
    @Expose
    private String DiskSize;

    /**
     *  节点描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("NameTag")
    @Expose
    private String NameTag;

    /**
     *  节点部署服务
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("Services")
    @Expose
    private String Services;

    /**
     *  磁盘类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("StorageType")
    @Expose
    private Long StorageType;

    /**
     *  系统盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("RootSize")
    @Expose
    private Long RootSize;

    /**
     *  付费类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("ChargeType")
    @Expose
    private Long ChargeType;

    /**
     *  数据库IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("CdbIp")
    @Expose
    private String CdbIp;

    /**
     *  数据库端口
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("CdbPort")
    @Expose
    private Long CdbPort;

    /**
     *  硬盘容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("HwDiskSize")
    @Expose
    private Long HwDiskSize;

    /**
     *  硬盘容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("HwDiskSizeDesc")
    @Expose
    private String HwDiskSizeDesc;

    /**
     *  内存容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("HwMemSize")
    @Expose
    private Long HwMemSize;

    /**
     *  内存容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("HwMemSizeDesc")
    @Expose
    private String HwMemSizeDesc;

    /**
     *  过期时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("ExpireTime")
    @Expose
    private String ExpireTime;

    /**
     *  节点资源ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("EmrResourceId")
    @Expose
    private String EmrResourceId;

    /**
     *  续费标志
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("IsAutoRenew")
    @Expose
    private Long IsAutoRenew;

    /**
     *  设备标识
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("DeviceClass")
    @Expose
    private String DeviceClass;

    /**
     *  支持变配
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("Mutable")
    @Expose
    private Long Mutable;

    /**
     *  多云盘
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("MCMultiDisk")
    @Expose
    private MultiDiskMC[] MCMultiDisk;

    /**
     *  数据库信息
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("CdbNodeInfo")
    @Expose
    private CdbInfo CdbNodeInfo;

    /**
     *  内网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("Ip")
    @Expose
    private String Ip;

    /**
     *  此节点是否可销毁，1可销毁，0不可销毁
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("Destroyable")
    @Expose
    private Long Destroyable;

    /**
     *  节点绑定的标签
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("Tags")
    @Expose
    private Tag[] Tags;

    /**
     *  是否是自动扩缩容节点，0为普通节点，1为自动扩缩容节点。
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("AutoFlag")
    @Expose
    private Long AutoFlag;

    /**
     *  资源类型, host/pod
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("HardwareResourceType")
    @Expose
    private String HardwareResourceType;

    /**
     *  是否浮动规格，1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("IsDynamicSpec")
    @Expose
    private Long IsDynamicSpec;

    /**
     *  浮动规格值json字符串
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("DynamicPodSpec")
    @Expose
    private String DynamicPodSpec;

    /**
     *  是否支持变更计费类型 1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    @SerializedName("SupportModifyPayMode")
    @Expose
    private Long SupportModifyPayMode;

    /**
     *  Get 用户APPID
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return AppId 用户APPID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */

    /**
     *  Set 用户APPID
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param AppId 用户APPID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setAppId(Long AppId) {
        this.AppId = AppId;
    }

    /**
     *  Get 序列号
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return SerialNo 序列号
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getSerialNo() {
        return this.SerialNo;
    }

    /**
     *  Set 序列号
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param SerialNo 序列号
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setSerialNo(String SerialNo) {
        this.SerialNo = SerialNo;
    }

    /**
     *  Get 机器实例ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return OrderNo 机器实例ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getOrderNo() {
        return this.OrderNo;
    }

    /**
     *  Set 机器实例ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param OrderNo 机器实例ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setOrderNo(String OrderNo) {
        this.OrderNo = OrderNo;
    }

    /**
     *  Get master节点绑定外网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return WanIp master节点绑定外网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getWanIp() {
        return this.WanIp;
    }

    /**
     *  Set master节点绑定外网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param WanIp master节点绑定外网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setWanIp(String WanIp) {
        this.WanIp = WanIp;
    }

    /**
     *  Get 节点类型。0:common节点；1:master节点
     * ；2:core节点；3:task节点
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return Flag 节点类型。0:common节点；1:master节点
     * ；2:core节点；3:task节点
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getFlag() {
        return this.Flag;
    }

    /**
     *  Set 节点类型。0:common节点；1:master节点
     * ；2:core节点；3:task节点
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param Flag 节点类型。0:common节点；1:master节点
     * ；2:core节点；3:task节点
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setFlag(Long Flag) {
        this.Flag = Flag;
    }

    /**
     *  Get 节点规格
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return Spec 节点规格
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getSpec() {
        return this.Spec;
    }

    /**
     *  Set 节点规格
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param Spec 节点规格
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setSpec(String Spec) {
        this.Spec = Spec;
    }

    /**
     *  Get 节点核数
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return CpuNum 节点核数
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getCpuNum() {
        return this.CpuNum;
    }

    /**
     *  Set 节点核数
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param CpuNum 节点核数
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setCpuNum(Long CpuNum) {
        this.CpuNum = CpuNum;
    }

    /**
     *  Get 节点内存
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return MemSize 节点内存
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getMemSize() {
        return this.MemSize;
    }

    /**
     *  Set 节点内存
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param MemSize 节点内存
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setMemSize(Long MemSize) {
        this.MemSize = MemSize;
    }

    /**
     *  Get 节点内存描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return MemDesc 节点内存描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getMemDesc() {
        return this.MemDesc;
    }

    /**
     *  Set 节点内存描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param MemDesc 节点内存描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setMemDesc(String MemDesc) {
        this.MemDesc = MemDesc;
    }

    /**
     *  Get 节点所在region
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return RegionId 节点所在region
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getRegionId() {
        return this.RegionId;
    }

    /**
     *  Set 节点所在region
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param RegionId 节点所在region
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setRegionId(Long RegionId) {
        this.RegionId = RegionId;
    }

    /**
     *  Get 节点所在Zone
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return ZoneId 节点所在Zone
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getZoneId() {
        return this.ZoneId;
    }

    /**
     *  Set 节点所在Zone
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param ZoneId 节点所在Zone
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setZoneId(Long ZoneId) {
        this.ZoneId = ZoneId;
    }

    /**
     *  Get 申请时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return ApplyTime 申请时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getApplyTime() {
        return this.ApplyTime;
    }

    /**
     *  Set 申请时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param ApplyTime 申请时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setApplyTime(String ApplyTime) {
        this.ApplyTime = ApplyTime;
    }

    /**
     *  Get 释放时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return FreeTime 释放时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getFreeTime() {
        return this.FreeTime;
    }

    /**
     *  Set 释放时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param FreeTime 释放时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setFreeTime(String FreeTime) {
        this.FreeTime = FreeTime;
    }

    /**
     *  Get 硬盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return DiskSize 硬盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getDiskSize() {
        return this.DiskSize;
    }

    /**
     *  Set 硬盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param DiskSize 硬盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setDiskSize(String DiskSize) {
        this.DiskSize = DiskSize;
    }

    /**
     *  Get 节点描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return NameTag 节点描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getNameTag() {
        return this.NameTag;
    }

    /**
     *  Set 节点描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param NameTag 节点描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setNameTag(String NameTag) {
        this.NameTag = NameTag;
    }

    /**
     *  Get 节点部署服务
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return Services 节点部署服务
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getServices() {
        return this.Services;
    }

    /**
     *  Set 节点部署服务
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param Services 节点部署服务
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setServices(String Services) {
        this.Services = Services;
    }

    /**
     *  Get 磁盘类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return StorageType 磁盘类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getStorageType() {
        return this.StorageType;
    }

    /**
     *  Set 磁盘类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param StorageType 磁盘类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setStorageType(Long StorageType) {
        this.StorageType = StorageType;
    }

    /**
     *  Get 系统盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return RootSize 系统盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getRootSize() {
        return this.RootSize;
    }

    /**
     *  Set 系统盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param RootSize 系统盘大小
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setRootSize(Long RootSize) {
        this.RootSize = RootSize;
    }

    /**
     *  Get 付费类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return ChargeType 付费类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getChargeType() {
        return this.ChargeType;
    }

    /**
     *  Set 付费类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param ChargeType 付费类型
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setChargeType(Long ChargeType) {
        this.ChargeType = ChargeType;
    }

    /**
     *  Get 数据库IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return CdbIp 数据库IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getCdbIp() {
        return this.CdbIp;
    }

    /**
     *  Set 数据库IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param CdbIp 数据库IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setCdbIp(String CdbIp) {
        this.CdbIp = CdbIp;
    }

    /**
     *  Get 数据库端口
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return CdbPort 数据库端口
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getCdbPort() {
        return this.CdbPort;
    }

    /**
     *  Set 数据库端口
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param CdbPort 数据库端口
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setCdbPort(Long CdbPort) {
        this.CdbPort = CdbPort;
    }

    /**
     *  Get 硬盘容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return HwDiskSize 硬盘容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getHwDiskSize() {
        return this.HwDiskSize;
    }

    /**
     *  Set 硬盘容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param HwDiskSize 硬盘容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setHwDiskSize(Long HwDiskSize) {
        this.HwDiskSize = HwDiskSize;
    }

    /**
     *  Get 硬盘容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return HwDiskSizeDesc 硬盘容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getHwDiskSizeDesc() {
        return this.HwDiskSizeDesc;
    }

    /**
     *  Set 硬盘容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param HwDiskSizeDesc 硬盘容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setHwDiskSizeDesc(String HwDiskSizeDesc) {
        this.HwDiskSizeDesc = HwDiskSizeDesc;
    }

    /**
     *  Get 内存容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return HwMemSize 内存容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getHwMemSize() {
        return this.HwMemSize;
    }

    /**
     *  Set 内存容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param HwMemSize 内存容量
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setHwMemSize(Long HwMemSize) {
        this.HwMemSize = HwMemSize;
    }

    /**
     *  Get 内存容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return HwMemSizeDesc 内存容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getHwMemSizeDesc() {
        return this.HwMemSizeDesc;
    }

    /**
     *  Set 内存容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param HwMemSizeDesc 内存容量描述
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setHwMemSizeDesc(String HwMemSizeDesc) {
        this.HwMemSizeDesc = HwMemSizeDesc;
    }

    /**
     *  Get 过期时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return ExpireTime 过期时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getExpireTime() {
        return this.ExpireTime;
    }

    /**
     *  Set 过期时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param ExpireTime 过期时间
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setExpireTime(String ExpireTime) {
        this.ExpireTime = ExpireTime;
    }

    /**
     *  Get 节点资源ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return EmrResourceId 节点资源ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getEmrResourceId() {
        return this.EmrResourceId;
    }

    /**
     *  Set 节点资源ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param EmrResourceId 节点资源ID
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setEmrResourceId(String EmrResourceId) {
        this.EmrResourceId = EmrResourceId;
    }

    /**
     *  Get 续费标志
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return IsAutoRenew 续费标志
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getIsAutoRenew() {
        return this.IsAutoRenew;
    }

    /**
     *  Set 续费标志
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param IsAutoRenew 续费标志
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setIsAutoRenew(Long IsAutoRenew) {
        this.IsAutoRenew = IsAutoRenew;
    }

    /**
     *  Get 设备标识
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return DeviceClass 设备标识
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getDeviceClass() {
        return this.DeviceClass;
    }

    /**
     *  Set 设备标识
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param DeviceClass 设备标识
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setDeviceClass(String DeviceClass) {
        this.DeviceClass = DeviceClass;
    }

    /**
     *  Get 支持变配
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return Mutable 支持变配
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getMutable() {
        return this.Mutable;
    }

    /**
     *  Set 支持变配
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param Mutable 支持变配
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setMutable(Long Mutable) {
        this.Mutable = Mutable;
    }

    /**
     *  Get 多云盘
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return MCMultiDisk 多云盘
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public MultiDiskMC[] getMCMultiDisk() {
        return this.MCMultiDisk;
    }

    /**
     *  Set 多云盘
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param MCMultiDisk 多云盘
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setMCMultiDisk(MultiDiskMC[] MCMultiDisk) {
        this.MCMultiDisk = MCMultiDisk;
    }

    /**
     *  Get 数据库信息
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return CdbNodeInfo 数据库信息
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public CdbInfo getCdbNodeInfo() {
        return this.CdbNodeInfo;
    }

    /**
     *  Set 数据库信息
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param CdbNodeInfo 数据库信息
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setCdbNodeInfo(CdbInfo CdbNodeInfo) {
        this.CdbNodeInfo = CdbNodeInfo;
    }

    /**
     *  Get 内网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return Ip 内网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getIp() {
        return this.Ip;
    }

    /**
     *  Set 内网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param Ip 内网IP
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setIp(String Ip) {
        this.Ip = Ip;
    }

    /**
     *  Get 此节点是否可销毁，1可销毁，0不可销毁
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return Destroyable 此节点是否可销毁，1可销毁，0不可销毁
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getDestroyable() {
        return this.Destroyable;
    }

    /**
     *  Set 此节点是否可销毁，1可销毁，0不可销毁
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param Destroyable 此节点是否可销毁，1可销毁，0不可销毁
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setDestroyable(Long Destroyable) {
        this.Destroyable = Destroyable;
    }

    /**
     *  Get 节点绑定的标签
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return Tags 节点绑定的标签
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Tag[] getTags() {
        return this.Tags;
    }

    /**
     *  Set 节点绑定的标签
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param Tags 节点绑定的标签
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setTags(Tag[] Tags) {
        this.Tags = Tags;
    }

    /**
     *  Get 是否是自动扩缩容节点，0为普通节点，1为自动扩缩容节点。
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return AutoFlag 是否是自动扩缩容节点，0为普通节点，1为自动扩缩容节点。
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getAutoFlag() {
        return this.AutoFlag;
    }

    /**
     *  Set 是否是自动扩缩容节点，0为普通节点，1为自动扩缩容节点。
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param AutoFlag 是否是自动扩缩容节点，0为普通节点，1为自动扩缩容节点。
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setAutoFlag(Long AutoFlag) {
        this.AutoFlag = AutoFlag;
    }

    /**
     *  Get 资源类型, host/pod
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return HardwareResourceType 资源类型, host/pod
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getHardwareResourceType() {
        return this.HardwareResourceType;
    }

    /**
     *  Set 资源类型, host/pod
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param HardwareResourceType 资源类型, host/pod
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setHardwareResourceType(String HardwareResourceType) {
        this.HardwareResourceType = HardwareResourceType;
    }

    /**
     *  Get 是否浮动规格，1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return IsDynamicSpec 是否浮动规格，1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getIsDynamicSpec() {
        return this.IsDynamicSpec;
    }

    /**
     *  Set 是否浮动规格，1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param IsDynamicSpec 是否浮动规格，1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setIsDynamicSpec(Long IsDynamicSpec) {
        this.IsDynamicSpec = IsDynamicSpec;
    }

    /**
     *  Get 浮动规格值json字符串
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return DynamicPodSpec 浮动规格值json字符串
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public String getDynamicPodSpec() {
        return this.DynamicPodSpec;
    }

    /**
     *  Set 浮动规格值json字符串
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param DynamicPodSpec 浮动规格值json字符串
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setDynamicPodSpec(String DynamicPodSpec) {
        this.DynamicPodSpec = DynamicPodSpec;
    }

    /**
     *  Get 是否支持变更计费类型 1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @return SupportModifyPayMode 是否支持变更计费类型 1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public Long getSupportModifyPayMode() {
        return this.SupportModifyPayMode;
    }

    /**
     *  Set 是否支持变更计费类型 1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     *  @param SupportModifyPayMode 是否支持变更计费类型 1是，0否
     * 注意：此字段可能返回 null，表示取不到有效值。
     */
    public void setSupportModifyPayMode(Long SupportModifyPayMode) {
        this.SupportModifyPayMode = SupportModifyPayMode;
    }

    public NodeHardwareInfo() {
    }

    /**
     * NOTE: Any ambiguous key set via .set("AnyKey", "value") will be a shallow copy,
     *       and any explicit key, i.e Foo, set via .setFoo("value") will be a deep copy.
     */
    public NodeHardwareInfo(NodeHardwareInfo source) {
        if (source.AppId != null) {
            this.AppId = new Long(source.AppId);
        }
        if (source.SerialNo != null) {
            this.SerialNo = new String(source.SerialNo);
        }
        if (source.OrderNo != null) {
            this.OrderNo = new String(source.OrderNo);
        }
        if (source.WanIp != null) {
            this.WanIp = new String(source.WanIp);
        }
        if (source.Flag != null) {
            this.Flag = new Long(source.Flag);
        }
        if (source.Spec != null) {
            this.Spec = new String(source.Spec);
        }
        if (source.CpuNum != null) {
            this.CpuNum = new Long(source.CpuNum);
        }
        if (source.MemSize != null) {
            this.MemSize = new Long(source.MemSize);
        }
        if (source.MemDesc != null) {
            this.MemDesc = new String(source.MemDesc);
        }
        if (source.RegionId != null) {
            this.RegionId = new Long(source.RegionId);
        }
        if (source.ZoneId != null) {
            this.ZoneId = new Long(source.ZoneId);
        }
        if (source.ApplyTime != null) {
            this.ApplyTime = new String(source.ApplyTime);
        }
        if (source.FreeTime != null) {
            this.FreeTime = new String(source.FreeTime);
        }
        if (source.DiskSize != null) {
            this.DiskSize = new String(source.DiskSize);
        }
        if (source.NameTag != null) {
            this.NameTag = new String(source.NameTag);
        }
        if (source.Services != null) {
            this.Services = new String(source.Services);
        }
        if (source.StorageType != null) {
            this.StorageType = new Long(source.StorageType);
        }
        if (source.RootSize != null) {
            this.RootSize = new Long(source.RootSize);
        }
        if (source.ChargeType != null) {
            this.ChargeType = new Long(source.ChargeType);
        }
        if (source.CdbIp != null) {
            this.CdbIp = new String(source.CdbIp);
        }
        if (source.CdbPort != null) {
            this.CdbPort = new Long(source.CdbPort);
        }
        if (source.HwDiskSize != null) {
            this.HwDiskSize = new Long(source.HwDiskSize);
        }
        if (source.HwDiskSizeDesc != null) {
            this.HwDiskSizeDesc = new String(source.HwDiskSizeDesc);
        }
        if (source.HwMemSize != null) {
            this.HwMemSize = new Long(source.HwMemSize);
        }
        if (source.HwMemSizeDesc != null) {
            this.HwMemSizeDesc = new String(source.HwMemSizeDesc);
        }
        if (source.ExpireTime != null) {
            this.ExpireTime = new String(source.ExpireTime);
        }
        if (source.EmrResourceId != null) {
            this.EmrResourceId = new String(source.EmrResourceId);
        }
        if (source.IsAutoRenew != null) {
            this.IsAutoRenew = new Long(source.IsAutoRenew);
        }
        if (source.DeviceClass != null) {
            this.DeviceClass = new String(source.DeviceClass);
        }
        if (source.Mutable != null) {
            this.Mutable = new Long(source.Mutable);
        }
        if (source.MCMultiDisk != null) {
            this.MCMultiDisk = new MultiDiskMC[source.MCMultiDisk.length];
            for (int i = 0; i < source.MCMultiDisk.length; i++) {
                this.MCMultiDisk[i] = new MultiDiskMC(source.MCMultiDisk[i]);
            }
        }
        if (source.CdbNodeInfo != null) {
            this.CdbNodeInfo = new CdbInfo(source.CdbNodeInfo);
        }
        if (source.Ip != null) {
            this.Ip = new String(source.Ip);
        }
        if (source.Destroyable != null) {
            this.Destroyable = new Long(source.Destroyable);
        }
        if (source.Tags != null) {
            this.Tags = new Tag[source.Tags.length];
            for (int i = 0; i < source.Tags.length; i++) {
                this.Tags[i] = new Tag(source.Tags[i]);
            }
        }
        if (source.AutoFlag != null) {
            this.AutoFlag = new Long(source.AutoFlag);
        }
        if (source.HardwareResourceType != null) {
            this.HardwareResourceType = new String(source.HardwareResourceType);
        }
        if (source.IsDynamicSpec != null) {
            this.IsDynamicSpec = new Long(source.IsDynamicSpec);
        }
        if (source.DynamicPodSpec != null) {
            this.DynamicPodSpec = new String(source.DynamicPodSpec);
        }
        if (source.SupportModifyPayMode != null) {
            this.SupportModifyPayMode = new Long(source.SupportModifyPayMode);
        }
    }

    /**
     * Internal implementation, normal users should not use it.
     */
    public void toMap(HashMap<String, String> map, String prefix) {
        this.setParamSimple(map, prefix + "AppId", this.AppId);
        this.setParamSimple(map, prefix + "SerialNo", this.SerialNo);
        this.setParamSimple(map, prefix + "OrderNo", this.OrderNo);
        this.setParamSimple(map, prefix + "WanIp", this.WanIp);
        this.setParamSimple(map, prefix + "Flag", this.Flag);
        this.setParamSimple(map, prefix + "Spec", this.Spec);
        this.setParamSimple(map, prefix + "CpuNum", this.CpuNum);
        this.setParamSimple(map, prefix + "MemSize", this.MemSize);
        this.setParamSimple(map, prefix + "MemDesc", this.MemDesc);
        this.setParamSimple(map, prefix + "RegionId", this.RegionId);
        this.setParamSimple(map, prefix + "ZoneId", this.ZoneId);
        this.setParamSimple(map, prefix + "ApplyTime", this.ApplyTime);
        this.setParamSimple(map, prefix + "FreeTime", this.FreeTime);
        this.setParamSimple(map, prefix + "DiskSize", this.DiskSize);
        this.setParamSimple(map, prefix + "NameTag", this.NameTag);
        this.setParamSimple(map, prefix + "Services", this.Services);
        this.setParamSimple(map, prefix + "StorageType", this.StorageType);
        this.setParamSimple(map, prefix + "RootSize", this.RootSize);
        this.setParamSimple(map, prefix + "ChargeType", this.ChargeType);
        this.setParamSimple(map, prefix + "CdbIp", this.CdbIp);
        this.setParamSimple(map, prefix + "CdbPort", this.CdbPort);
        this.setParamSimple(map, prefix + "HwDiskSize", this.HwDiskSize);
        this.setParamSimple(map, prefix + "HwDiskSizeDesc", this.HwDiskSizeDesc);
        this.setParamSimple(map, prefix + "HwMemSize", this.HwMemSize);
        this.setParamSimple(map, prefix + "HwMemSizeDesc", this.HwMemSizeDesc);
        this.setParamSimple(map, prefix + "ExpireTime", this.ExpireTime);
        this.setParamSimple(map, prefix + "EmrResourceId", this.EmrResourceId);
        this.setParamSimple(map, prefix + "IsAutoRenew", this.IsAutoRenew);
        this.setParamSimple(map, prefix + "DeviceClass", this.DeviceClass);
        this.setParamSimple(map, prefix + "Mutable", this.Mutable);
        this.setParamArrayObj(map, prefix + "MCMultiDisk.", this.MCMultiDisk);
        this.setParamObj(map, prefix + "CdbNodeInfo.", this.CdbNodeInfo);
        this.setParamSimple(map, prefix + "Ip", this.Ip);
        this.setParamSimple(map, prefix + "Destroyable", this.Destroyable);
        this.setParamArrayObj(map, prefix + "Tags.", this.Tags);
        this.setParamSimple(map, prefix + "AutoFlag", this.AutoFlag);
        this.setParamSimple(map, prefix + "HardwareResourceType", this.HardwareResourceType);
        this.setParamSimple(map, prefix + "IsDynamicSpec", this.IsDynamicSpec);
        this.setParamSimple(map, prefix + "DynamicPodSpec", this.DynamicPodSpec);
        this.setParamSimple(map, prefix + "SupportModifyPayMode", this.SupportModifyPayMode);
    }
}