<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <title>Swagger spec for Ambari REST API</title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta charset="UTF-8" />
  <script>
/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */
!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,
r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;c<h;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==va()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===va()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;l<i;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;d<e;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Ma(a,b,f),(d<0||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)})},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);f<g;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);
if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i<h;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){if(c)return c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
</script>

  <script>
!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),e=[],a=
b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b[a],c.push(g(h[0])),
h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1))&&l<=h&&
(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9,n:10,v:11,
f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m[j++<<1|1]=
a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.charAt(0)];
if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c<i;++c){var r=
g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com",
/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+
s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,
q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=
c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var r=j.createElement("ol");
r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c,a.i),b=g.a;
a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType!==1&&(G=x.substring(g,
t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",
/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],
["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}),
["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);p(v({keywords:Q,
hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);
p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1});
return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.test(o.tagName)&&
o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J(d,u,o);r=
{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code|xmp)$/i,
h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
</script>

  <script>
/*!
* Bootstrap.js by @fat & @mdo
* Copyright 2013 Twitter, Inc.
* http://www.apache.org/licenses/LICENSE-2.0.txt
*/
!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('<div class="dropdown-backdrop"/>').insertBefore(e(this)).on("click",r),s.toggleClass("open")),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
</script>

  <script>
/**
 * marked - a markdown parser
 * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
 * https://github.com/chjj/marked
 */
(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+block.def.source+")")();block.blockquote=replace(block.blockquote)("def",block.def)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b";block.html=replace(block.html)("comment",/<!--[\s\S]*?-->/)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1","\\2")+"|"+block.list.source.replace("\\1","\\3")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm){if(this.options.tables){this.rules=block.tables}else{this.rules=block.gfm}}}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top,bq){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1){this.tokens.push({type:"space"})}}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]||""});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].split(/ *\| */)}this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top,true);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item.charAt(item.length-1)==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false,bq);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&(cap[1]==="pre"||cap[1]==="script"||cap[1]==="style"),text:cap[0]});continue}if(!bq&&top&&(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++){if(/^ *-+: *$/.test(item.align[i])){item.align[i]="right"}else if(/^ *:-+: *$/.test(item.align[i])){item.align[i]="center"}else if(/^ *:-+ *$/.test(item.align[i])){item.align[i]="left"}else{item.align[i]=null}}for(i=0;i<item.cells.length;i++){item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */)}this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1].charAt(cap[1].length-1)==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",text:cap[0]});continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;this.renderer=this.options.renderer||new Renderer;this.renderer.options=this.options;if(!this.links){throw new Error("Tokens array requires a `links` property.")}if(this.options.gfm){if(this.options.breaks){this.rules=inline.breaks}else{this.rules=inline.gfm}}else if(this.options.pedantic){this.rules=inline.pedantic}}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1].charAt(6)===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+=this.renderer.link(href,null,text);continue}if(!this.inLink&&(cap=this.rules.url.exec(src))){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+=this.renderer.link(href,null,text);continue}if(cap=this.rules.tag.exec(src)){if(!this.inLink&&/^<a /i.test(cap[0])){this.inLink=true}else if(this.inLink&&/^<\/a>/i.test(cap[0])){this.inLink=false}src=src.substring(cap[0].length);out+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(cap[0]):escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);this.inLink=true;out+=this.outputLink(cap,{href:cap[2],title:cap[3]});this.inLink=false;continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0].charAt(0);src=cap[0].substring(1)+src;continue}this.inLink=true;out+=this.outputLink(cap,link);this.inLink=false;continue}if(cap=this.rules.strong.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.strong(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.em(this.output(cap[2]||cap[1]));continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.codespan(escape(cap[2],true));continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.br();continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.del(this.output(cap[1]));continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=this.renderer.text(escape(this.smartypants(cap[0])));continue}if(src){throw new Error("Infinite loop on byte: "+src.charCodeAt(0))}}return out};InlineLexer.prototype.outputLink=function(cap,link){var href=escape(link.href),title=link.title?escape(link.title):null;return cap[0].charAt(0)!=="!"?this.renderer.link(href,title,this.output(cap[1])):this.renderer.image(href,title,escape(cap[1]))};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")};InlineLexer.prototype.mangle=function(text){if(!this.options.mangle)return text;var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>.5){ch="x"+ch.toString(16)}out+="&#"+ch+";"}return out};function Renderer(options){this.options=options||{}}Renderer.prototype.code=function(code,lang,escaped){if(this.options.highlight){var out=this.options.highlight(code,lang);if(out!=null&&out!==code){escaped=true;code=out}}if(!lang){return"<pre><code>"+(escaped?code:escape(code,true))+"\n</code></pre>"}return'<pre><code class="'+this.options.langPrefix+escape(lang,true)+'">'+(escaped?code:escape(code,true))+"\n</code></pre>\n"};Renderer.prototype.blockquote=function(quote){return"<blockquote>\n"+quote+"</blockquote>\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"<h"+level+' id="'+this.options.headerPrefix+raw.toLowerCase().replace(/[^\w]+/g,"-")+'">'+text+"</h"+level+">\n"};Renderer.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"};Renderer.prototype.list=function(body,ordered){var type=ordered?"ol":"ul";return"<"+type+">\n"+body+"</"+type+">\n"};Renderer.prototype.listitem=function(text){return"<li>"+text+"</li>\n"};Renderer.prototype.paragraph=function(text){return"<p>"+text+"</p>\n"};Renderer.prototype.table=function(header,body){return"<table>\n"+"<thead>\n"+header+"</thead>\n"+"<tbody>\n"+body+"</tbody>\n"+"</table>\n"};Renderer.prototype.tablerow=function(content){return"<tr>\n"+content+"</tr>\n"};Renderer.prototype.tablecell=function(content,flags){var type=flags.header?"th":"td";var tag=flags.align?"<"+type+' style="text-align:'+flags.align+'">':"<"+type+">";return tag+content+"</"+type+">\n"};Renderer.prototype.strong=function(text){return"<strong>"+text+"</strong>"};Renderer.prototype.em=function(text){return"<em>"+text+"</em>"};Renderer.prototype.codespan=function(text){return"<code>"+text+"</code>"};Renderer.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"};Renderer.prototype.del=function(text){return"<del>"+text+"</del>"};Renderer.prototype.link=function(href,title,text){if(this.options.sanitize){try{var prot=decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(prot.indexOf("javascript:")===0||prot.indexOf("vbscript:")===0){return""}}var out='<a href="'+href+'"';if(title){out+=' title="'+title+'"'}out+=">"+text+"</a>";return out};Renderer.prototype.image=function(href,title,text){var out='<img src="'+href+'" alt="'+text+'"';if(title){out+=' title="'+title+'"'}out+=this.options.xhtml?"/>":">";return out};Renderer.prototype.text=function(text){return text};function Parser(options){this.tokens=[];this.token=null;this.options=options||marked.defaults;this.options.renderer=this.options.renderer||new Renderer;this.renderer=this.options.renderer;this.renderer.options=this.options}Parser.parse=function(src,options,renderer){var parser=new Parser(options,renderer);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options,this.renderer);this.tokens=src.reverse();var out="";while(this.next()){out+=this.tok()}return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;while(this.peek().type==="text"){body+="\n"+this.next().text}return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case"space":{return""}case"hr":{return this.renderer.hr()}case"heading":{return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text)}case"code":{return this.renderer.code(this.token.text,this.token.lang,this.token.escaped)}case"table":{var header="",body="",i,row,cell,flags,j;cell="";for(i=0;i<this.token.header.length;i++){flags={header:true,align:this.token.align[i]};cell+=this.renderer.tablecell(this.inline.output(this.token.header[i]),{header:true,align:this.token.align[i]})}header+=this.renderer.tablerow(cell);for(i=0;i<this.token.cells.length;i++){row=this.token.cells[i];cell="";for(j=0;j<row.length;j++){cell+=this.renderer.tablecell(this.inline.output(row[j]),{header:false,align:this.token.align[j]})}body+=this.renderer.tablerow(cell)}return this.renderer.table(header,body)}case"blockquote_start":{var body="";while(this.next().type!=="blockquote_end"){body+=this.tok()}return this.renderer.blockquote(body)}case"list_start":{var body="",ordered=this.token.ordered;while(this.next().type!=="list_end"){body+=this.tok()}return this.renderer.list(body,ordered)}case"list_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.token.type==="text"?this.parseText():this.tok()}return this.renderer.listitem(body)}case"loose_item_start":{var body="";while(this.next().type!=="list_item_end"){body+=this.tok()}return this.renderer.listitem(body)}case"html":{var html=!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;return this.renderer.html(html)}case"paragraph":{return this.renderer.paragraph(this.inline.output(this.token.text))}case"text":{return this.renderer.paragraph(this.parseText())}}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function unescape(html){return html.replace(/&([#\w]+);/g,function(_,n){n=n.toLowerCase();if(n==="colon")return":";if(n.charAt(0)==="#"){return n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1))}return""})}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target){if(Object.prototype.hasOwnProperty.call(target,key)){obj[key]=target[key]}}}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}opt=merge({},marked.defaults,opt||{});var highlight=opt.highlight,tokens,pending,i=0;try{tokens=Lexer.lex(src,opt)}catch(e){return callback(e)}pending=tokens.length;var done=function(err){if(err){opt.highlight=highlight;return callback(err)}var out;try{out=Parser.parse(tokens,opt)}catch(e){err=e}opt.highlight=highlight;return err?callback(err):callback(null,out)};if(!highlight||highlight.length<3){return done()}delete opt.highlight;if(!pending)return done();for(;i<tokens.length;i++){(function(token){if(token.type!=="code"){return--pending||done()}return highlight(token.text,token.lang,function(err,code){if(err)return done(err);if(code==null||code===token.text){return--pending||done()}token.text=code;token.escaped=true;--pending||done()})})(tokens[i])}return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";if((opt||marked.defaults).silent){return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>"}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,sanitizer:null,mangle:true,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
</script>
  <script>
    $( document ).ready(function() {
      marked.setOptions({
        renderer: new marked.Renderer(),
        gfm: true,
        tables: true,
        breaks: false,
        pedantic: false,
        sanitize: false,
        smartLists: true,
        smartypants: false
      });

      var textFile = null;

      /// Function to be used to download a text json schema
      function makeTextFile(text) {

        var data = new Blob([text], {type: 'text/plain'});

        // If we are replacing a previously generated file we need to
        // manually revoke the object URL to avoid memory leaks.
        if (textFile !== null) {
          window.URL.revokeObjectURL(textFile);
        }

        textFile = window.URL.createObjectURL(data);

        var a = document.createElement("a");
        document.body.appendChild(a);
        a.style = "display: none";
        a.href = textFile;
        a.download = 'schema.txt';
        a.click();

        return textFile;
      };

      /// TODO: Implement resizing for expanding within iframe
      function callResize() {
        window.parent.postMessage('resize', "*");
      }

      function processMarked() {
        $(".marked").each(function() {
          $(this).html(marked($(this).html()));
        });
      }


      // load google web fonts
      loadGoogleFontCss();


      // Bootstrap Scrollspy
      $(this).scrollspy({ target: '#scrollingNav', offset: 18 });

      // Content-Scroll on Navigation click.
      $('.sidenav').find('a').on('click', function(e) {
          e.preventDefault();
          var id = $(this).attr('href');
          if ($(id).length > 0)
              $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 400);
          window.location.hash = $(this).attr('href');
      });

      // Quickjump on Pageload to hash position.
      if(window.location.hash) {
          var id = window.location.hash;
          if ($(id).length > 0)
              $('html,body').animate({ scrollTop: parseInt($(id).offset().top) }, 0);
      }


      function initDynamic() {
        // tabs
        $('.nav-tabs-examples a').click(function (e) {
            e.preventDefault();
            $(this).tab('show');
        });


        $('.nav-tabs-examples').find('a:first').tab('show');

        // call scrollspy refresh method
        $(window).scrollspy('refresh');
      }

      initDynamic();

      // Pre- / Code-Format
      prettyPrint();

      //Convert elements with "marked" class to markdown
      processMarked();

      /**
       * Load google fonts.
       */
      function loadGoogleFontCss() {
        WebFont.load({
          active: function() {
            // Update scrollspy
            $(window).scrollspy('refresh')
          },
          google: {
            families: ['Source Code Pro', 'Source Sans Pro:n4,n6,n7']
          }
        });
      }
    });
  </script>
  <style type="text/css">
  
/*!
 * Bootstrap v2.3.2
 *
 * Copyright 2013 Twitter, Inc
 * Licensed under the Apache License v2.0
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Designed and built with all the love in the world by @mdo and @fat.
 */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}

  /* Pretty printing styles. Used with prettify.js. */
/* Vim sunburst theme by David Leibovic */
pre .str {
  color: #65B042;
}
/* string  - green */
pre .kwd {
  color: #E28964;
}
/* keyword - dark pink */
pre .com {
  color: #AEAEAE;
  font-style: italic;
}
/* comment - gray */
pre .typ {
  color: #89bdff;
}
/* type - light blue */
pre .lit {
  color: #3387CC;
}
/* literal - blue */
pre .pun {
  color: #fff;
}
/* punctuation - white */
pre .pln {
  color: #fff;
}
/* plaintext - white */
pre .tag {
  color: #89bdff;
}
/* html/xml tag    - light blue */
pre .atn {
  color: #bdb76b;
}
/* html/xml attribute name  - khaki */
pre .atv {
  color: #65B042;
}
/* html/xml attribute value - green */
pre .dec {
  color: #3387CC;
}
/* decimal - blue */
/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
  margin-top: 0;
  margin-bottom: 0;
  color: #AEAEAE;
}
/* IE indents via margin-left */
li.L0,
li.L1,
li.L2,
li.L3,
li.L5,
li.L6,
li.L7,
li.L8 {
  list-style-type: none;
}
/* Alternate shading for lines */
@media print {
  pre .str {
    color: #060;
  }
  pre .kwd {
    color: #006;
    font-weight: bold;
  }
  pre .com {
    color: #600;
    font-style: italic;
  }
  pre .typ {
    color: #404;
    font-weight: bold;
  }
  pre .lit {
    color: #044;
  }
  pre .pun {
    color: #440;
  }
  pre .pln {
    color: #000;
  }
  pre .tag {
    color: #006;
    font-weight: bold;
  }
  pre .atn {
    color: #404;
  }
  pre .atv {
    color: #060;
  }
}
  /* ------------------------------------------------------------------------------------------
 * Content
 * ------------------------------------------------------------------------------------------ */
body {
  min-width: 980px;
}

body, p, a, div, th, td {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 400;
  font-size: 16px;
  text-shadow: none !important;
}

td.code {
  font-size: 14px;
  font-family: "Source Code Pro", monospace;
  font-style: normal;
  font-weight: 400;
}

#content {
  padding-top: 16px;
  z-Index: -1;
  margin-left: 270px;
}

p {
  color: #808080;
}

h1 {
  font-family: "Source Sans Pro Semibold", sans-serif;
  font-weight: normal;
  font-size: 44px;
  line-height: 50px;
  margin: 0 0 10px 0;
  padding: 0;
}

h2 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: normal;
  font-size: 24px;
  line-height: 40px;
  margin: 0 0 20px 0;
  padding: 0;
}

section {
  border-top: 1px solid #ebebeb;
  padding: 30px 0;
}

section h1 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 700;
  font-size: 32px;
  line-height: 40px;
  padding-bottom: 14px;
  margin: 0 0 20px 0;
  padding: 0;
}

article {
  padding: 14px 0 30px 0;
}

article h1 {
  font-family: "Source Sans Pro Bold", sans-serif;
  font-weight: 600;
  font-size: 24px;
  line-height: 26px;
}

article h2 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 600;
  font-size: 18px;
  line-height: 24px;
  margin: 0 0 10px 0;
}

article h3 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 600;
  font-size: 16px;
  line-height: 18px;
  margin: 0 0 10px 0;
}

article h4 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 600;
  font-size: 14px;
  line-height: 16px;
  margin: 0 0 8px 0;
}

table {
  border-collapse: collapse;
  width: 100%;
  margin: 0 0 20px 0;
}

th {
  background-color: #f5f5f5;
  text-align: left;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 700;
  padding: 4px 8px;
  border: #e0e0e0 1px solid;
}

td {
  vertical-align: top;
  padding: 2px 8px;
  border: #e0e0e0 1px solid;
}

#generator .content {
  color: #b0b0b0;
  border-top: 1px solid #ebebeb;
  padding: 10px 0;
}

.label-optional {
  float: right;
}

.open-left {
  right: 0;
  left: auto;
}

/* ------------------------------------------------------------------------------------------
 * apidoc - intro
 * ------------------------------------------------------------------------------------------ */

#apidoc .apidoc {
  border-top: 1px solid #ebebeb;
  padding: 30px 0;
}

#apidoc h1 {
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 700;
  font-size: 32px;
  line-height: 40px;
  padding-bottom: 14px;
  margin: 0 0 20px 0;
  padding: 0;
}

#apidoc h2 {
  font-family: "Source Sans Pro Bold", sans-serif;
  font-weight: 600;
  font-size: 22px;
  line-height: 26px;
  padding-top: 14px;
}

/* ------------------------------------------------------------------------------------------
 * pre / code
 * ------------------------------------------------------------------------------------------ */
pre {
  background-color: #292b36;
  color: #ffffff;
  padding: 10px;
  border-radius: 6px;
  position: relative;
  margin: 10px 0 20px 0;
}

code.language-text {
  word-wrap: break-word;
}

pre.language-json {
  overflow: auto;
}

pre.language-html {
  margin: 40px 0 20px 0;
}

pre.language-html:before {
  content: attr(data-type);
  position: absolute;
  top: -30px;
  left: 0;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 600;
  font-size: 15px;
  display: inline-block;
  padding: 2px 5px;
  border-radius: 6px;
  text-transform: uppercase;
  background-color: #3387CC;
  color: #ffffff;
}

pre.language-html[data-type="get"]:before {
  background-color: green;
}

pre.language-html[data-type="put"]:before {
  background-color: #e5c500;
}

pre.language-html[data-type="post"]:before {
  background-color: #4070ec;
}

pre.language-html[data-type="delete"]:before {
  background-color: #ed0039;
}

pre.language-api .str {
  color: #ffffff;
}

pre.language-api .pln,
pre.language-api .pun {
  color: #65B042;
}

pre code {
  display: block;
  font-size: 14px;
  font-family: "Source Code Pro", monospace;
  font-style: normal;
  font-weight: 400;
}

pre code.sample-request-response-json {
  white-space: pre-wrap;
  max-height: 500px;
  overflow: auto;
}

/* ------------------------------------------------------------------------------------------
 * Sidenav
 * ------------------------------------------------------------------------------------------ */
.sidenav {
  width: 228px;
  margin: 0;
  padding: 20px;
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  overflow-x: hidden;
  overflow-y: auto;
  background-color: #f5f5f5;
  z-index: 10;
}

.sidenav > li > a {
  display: block;
  width: 192px;
  margin: 0;
  padding: 2px 11px;
  border: 0;
  border-left: transparent 4px solid;
  border-right: transparent 4px solid;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 400;
  font-size: 14px;
}

.sidenav > li.nav-header > a {
  padding: 5px 15px;
  border: 1px solid #e5e5e5;
  width: 190px;
  font-family: "Source Sans Pro", sans-serif;
  font-weight: 700;
  font-size: 16px;
  background-color: #4c8eca;
  color: #fff;
}

.sidenav > li.nav-header.active > a {
  background-color: #4c8eca;
  color: #fff;
}


00427D

.sidenav > .active > a {
  position: relative;
  z-index: 2;
}

.sidenav > li > a:hover {
  background-color: #ffffff;
}

.sidenav > li.has-modifications a {
  border-right: #60d060 4px solid;
}

.sidenav > li.is-new a {
  border-left: #e5e5e5 4px solid;
}



/* ------------------------------------------------------------------------------------------
 * Tabs
 * ------------------------------------------------------------------------------------------ */
ul.nav-tabs {
  margin: 0;
}

/* ------------------------------------------------------------------------------------------
 * Print
 * ------------------------------------------------------------------------------------------ */

@media print {

  #sidenav,
  #version,
  #versions,
  section .version,
  section .versions {
    display: none;
  }

  #content {
    margin-left: 0;
  }

  a {
    text-decoration: none;
    color: inherit;
  }

  a:after {
    content: " [" attr(href) "] ";
  }

  p {
    color: #000000
  }

  pre {
    background-color: #ffffff;
    color: #000000;
    padding: 10px;
    border: #808080 1px solid;
    border-radius: 6px;
    position: relative;
    margin: 10px 0 20px 0;
  }

} /* /@media print */


.doc-chapter
{
display:none;
background-color: #eee;
border-radius: 1px;
padding: 10px;
margin-bottom: 20px;
}































/*!
 * json-schema-view-js
 * https://github.com/mohsen1/json-schema-view-js#readme
 * Version: 0.4.1 - 2015-11-12T17:19:27.615Z
 * License: MIT
 */.json-schema-view .toggle-handle:after,.json-schema-view.json-schema-view-dark .toggle-handle:after,json-schema-view .toggle-handle:after,json-schema-view[json-schema-view-dark] .toggle-handle:after{content:"\25BC"}.json-schema-view .title,.json-schema-view.json-schema-view-dark .title,json-schema-view .title,json-schema-view[json-schema-view-dark] .title{font-weight:700;cursor:pointer}.json-schema-view,json-schema-view{font-family:monospace;font-size:0;display:table-cell}.json-schema-view>*,json-schema-view>*{font-size:14px}.json-schema-view .toggle-handle,json-schema-view .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view .toggle-handle,.json-schema-view .toggle-handle:hover,json-schema-view .toggle-handle,json-schema-view .toggle-handle:hover{text-decoration:none;color:#333}.json-schema-view .description,json-schema-view .description{color:gray;font-style:italic}
   .pattern {
    color: blue;
  }
  .default {
    color: black;
  }
  .required {
    color:black;
  }
  .json-schema-view .title,.json-schema-view .title:hover,json-schema-view .title,json-schema-view .title:hover{text-decoration:none;color:#333}.json-schema-view .brace,.json-schema-view .bracket,.json-schema-view .title,json-schema-view .brace,json-schema-view .bracket,json-schema-view .title{color:#333}.json-schema-view .property,json-schema-view .property{font-size:0;display:table-row}.json-schema-view .property>*,json-schema-view .property>*{font-size:14px;padding:.2em}.json-schema-view .name,json-schema-view .name{color:#00f;display:table-cell;vertical-align:top}.json-schema-view .type,json-schema-view .type{color:green}.json-schema-view .type-any,json-schema-view .type-any{color:#33f}.json-schema-view .required,json-schema-view .required{color:red}.json-schema-view .inner,json-schema-view .inner{padding-left:18px}.json-schema-view.collapsed .description,.json-schema-view.collapsed .property,json-schema-view.collapsed .description,json-schema-view.collapsed .property{display:none}.json-schema-view.collapsed .closeing.brace,json-schema-view.collapsed .closeing.brace{display:inline-block}.json-schema-view.collapsed .toggle-handle,json-schema-view.collapsed .toggle-handle{transform:rotate(-90deg)}.json-schema-view.json-schema-view-dark,json-schema-view[json-schema-view-dark]{font-family:monospace;font-size:0;display:table-cell}.json-schema-view.json-schema-view-dark>*,json-schema-view[json-schema-view-dark]>*{font-size:14px}.json-schema-view.json-schema-view-dark .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle{cursor:pointer;margin:auto .3em;font-size:10px;display:inline-block;transform-origin:50% 40%;transition:transform 150ms ease-in}.json-schema-view.json-schema-view-dark .toggle-handle,.json-schema-view.json-schema-view-dark .toggle-handle:hover,json-schema-view[json-schema-view-dark] .toggle-handle,json-schema-view[json-schema-view-dark] .toggle-handle:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .description,json-schema-view[json-schema-view-dark] .description{color:gray;font-style:italic}.json-schema-view.json-schema-view-dark .title,.json-schema-view.json-schema-view-dark .title:hover,json-schema-view[json-schema-view-dark] .title,json-schema-view[json-schema-view-dark] .title:hover{text-decoration:none;color:#eee}.json-schema-view.json-schema-view-dark .brace,.json-schema-view.json-schema-view-dark .bracket,.json-schema-view.json-schema-view-dark .title,json-schema-view[json-schema-view-dark] .brace,json-schema-view[json-schema-view-dark] .bracket,json-schema-view[json-schema-view-dark] .title{color:#eee}.json-schema-view.json-schema-view-dark .property,json-schema-view[json-schema-view-dark] .property{font-size:0;display:table-row}.json-schema-view.json-schema-view-dark .property>*,json-schema-view[json-schema-view-dark] .property>*{font-size:14px;padding:.2em}.json-schema-view.json-schema-view-dark .name,json-schema-view[json-schema-view-dark] .name{color:#add8e6;display:table-cell;vertical-align:top}.json-schema-view.json-schema-view-dark .type,json-schema-view[json-schema-view-dark] .type{color:#90ee90}.json-schema-view.json-schema-view-dark .type-any,json-schema-view[json-schema-view-dark] .type-any{color:#d4ebf2}.json-schema-view.json-schema-view-dark .required,json-schema-view[json-schema-view-dark] .required{color:#fe0000}.json-schema-view.json-schema-view-dark .inner,json-schema-view[json-schema-view-dark] .inner{padding-left:18px}.json-schema-view.json-schema-view-dark.collapsed .description,.json-schema-view.json-schema-view-dark.collapsed .property,json-schema-view[json-schema-view-dark].collapsed .description,json-schema-view[json-schema-view-dark].collapsed .property{display:none}.json-schema-view.json-schema-view-dark.collapsed .closeing.brace,json-schema-view[json-schema-view-dark].collapsed .closeing.brace{display:inline-block}.json-schema-view.json-schema-view-dark.collapsed .toggle-handle,json-schema-view[json-schema-view-dark].collapsed .toggle-handle{transform:rotate(-90deg)}

  </style>
</head>
<body>
  <script>
    // Script section to load models into a JS Var
    var defs = {}
    defs.ActionRequest = {
  "type" : "object",
  "properties" : {
    "action_name" : {
      "type" : "string"
    },
    "action_type" : {
      "type" : "string"
    },
    "inputs" : {
      "type" : "string"
    },
    "target_service" : {
      "type" : "string"
    },
    "target_component" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "target_type" : {
      "type" : "string"
    },
    "default_timeout" : {
      "type" : "string"
    }
  }
};
    defs.ActionRequestSwagger = {
  "type" : "object",
  "properties" : {
    "Actions" : {
      "$ref" : "#/definitions/ActionRequest"
    }
  }
};
    defs.ActionResponse = {
  "type" : "object",
  "properties" : {
    "action_name" : {
      "type" : "string"
    },
    "action_type" : {
      "type" : "string"
    },
    "inputs" : {
      "type" : "string"
    },
    "target_service" : {
      "type" : "string"
    },
    "target_component" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "target_type" : {
      "type" : "string"
    },
    "default_timeout" : {
      "type" : "string"
    }
  }
};
    defs.ActionResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Actions" : {
      "$ref" : "#/definitions/ActionResponse"
    }
  }
};
    defs.ActiveWidgetLayoutRequest = {
  "type" : "object",
  "properties" : {
    "WidgetLayouts" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/WidgetLayoutIdWrapper"
      }
    }
  }
};
    defs.ActiveWidgetLayoutResponse = {
  "type" : "object",
  "properties" : {
    "WidgetLayoutInfo/cluster_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/display_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/layout_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/scope" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/section_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/user_name" : {
      "type" : "string"
    },
    "WidgetLayoutInfo/widgets" : {
      "type" : "array",
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "$ref" : "#/definitions/WidgetResponse"
        }
      }
    }
  }
};
    defs.AgentEnv = {
  "type" : "object",
  "properties" : {
    "stackFoldersAndFiles" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Directory"
      }
    },
    "alternatives" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Alternative"
      }
    },
    "existingUsers" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ExistingUser"
      }
    },
    "existingRepos" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "installedPackages" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/PackageDetail"
      }
    },
    "hostHealth" : {
      "$ref" : "#/definitions/HostHealth"
    },
    "umask" : {
      "type" : "integer",
      "format" : "int32"
    },
    "transparentHugePage" : {
      "type" : "string"
    },
    "firewallRunning" : {
      "type" : "boolean",
      "default" : false
    },
    "firewallName" : {
      "type" : "string"
    },
    "hasUnlimitedJcePolicy" : {
      "type" : "boolean",
      "default" : false
    },
    "reverseLookup" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.AlertGroup = {
  "type" : "object",
  "properties" : {
    "default" : {
      "type" : "boolean",
      "default" : false
    },
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "name" : {
      "type" : "string"
    },
    "cluster_id" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.AlertTargetInfo = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "description" : {
      "type" : "string"
    },
    "enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "notification_type" : {
      "type" : "string"
    },
    "groups" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/AlertGroup"
      }
    },
    "alert_states" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "global" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.AlertTargetSwagger = {
  "type" : "object",
  "properties" : {
    "AlertTarget" : {
      "$ref" : "#/definitions/AlertTargetInfo"
    }
  }
};
    defs.Alternative = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "target" : {
      "type" : "string"
    }
  }
};
    defs.Artifacts = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.BatchRequest = {
  "type" : "object",
  "properties" : {
    "batch_settings" : {
      "$ref" : "#/definitions/BatchSettings"
    },
    "requests" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/BatchRequestRequest"
      }
    }
  }
};
    defs.BatchRequestRequest = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "RequestBodyInfo" : {
      "$ref" : "#/definitions/RequestBodyInfo"
    },
    "order_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "uri" : {
      "type" : "string"
    }
  }
};
    defs.BatchRequestResponse = {
  "type" : "object",
  "properties" : {
    "request_type" : {
      "type" : "string"
    },
    "request_status" : {
      "type" : "string"
    },
    "return_code" : {
      "type" : "integer",
      "format" : "int32"
    },
    "response_message" : {
      "type" : "string"
    },
    "order_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "request_uri" : {
      "type" : "string"
    },
    "request_body" : {
      "type" : "string"
    }
  }
};
    defs.BatchResponse = {
  "type" : "object",
  "properties" : {
    "batch_settings" : {
      "$ref" : "#/definitions/BatchSettings"
    },
    "batch_requests" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/BatchRequestResponse"
      }
    }
  }
};
    defs.BatchSettings = {
  "type" : "object",
  "properties" : {
    "task_failure_tolerance_limit" : {
      "type" : "integer",
      "format" : "int32"
    },
    "batch_separation_in_seconds" : {
      "type" : "integer",
      "format" : "int32"
    }
  }
};
    defs.BlueprintInfo = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "security" : {
      "$ref" : "#/definitions/SecurityInfo"
    },
    "stack_version" : {
      "type" : "string"
    },
    "blueprint_name" : {
      "type" : "string"
    }
  }
};
    defs.BlueprintSwagger = {
  "type" : "object",
  "properties" : {
    "configurations" : {
      "type" : "array",
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    },
    "Blueprints" : {
      "$ref" : "#/definitions/BlueprintInfo"
    },
    "host_groups" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/HostGroupInfo"
      }
    }
  }
};
    defs.Body = {
  "type" : "object",
  "properties" : {
    "Requests" : {
      "$ref" : "#/definitions/Request"
    }
  }
};
    defs.Check = {
  "type" : "object",
  "properties" : {
    "property" : {
      "type" : "string"
    },
    "desired" : {
      "type" : "string"
    },
    "site" : {
      "type" : "string"
    }
  }
};
    defs.ClusterArtifactRequest = {
  "type" : "object",
  "properties" : {
    "Artifacts" : {
      "$ref" : "#/definitions/ClusterArtifactRequestInfo"
    },
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.ClusterArtifactRequestInfo = {
  "type" : "object",
  "properties" : {
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.ClusterArtifactResponse = {
  "type" : "object",
  "properties" : {
    "Artifacts" : {
      "$ref" : "#/definitions/ClusterArtifactResponseInfo"
    },
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.ClusterArtifactResponseInfo = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.ClusterHealthReport = {
  "type" : "object",
  "properties" : {
    "Host/stale_config" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/maintenance_state" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_state/HEALTHY" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_state/UNHEALTHY" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_state/HEARTBEAT_LOST" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_state/INIT" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_status/HEALTHY" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_status/UNHEALTHY" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_status/UNKNOWN" : {
      "type" : "integer",
      "format" : "int32"
    },
    "Host/host_status/ALERT" : {
      "type" : "integer",
      "format" : "int32"
    }
  }
};
    defs.ClusterRequest = {
  "type" : "object",
  "properties" : {
    "cluster_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "provisioning_state" : {
      "type" : "string"
    },
    "security_type" : {
      "type" : "string",
      "enum" : [ "NONE", "KERBEROS" ]
    },
    "desired_service_config_versions" : {
      "$ref" : "#/definitions/ServiceConfigVersionRequest"
    },
    "desired_configs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigurationRequest"
      }
    }
  }
};
    defs.ClusterRequestSwagger = {
  "type" : "object",
  "properties" : {
    "Clusters" : {
      "$ref" : "#/definitions/ClusterRequest"
    }
  }
};
    defs.ClusterResponse = {
  "type" : "object",
  "properties" : {
    "cluster_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "provisioning_state" : {
      "type" : "string",
      "enum" : [ "INIT", "INSTALLING", "INSTALL_FAILED", "INSTALLED", "STARTING", "STARTED", "STOPPING", "UNINSTALLING", "UNINSTALLED", "WIPING_OUT", "UPGRADING", "DISABLED", "UNKNOWN" ]
    },
    "security_type" : {
      "type" : "string",
      "enum" : [ "NONE", "KERBEROS" ]
    },
    "total_hosts" : {
      "type" : "integer",
      "format" : "int32"
    },
    "desired_configs" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/DesiredConfig"
      }
    },
    "desired_service_config_versions" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "array",
        "items" : {
          "$ref" : "#/definitions/ServiceConfigVersionResponse"
        }
      }
    },
    "health_report" : {
      "$ref" : "#/definitions/ClusterHealthReport"
    },
    "credential_store_properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    }
  }
};
    defs.ClusterResponseWrapper = {
  "type" : "object",
  "properties" : {
    "Clusters" : {
      "$ref" : "#/definitions/ClusterResponse"
    }
  }
};
    defs.ClusterServiceArtifactRequest = {
  "type" : "object",
  "properties" : {
    "Artifacts" : {
      "$ref" : "#/definitions/ClusterServiceArtifactRequestInfo"
    },
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.ClusterServiceArtifactRequestInfo = {
  "type" : "object",
  "properties" : {
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.ClusterServiceArtifactResponse = {
  "type" : "object",
  "properties" : {
    "Artifacts" : {
      "$ref" : "#/definitions/ClusterServiceArtifactResponseInfo"
    },
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.ClusterServiceArtifactResponseInfo = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "artifact_name" : {
      "type" : "string"
    }
  }
};
    defs.ComponentDependencyResponse = {
  "type" : "object",
  "properties" : {
    "Dependencies" : {
      "$ref" : "#/definitions/ComponentDependencyResponseInfo"
    }
  }
};
    defs.ComponentDependencyResponseInfo = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "conditions" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/DependencyConditionInfo"
      }
    },
    "scope" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "dependent_component_name" : {
      "type" : "string"
    },
    "dependent_service_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    }
  }
};
    defs.ComponentInfo = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "provision_action" : {
      "type" : "string"
    }
  }
};
    defs.ComponentRecoveryReport = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "numAttempts" : {
      "type" : "integer",
      "format" : "int32"
    },
    "limitReached" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.Config = {
  "type" : "object",
  "properties" : {
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "type" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    },
    "version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "serviceConfigVersions" : {
      "type" : "array",
      "items" : {
        "type" : "integer",
        "format" : "int64"
      }
    },
    "propertiesAttributes" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "string"
        }
      }
    },
    "stackId" : {
      "$ref" : "#/definitions/StackId"
    },
    "propertiesTypes" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "array",
        "uniqueItems" : true,
        "items" : {
          "type" : "string"
        }
      }
    }
  }
};
    defs.ConfigCondition = {
  "type" : "object",
  "properties" : {
    "configs" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "resource" : {
      "type" : "string"
    },
    "if" : {
      "type" : "string"
    },
    "then" : {
      "$ref" : "#/definitions/ConfigConditionResult"
    },
    "else" : {
      "$ref" : "#/definitions/ConfigConditionResult"
    }
  }
};
    defs.ConfigConditionResult = {
  "type" : "object",
  "properties" : {
    "property_value_attributes" : {
      "$ref" : "#/definitions/ValueAttributesInfo"
    }
  }
};
    defs.ConfigGroupRequest = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "group_name" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "service_config_version_note" : {
      "type" : "string"
    },
    "hosts" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string"
      }
    },
    "desired_configs" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/Config"
      }
    }
  }
};
    defs.ConfigGroupResponse = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "group_name" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "hosts" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    },
    "version_tags" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    },
    "desired_configs" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    }
  }
};
    defs.ConfigGroupWrapper = {
  "type" : "object",
  "properties" : {
    "ConfigGroup" : {
      "$ref" : "#/definitions/ConfigGroupResponse"
    }
  }
};
    defs.ConfigPlacement = {
  "type" : "object",
  "properties" : {
    "config" : {
      "type" : "string"
    },
    "subsection-name" : {
      "type" : "string"
    },
    "subsection-tab-name" : {
      "type" : "string"
    },
    "property_value_attributes" : {
      "$ref" : "#/definitions/ValueAttributesInfo"
    },
    "depends-on" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigCondition"
      }
    },
    "removed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ConfigurationRequest = {
  "type" : "object",
  "properties" : {
    "Config/cluster_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    },
    "version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "properties_attributes" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "string"
        }
      }
    },
    "tag" : {
      "type" : "string"
    }
  }
};
    defs.ConfigurationResponse = {
  "type" : "object",
  "properties" : {
    "Config/cluster_name" : {
      "type" : "string"
    },
    "Config/stack_id" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    },
    "version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "properties_attributes" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "string"
        }
      }
    }
  }
};
    defs.CreateUserAuthenticationSourceInfo = {
  "type" : "object",
  "required" : [ "authentication_type", "key" ],
  "properties" : {
    "key" : {
      "type" : "string"
    },
    "authentication_type" : {
      "type" : "string",
      "enum" : [ "LOCAL", "LDAP", "JWT", "PAM", "KERBEROS" ]
    }
  }
};
    defs.CreateUserInfo = {
  "type" : "object",
  "properties" : {
    "display_name" : {
      "type" : "string"
    },
    "password" : {
      "type" : "string"
    },
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "local_user_name" : {
      "type" : "string"
    },
    "admin" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.CreateUsersInfo = {
  "type" : "object",
  "properties" : {
    "display_name" : {
      "type" : "string"
    },
    "user_name" : {
      "type" : "string"
    },
    "password" : {
      "type" : "string"
    },
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "local_user_name" : {
      "type" : "string"
    },
    "admin" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.DependencyConditionInfo = {
  "type" : "object"
};
    defs.DesiredConfig = {
  "type" : "object",
  "properties" : {
    "tag" : {
      "type" : "string"
    },
    "serviceName" : {
      "type" : "string"
    },
    "version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "hostOverrides" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/HostOverride"
      }
    }
  }
};
    defs.Directory = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    }
  }
};
    defs.DiskInfo = {
  "type" : "object",
  "properties" : {
    "available" : {
      "type" : "string"
    },
    "device" : {
      "type" : "string"
    },
    "used" : {
      "type" : "string"
    },
    "percent" : {
      "type" : "string"
    },
    "size" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    },
    "mountpoint" : {
      "type" : "string"
    }
  }
};
    defs.ExistingUser = {
  "type" : "object",
  "properties" : {
    "userName" : {
      "type" : "string"
    },
    "userStatus" : {
      "type" : "string"
    },
    "userHomeDir" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "homeDir" : {
      "type" : "string"
    },
    "status" : {
      "type" : "string"
    }
  }
};
    defs.ExtensionLinkResponse = {
  "type" : "object",
  "properties" : {
    "ExtensionLink" : {
      "$ref" : "#/definitions/ExtensionLinkResponseInfo"
    }
  }
};
    defs.ExtensionLinkResponseInfo = {
  "type" : "object",
  "properties" : {
    "link_id" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "extension_name" : {
      "type" : "string"
    },
    "extension_version" : {
      "type" : "string"
    }
  }
};
    defs.GroupPrivilegeResponse = {
  "type" : "object",
  "required" : [ "PrivilegeInfo/group_name" ],
  "properties" : {
    "permission_label" : {
      "type" : "string"
    },
    "privilege_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "principal_type" : {
      "type" : "string",
      "enum" : [ "USER", "GROUP", "ROLE" ]
    },
    "principal_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "AMBARI", "CLUSTER", "VIEW" ]
    },
    "cluster_name" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    },
    "PrivilegeInfo/group_name" : {
      "type" : "string"
    }
  }
};
    defs.GroupRequest = {
  "type" : "object",
  "required" : [ "Groups/group_name" ],
  "properties" : {
    "Groups/group_name" : {
      "type" : "string"
    }
  }
};
    defs.GroupResponse = {
  "type" : "object",
  "properties" : {
    "Groups/group_name" : {
      "type" : "string"
    },
    "Groups/ldap_group" : {
      "type" : "boolean",
      "default" : false
    },
    "Groups/group_type" : {
      "type" : "string",
      "enum" : [ "LOCAL", "LDAP", "JWT", "PAM" ]
    }
  }
};
    defs.Host = {
  "type" : "object",
  "properties" : {
    "httpProperty" : {
      "type" : "string"
    },
    "httpsProperty" : {
      "type" : "string"
    },
    "site" : {
      "type" : "string"
    }
  }
};
    defs.HostComponentComponent = {
  "type" : "object",
  "properties" : {
    "href" : {
      "type" : "string"
    },
    "ServiceComponentInfo" : {
      "$ref" : "#/definitions/HostComponentServiceComponentInfo"
    }
  }
};
    defs.HostComponentHost = {
  "type" : "object",
  "properties" : {
    "href" : {
      "type" : "string"
    }
  }
};
    defs.HostComponentMetrics = {
  "type" : "object"
};
    defs.HostComponentProcessResponse = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "host_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "valueMap" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    }
  }
};
    defs.HostComponentProcesses = {
  "type" : "object"
};
    defs.HostComponentServiceComponentInfo = {
  "type" : "object",
  "properties" : {
    "component_name" : {
      "type" : "string"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    }
  }
};
    defs.HostComponentSwagger = {
  "type" : "object",
  "properties" : {
    "host" : {
      "$ref" : "#/definitions/HostComponentHost"
    },
    "component" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/HostComponentComponent"
      }
    },
    "HostRoles" : {
      "$ref" : "#/definitions/ServiceComponentHostResponse"
    },
    "metrics" : {
      "$ref" : "#/definitions/HostComponentMetrics"
    },
    "processes" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/HostComponentProcesses"
      }
    }
  }
};
    defs.HostConfig = {
  "type" : "object",
  "properties" : {
    "configGroupOverrides" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "defaultVersionTag" : {
      "type" : "string"
    }
  }
};
    defs.HostGroupInfo = {
  "type" : "object",
  "properties" : {
    "configurations" : {
      "type" : "array",
      "items" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "properties" : { }
        }
      }
    },
    "components" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ComponentInfo"
      }
    },
    "name" : {
      "type" : "string"
    },
    "cardinality" : {
      "type" : "integer",
      "format" : "int32"
    }
  }
};
    defs.HostHealth = {
  "type" : "object",
  "properties" : {
    "activeJavaProcs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/JavaProc"
      }
    },
    "agentTimeStampAtReporting" : {
      "type" : "integer",
      "format" : "int64"
    },
    "serverTimeStampAtReporting" : {
      "type" : "integer",
      "format" : "int64"
    },
    "liveServices" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/LiveService"
      }
    }
  }
};
    defs.HostOverride = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "versionTag" : {
      "type" : "string"
    }
  }
};
    defs.HostRequest = {
  "type" : "object",
  "properties" : {
    "host_name" : {
      "type" : "string"
    },
    "rack_info" : {
      "type" : "string"
    },
    "desired_configs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigurationRequest"
      }
    },
    "maintenance_state" : {
      "type" : "string"
    },
    "host_group" : {
      "type" : "string"
    },
    "blueprint" : {
      "type" : "string"
    },
    "public_host_name" : {
      "type" : "string"
    }
  }
};
    defs.HostResponse = {
  "type" : "object",
  "properties" : {
    "host_name" : {
      "type" : "string"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "ip" : {
      "type" : "string"
    },
    "cpu_count" : {
      "type" : "integer",
      "format" : "int64"
    },
    "ph_cpu_count" : {
      "type" : "integer",
      "format" : "int64"
    },
    "os_arch" : {
      "type" : "string"
    },
    "os_family" : {
      "type" : "string"
    },
    "os_type" : {
      "type" : "string"
    },
    "total_mem" : {
      "type" : "integer",
      "format" : "int64"
    },
    "disk_info" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/DiskInfo"
      }
    },
    "last_heartbeat_time" : {
      "type" : "integer",
      "format" : "int64"
    },
    "last_agent_env" : {
      "$ref" : "#/definitions/AgentEnv"
    },
    "last_registration_time" : {
      "type" : "integer",
      "format" : "int64"
    },
    "rack_info" : {
      "type" : "string"
    },
    "recovery_report" : {
      "$ref" : "#/definitions/RecoveryReport"
    },
    "recovery_summary" : {
      "type" : "string"
    },
    "host_state" : {
      "type" : "string",
      "enum" : [ "INIT", "WAITING_FOR_HOST_STATUS_UPDATES", "HEALTHY", "HEARTBEAT_LOST", "UNHEALTHY" ]
    },
    "desired_configs" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/HostConfig"
      }
    },
    "host_status" : {
      "type" : "string"
    },
    "maintenance_state" : {
      "type" : "string",
      "enum" : [ "OFF", "ON", "IMPLIED_FROM_SERVICE", "IMPLIED_FROM_HOST", "IMPLIED_FROM_SERVICE_AND_HOST" ]
    },
    "host_health_report" : {
      "type" : "string"
    },
    "public_host_name" : {
      "type" : "string"
    }
  }
};
    defs.HostResponseWrapper = {
  "type" : "object",
  "properties" : {
    "Hosts" : {
      "$ref" : "#/definitions/HostResponse"
    }
  }
};
    defs.JavaProc = {
  "type" : "object",
  "properties" : {
    "hadoop" : {
      "type" : "boolean",
      "default" : false
    },
    "user" : {
      "type" : "string"
    },
    "pid" : {
      "type" : "integer",
      "format" : "int32"
    },
    "command" : {
      "type" : "string"
    }
  }
};
    defs.Layout = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "tabs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Tab"
      }
    }
  }
};
    defs.Link = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "componentName" : {
      "type" : "string"
    },
    "requiresUserName" : {
      "type" : "string"
    },
    "url" : {
      "type" : "string"
    },
    "port" : {
      "$ref" : "#/definitions/Port"
    },
    "host" : {
      "$ref" : "#/definitions/Host"
    },
    "protocol" : {
      "$ref" : "#/definitions/Protocol"
    },
    "attributes" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "visible" : {
      "type" : "boolean",
      "default" : false
    },
    "removed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.LiveService = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "status" : {
      "type" : "string"
    },
    "desc" : {
      "type" : "string"
    }
  }
};
    defs.MemberRequest = {
  "type" : "object",
  "required" : [ "MemberInfo/group_name", "MemberInfo/user_name" ],
  "properties" : {
    "MemberInfo/group_name" : {
      "type" : "string"
    },
    "MemberInfo/user_name" : {
      "type" : "string"
    }
  }
};
    defs.MemberResponse = {
  "type" : "object",
  "properties" : {
    "MemberInfo/group_name" : {
      "type" : "string"
    },
    "MemberInfo/user_name" : {
      "type" : "string"
    }
  }
};
    defs.OperationLevel = {
  "type" : "object",
  "properties" : {
    "level" : {
      "type" : "string"
    },
    "cluster_name" : {
      "type" : "string"
    }
  }
};
    defs.Os = {
  "type" : "object",
  "properties" : {
    "family" : {
      "type" : "string",
      "xml" : {
        "attribute" : true
      }
    },
    "packageVersion" : {
      "type" : "string",
      "xml" : {
        "name" : "package-version"
      }
    },
    "repos" : {
      "type" : "array",
      "xml" : {
        "name" : "repo"
      },
      "items" : {
        "$ref" : "#/definitions/Repo"
      }
    }
  }
};
    defs.PackageDetail = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "repoName" : {
      "type" : "string"
    }
  }
};
    defs.ParameterConfig = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "placeholder" : {
      "type" : "string"
    },
    "defaultValue" : {
      "type" : "string",
      "xml" : {
        "name" : "default-value"
      }
    },
    "clusterConfig" : {
      "type" : "string",
      "xml" : {
        "name" : "cluster-config"
      }
    },
    "required" : {
      "type" : "boolean",
      "default" : false
    },
    "masked" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.Placement = {
  "type" : "object",
  "properties" : {
    "configs" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigPlacement"
      }
    },
    "configurationLayout" : {
      "type" : "string"
    }
  }
};
    defs.Port = {
  "type" : "object",
  "properties" : {
    "httpProperty" : {
      "type" : "string"
    },
    "httpDefaultPort" : {
      "type" : "string"
    },
    "httpsProperty" : {
      "type" : "string"
    },
    "httpsDefaultPort" : {
      "type" : "string"
    },
    "regex" : {
      "type" : "string"
    },
    "httpsRegex" : {
      "type" : "string"
    },
    "site" : {
      "type" : "string"
    }
  }
};
    defs.PrivilegeResponse = {
  "type" : "object",
  "properties" : {
    "permission_label" : {
      "type" : "string"
    },
    "privilege_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "principal_type" : {
      "type" : "string",
      "enum" : [ "USER", "GROUP", "ROLE" ]
    },
    "principal_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "AMBARI", "CLUSTER", "VIEW" ]
    },
    "cluster_name" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    }
  }
};
    defs.PropertyDependencyInfo = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.Protocol = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "checks" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Check"
      }
    }
  }
};
    defs.QuickLinksConfiguration = {
  "type" : "object",
  "properties" : {
    "protocol" : {
      "$ref" : "#/definitions/Protocol"
    },
    "links" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Link"
      }
    }
  }
};
    defs.QuickLinksResponse = {
  "type" : "object",
  "properties" : {
    "QuickLinkInfo" : {
      "$ref" : "#/definitions/QuickLinksResponseInfo"
    }
  }
};
    defs.QuickLinksResponseInfo = {
  "type" : "object",
  "properties" : {
    "default" : {
      "type" : "boolean",
      "default" : false
    },
    "file_name" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "quicklink_data" : {
      "$ref" : "#/definitions/QuickLinksConfiguration"
    }
  }
};
    defs.RecoveryReport = {
  "type" : "object",
  "properties" : {
    "summary" : {
      "type" : "string"
    },
    "component_reports" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ComponentRecoveryReport"
      }
    }
  }
};
    defs.Release = {
  "type" : "object",
  "properties" : {
    "repositoryType" : {
      "type" : "string",
      "xml" : {
        "name" : "type"
      },
      "enum" : [ "STANDARD", "PATCH", "MAINT", "SERVICE" ]
    },
    "stackId" : {
      "type" : "string",
      "xml" : {
        "name" : "stack-id"
      }
    },
    "version" : {
      "type" : "string"
    },
    "build" : {
      "type" : "string"
    },
    "compatibleWith" : {
      "type" : "string",
      "xml" : {
        "name" : "compatible-with"
      }
    },
    "releaseNotes" : {
      "type" : "string",
      "xml" : {
        "name" : "release-notes"
      }
    },
    "display" : {
      "type" : "string"
    },
    "fullVersion" : {
      "type" : "string"
    }
  }
};
    defs.Repo = {
  "type" : "object",
  "properties" : {
    "distribution" : {
      "type" : "string"
    },
    "components" : {
      "type" : "string"
    },
    "unique" : {
      "type" : "boolean",
      "default" : false
    },
    "tags" : {
      "type" : "array",
      "xml" : {
        "name" : "tag",
        "wrapped" : true
      },
      "uniqueItems" : true,
      "items" : {
        "type" : "string",
        "enum" : [ "GPL" ]
      }
    },
    "mirrorsList" : {
      "type" : "string"
    },
    "repoId" : {
      "type" : "string"
    },
    "repoName" : {
      "type" : "string"
    },
    "baseUrl" : {
      "type" : "string"
    }
  }
};
    defs.RepoDefinitionEntity = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "repoOs" : {
      "$ref" : "#/definitions/RepoOsEntity"
    },
    "repoName" : {
      "type" : "string"
    },
    "repoID" : {
      "type" : "string"
    },
    "baseUrl" : {
      "type" : "string"
    },
    "mirrors" : {
      "type" : "string"
    },
    "distribution" : {
      "type" : "string"
    },
    "components" : {
      "type" : "string"
    },
    "unique" : {
      "type" : "boolean",
      "default" : false
    },
    "applicableServices" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "tags" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string",
        "enum" : [ "GPL" ]
      }
    }
  }
};
    defs.RepoOsEntity = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "family" : {
      "type" : "string"
    },
    "ambariManaged" : {
      "type" : "boolean",
      "default" : false
    },
    "repoDefinitionEntities" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RepoDefinitionEntity"
      }
    },
    "repositoryVersionEntity" : {
      "$ref" : "#/definitions/RepositoryVersionEntity"
    }
  }
};
    defs.RepositoryInfo = {
  "type" : "object",
  "properties" : {
    "baseUrl" : {
      "type" : "string"
    },
    "osType" : {
      "type" : "string"
    },
    "repoId" : {
      "type" : "string"
    },
    "repoName" : {
      "type" : "string"
    },
    "distribution" : {
      "type" : "string"
    },
    "components" : {
      "type" : "string"
    },
    "mirrorsList" : {
      "type" : "string"
    },
    "defaultBaseUrl" : {
      "type" : "string"
    },
    "repoSaved" : {
      "type" : "boolean",
      "default" : false
    },
    "unique" : {
      "type" : "boolean",
      "default" : false
    },
    "ambariManagedRepositories" : {
      "type" : "boolean",
      "default" : false
    },
    "applicableServices" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "tags" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string",
        "enum" : [ "GPL" ]
      }
    }
  }
};
    defs.RepositoryVersionEntity = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "stack" : {
      "$ref" : "#/definitions/StackEntity"
    },
    "version" : {
      "type" : "string"
    },
    "displayName" : {
      "type" : "string"
    },
    "repoOsEntities" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RepoOsEntity"
      }
    },
    "type" : {
      "type" : "string",
      "enum" : [ "STANDARD", "PATCH", "MAINT", "SERVICE" ]
    },
    "versionXml" : {
      "type" : "string"
    },
    "versionUrl" : {
      "type" : "string"
    },
    "versionXsd" : {
      "type" : "string"
    },
    "resolved" : {
      "type" : "boolean",
      "default" : false
    },
    "children" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RepositoryVersionEntity"
      }
    },
    "hidden" : {
      "type" : "boolean",
      "default" : false
    },
    "stackName" : {
      "type" : "string"
    },
    "stackVersion" : {
      "type" : "string"
    },
    "legacy" : {
      "type" : "boolean",
      "default" : false
    },
    "repositoryXml" : {
      "$ref" : "#/definitions/VersionDefinitionXml"
    },
    "parentId" : {
      "type" : "integer",
      "format" : "int64"
    },
    "stackId" : {
      "$ref" : "#/definitions/StackId"
    }
  }
};
    defs.RepositoryXml = {
  "type" : "object",
  "properties" : {
    "oses" : {
      "type" : "array",
      "xml" : {
        "name" : "os"
      },
      "items" : {
        "$ref" : "#/definitions/Os"
      }
    },
    "valid" : {
      "type" : "boolean",
      "default" : false
    },
    "errors" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "repositories" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RepositoryInfo"
      }
    },
    "latestURI" : {
      "type" : "string"
    }
  },
  "xml" : {
    "name" : "reposinfo"
  }
};
    defs.Request = {
  "type" : "object",
  "properties" : {
    "resource_filters" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RequestResourceFilter"
      }
    },
    "exclusive" : {
      "type" : "boolean",
      "default" : false
    },
    "cluster_name" : {
      "type" : "string"
    }
  }
};
    defs.RequestBodyInfo = {
  "type" : "object",
  "properties" : {
    "Requests/resource_filters" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RequestResourceFilter"
      }
    },
    "RequestInfo" : {
      "$ref" : "#/definitions/RequestInfo"
    }
  }
};
    defs.RequestInfo = {
  "type" : "object",
  "properties" : {
    "parameters" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    },
    "command" : {
      "type" : "string"
    },
    "action" : {
      "type" : "string"
    },
    "operation_level" : {
      "$ref" : "#/definitions/OperationLevel"
    }
  }
};
    defs.RequestPostRequest = {
  "type" : "object",
  "properties" : {
    "Body" : {
      "$ref" : "#/definitions/Body"
    },
    "RequestInfo" : {
      "$ref" : "#/definitions/RequestInfo"
    }
  }
};
    defs.RequestPostResponse = {
  "type" : "object",
  "properties" : {
    "Requests" : {
      "$ref" : "#/definitions/ShortRequestInfo"
    }
  }
};
    defs.RequestPutRequest = {
  "type" : "object",
  "properties" : {
    "Requests" : {
      "$ref" : "#/definitions/RequestRequest"
    }
  }
};
    defs.RequestRequest = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "request_status" : {
      "type" : "string",
      "enum" : [ "PENDING", "QUEUED", "IN_PROGRESS", "HOLDING", "COMPLETED", "FAILED", "HOLDING_FAILED", "TIMEDOUT", "HOLDING_TIMEDOUT", "ABORTED", "SKIPPED_FAILED" ]
    },
    "abort_reason" : {
      "type" : "string"
    },
    "removePendingHostRequests" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.RequestResourceFilter = {
  "type" : "object",
  "properties" : {
    "hosts" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "hosts_predicate" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    }
  }
};
    defs.RequestResponse = {
  "type" : "object",
  "properties" : {
    "Requests" : {
      "$ref" : "#/definitions/RequestStatusInfo"
    }
  }
};
    defs.RequestScheduleRequestElement = {
  "type" : "object",
  "properties" : {
    "schedule" : {
      "$ref" : "#/definitions/ScheduleRequest"
    },
    "batch" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/BatchRequest"
      }
    }
  }
};
    defs.RequestScheduleRequestSwagger = {
  "type" : "object",
  "properties" : {
    "RequestSchedule" : {
      "$ref" : "#/definitions/RequestScheduleRequestElement"
    }
  }
};
    defs.RequestScheduleResponseElement = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "description" : {
      "type" : "string"
    },
    "status" : {
      "type" : "string"
    },
    "schedule" : {
      "$ref" : "#/definitions/ScheduleResponse"
    },
    "batch" : {
      "$ref" : "#/definitions/BatchResponse"
    },
    "create_user" : {
      "type" : "string"
    },
    "update_user" : {
      "type" : "string"
    },
    "update_time" : {
      "type" : "string"
    },
    "last_execution_status" : {
      "type" : "string"
    },
    "authenticated_user" : {
      "type" : "integer",
      "format" : "int32"
    },
    "cluster_name" : {
      "type" : "string"
    },
    "create_time" : {
      "type" : "string"
    }
  }
};
    defs.RequestScheduleResponseSwagger = {
  "type" : "object",
  "properties" : {
    "RequestSchedule" : {
      "$ref" : "#/definitions/RequestScheduleResponseElement"
    }
  }
};
    defs.RequestStatusInfo = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "start_time" : {
      "type" : "string"
    },
    "request_status" : {
      "type" : "string"
    },
    "request_context" : {
      "type" : "string"
    },
    "task_count" : {
      "type" : "integer",
      "format" : "int32"
    },
    "completed_task_count" : {
      "type" : "string"
    },
    "request_schedule" : {
      "type" : "string"
    },
    "end_time" : {
      "type" : "string"
    },
    "id" : {
      "type" : "string"
    },
    "aborted_task_count" : {
      "type" : "integer",
      "format" : "int32"
    },
    "failed_task_count" : {
      "type" : "integer",
      "format" : "int32"
    },
    "inputs" : {
      "type" : "string"
    },
    "progress_percent" : {
      "type" : "number",
      "format" : "double"
    },
    "queued_task_count" : {
      "type" : "integer",
      "format" : "int32"
    },
    "request_schedule_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "resource_filters" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RequestResourceFilter"
      }
    },
    "exclusive" : {
      "type" : "boolean",
      "default" : false
    },
    "cluster_name" : {
      "type" : "string"
    },
    "create_time" : {
      "type" : "integer",
      "format" : "int64"
    },
    "operation_level" : {
      "type" : "string"
    }
  }
};
    defs.RootServiceComponentConfigurationRequestInfo = {
  "type" : "object",
  "properties" : {
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "categoryName" : {
      "type" : "string"
    },
    "componentName" : {
      "type" : "string"
    },
    "serviceName" : {
      "type" : "string"
    }
  }
};
    defs.RootServiceComponentConfigurationRequestSwagger = {
  "type" : "object",
  "properties" : {
    "Configuration" : {
      "$ref" : "#/definitions/RootServiceComponentConfigurationRequestInfo"
    }
  }
};
    defs.RootServiceComponentConfigurationResponseInfo = {
  "type" : "object",
  "properties" : {
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    },
    "categoryName" : {
      "type" : "string"
    },
    "componentName" : {
      "type" : "string"
    },
    "serviceName" : {
      "type" : "string"
    }
  }
};
    defs.RootServiceComponentConfigurationResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Configuration" : {
      "$ref" : "#/definitions/RootServiceComponentConfigurationResponseInfo"
    }
  }
};
    defs.RootServiceComponentResponse = {
  "type" : "object",
  "properties" : {
    "service_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "component_version" : {
      "type" : "string"
    },
    "server_clock" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.RootServiceComponentResponseWrapper = {
  "type" : "object",
  "properties" : {
    "RootServiceComponents" : {
      "$ref" : "#/definitions/RootServiceComponentResponse"
    }
  }
};
    defs.RootServiceComponentWithHostComponentList = {
  "type" : "object",
  "properties" : {
    "hostComponents" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RootServiceHostComponentResponseWrapper"
      }
    },
    "RootServiceComponents" : {
      "$ref" : "#/definitions/RootServiceComponentResponse"
    }
  }
};
    defs.RootServiceHostComponentResponse = {
  "type" : "object",
  "properties" : {
    "service_name" : {
      "type" : "string"
    },
    "host_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "component_state" : {
      "type" : "string"
    },
    "component_version" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    }
  }
};
    defs.RootServiceHostComponentResponseWrapper = {
  "type" : "object",
  "properties" : {
    "RootServiceHostComponents" : {
      "$ref" : "#/definitions/RootServiceHostComponentResponse"
    }
  }
};
    defs.RootServiceResponse = {
  "type" : "object",
  "properties" : {
    "service_name" : {
      "type" : "string"
    }
  }
};
    defs.RootServiceResponseWithComponentList = {
  "type" : "object",
  "properties" : {
    "components" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/RootServiceComponentResponseWrapper"
      }
    },
    "RootService" : {
      "$ref" : "#/definitions/RootServiceResponse"
    }
  }
};
    defs.RootServiceResponseWrapper = {
  "type" : "object",
  "properties" : {
    "RootService" : {
      "$ref" : "#/definitions/RootServiceResponse"
    }
  }
};
    defs.ScheduleRequest = {
  "type" : "object",
  "properties" : {
    "startTime" : {
      "type" : "string"
    },
    "day_of_week" : {
      "type" : "string"
    },
    "month" : {
      "type" : "string"
    },
    "hours" : {
      "type" : "string"
    },
    "minutes" : {
      "type" : "string"
    },
    "year" : {
      "type" : "string"
    },
    "days_of_month" : {
      "type" : "string"
    },
    "endTime" : {
      "type" : "string"
    }
  }
};
    defs.ScheduleResponse = {
  "type" : "object",
  "properties" : {
    "start_time" : {
      "type" : "string"
    },
    "day_of_week" : {
      "type" : "string"
    },
    "month" : {
      "type" : "string"
    },
    "hours" : {
      "type" : "string"
    },
    "minutes" : {
      "type" : "string"
    },
    "year" : {
      "type" : "string"
    },
    "days_of_month" : {
      "type" : "string"
    },
    "end_time" : {
      "type" : "string"
    }
  }
};
    defs.Section = {
  "type" : "object",
  "properties" : {
    "subsections" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Subsection"
      }
    },
    "display-name" : {
      "type" : "string"
    },
    "row-index" : {
      "type" : "string"
    },
    "section-rows" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "column-span" : {
      "type" : "string"
    },
    "section-columns" : {
      "type" : "string"
    },
    "column-index" : {
      "type" : "string"
    },
    "row-span" : {
      "type" : "string"
    },
    "removed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.SecurityInfo = {
  "type" : "object",
  "properties" : {
    "kerberos_descriptor" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    },
    "kerberos_descriptor_reference" : {
      "type" : "string"
    },
    "security_type" : {
      "type" : "string",
      "enum" : [ "NONE", "KERBEROS" ]
    }
  }
};
    defs.ServiceComponentHostResponse = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    },
    "public_host_name" : {
      "type" : "string"
    },
    "host_name" : {
      "type" : "string"
    },
    "actual_configs" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/HostConfig"
      }
    },
    "state" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "desired_stack_id" : {
      "type" : "string"
    },
    "desired_repository_version" : {
      "type" : "string"
    },
    "desired_state" : {
      "type" : "string"
    },
    "stale_configs" : {
      "type" : "boolean",
      "default" : false
    },
    "reload_configs" : {
      "type" : "boolean",
      "default" : false
    },
    "maintenance_state" : {
      "type" : "string"
    },
    "upgrade_state" : {
      "type" : "string",
      "enum" : [ "NONE", "COMPLETE", "IN_PROGRESS", "FAILED", "VERSION_MISMATCH" ]
    }
  }
};
    defs.ServiceConfigVersionRequest = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "service_config_version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "createtime" : {
      "type" : "integer",
      "format" : "int64"
    },
    "appliedtime" : {
      "type" : "integer",
      "format" : "int64"
    },
    "user" : {
      "type" : "string"
    },
    "service_config_version_note" : {
      "type" : "string"
    },
    "is_current" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ServiceConfigVersionResponse = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "service_config_version" : {
      "type" : "integer",
      "format" : "int64"
    },
    "createtime" : {
      "type" : "integer",
      "format" : "int64"
    },
    "group_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "group_name" : {
      "type" : "string"
    },
    "user" : {
      "type" : "string"
    },
    "service_config_version_note" : {
      "type" : "string"
    },
    "stack_id" : {
      "type" : "string"
    },
    "is_current" : {
      "type" : "boolean",
      "default" : false
    },
    "configurations" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigurationResponse"
      }
    },
    "hosts" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "is_cluster_compatible" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ServiceRequest = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "state" : {
      "type" : "string"
    },
    "maintenance_state" : {
      "type" : "string"
    },
    "credential_store_enabled" : {
      "type" : "string"
    },
    "credential_store_supporteds" : {
      "type" : "string"
    },
    "desiredRepositoryVersionId" : {
      "type" : "integer",
      "format" : "int64"
    },
    "resolvedRepository" : {
      "$ref" : "#/definitions/RepositoryVersionEntity"
    }
  }
};
    defs.ServiceRequestSwagger = {
  "type" : "object",
  "properties" : {
    "ServiceInfo" : {
      "$ref" : "#/definitions/ServiceRequest"
    }
  }
};
    defs.ServiceResponse = {
  "type" : "object",
  "properties" : {
    "cluster_name" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "desiredRepositoryVersion" : {
      "type" : "string"
    },
    "desiredRepositoryVersionId" : {
      "type" : "integer",
      "format" : "int64"
    },
    "repositoryVersionState" : {
      "type" : "string",
      "enum" : [ "NOT_REQUIRED", "INSTALLING", "INSTALLED", "INSTALL_FAILED", "OUT_OF_SYNC", "CURRENT" ]
    },
    "state" : {
      "type" : "string"
    },
    "maintenance_state" : {
      "type" : "string"
    },
    "credential_store_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "credential_store_enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_desired" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_enabled" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ServiceResponseSwagger = {
  "type" : "object",
  "properties" : {
    "ServiceInfo" : {
      "$ref" : "#/definitions/ServiceResponse"
    }
  }
};
    defs.SettingRequest = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "setting_type" : {
      "type" : "string"
    },
    "content" : {
      "type" : "string"
    }
  }
};
    defs.SettingRequestSwagger = {
  "type" : "object",
  "properties" : {
    "Settings" : {
      "$ref" : "#/definitions/SettingRequest"
    }
  }
};
    defs.SettingResponse = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "setting_type" : {
      "type" : "string"
    },
    "content" : {
      "type" : "string"
    },
    "updated_by" : {
      "type" : "string"
    },
    "update_timestamp" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.SettingResponseWrapper = {
  "type" : "object",
  "properties" : {
    "Settings" : {
      "$ref" : "#/definitions/SettingResponse"
    }
  }
};
    defs.ShortRequestInfo = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "status" : {
      "type" : "string"
    }
  }
};
    defs.StackArtifactResponse = {
  "type" : "object",
  "properties" : {
    "Artifacts" : {
      "$ref" : "#/definitions/Artifacts"
    },
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.StackConfigurationDependencyResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "property_name" : {
      "type" : "string"
    },
    "dependency_name" : {
      "type" : "string"
    },
    "dependency_type" : {
      "type" : "string"
    }
  }
};
    defs.StackConfigurationDependencyResponseSwagger = {
  "type" : "object",
  "properties" : {
    "StackConfigurationDependency" : {
      "$ref" : "#/definitions/StackConfigurationDependencyResponse"
    }
  }
};
    defs.StackConfigurationResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "property_name" : {
      "type" : "string"
    },
    "property_value" : {
      "type" : "string"
    },
    "property_description" : {
      "type" : "string"
    },
    "property_display_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string"
    },
    "property_value_attributes" : {
      "$ref" : "#/definitions/ValueAttributesInfo"
    },
    "dependencies" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "$ref" : "#/definitions/PropertyDependencyInfo"
      }
    },
    "property_type" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string",
        "enum" : [ "PASSWORD", "USER", "UID", "GROUP", "GID", "TEXT", "ADDITIONAL_USER_PROPERTY", "NOT_MANAGED_HDFS_PATH", "VALUE_FROM_PROPERTY_FILE", "KERBEROS_PRINCIPAL" ]
      }
    }
  }
};
    defs.StackConfigurationResponseSwagger = {
  "type" : "object",
  "properties" : {
    "StackConfigurations" : {
      "$ref" : "#/definitions/StackConfigurationResponse"
    }
  }
};
    defs.StackEntity = {
  "type" : "object",
  "properties" : {
    "stackId" : {
      "type" : "integer",
      "format" : "int64"
    },
    "stackName" : {
      "type" : "string"
    },
    "stackVersion" : {
      "type" : "string"
    }
  }
};
    defs.StackId = {
  "type" : "object",
  "properties" : {
    "stackName" : {
      "type" : "string"
    },
    "stackVersion" : {
      "type" : "string"
    },
    "stackId" : {
      "type" : "string"
    }
  }
};
    defs.StackResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    }
  }
};
    defs.StackResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Stacks" : {
      "$ref" : "#/definitions/StackResponse"
    }
  }
};
    defs.StackServiceArtifactResponse = {
  "type" : "object",
  "properties" : {
    "Artifacts" : {
      "$ref" : "#/definitions/Artifacts"
    },
    "artifact_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "properties" : { }
      }
    }
  }
};
    defs.StackServiceComponentResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "component_name" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    },
    "component_category" : {
      "type" : "string"
    },
    "cardinality" : {
      "type" : "string"
    },
    "advertise_version" : {
      "type" : "boolean",
      "default" : false
    },
    "rollingRestartSupported" : {
      "type" : "boolean",
      "default" : false
    },
    "customCommands" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "custom_commands" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "recovery_enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "bulkCommandsDisplayName" : {
      "type" : "string"
    },
    "componentType" : {
      "type" : "string"
    },
    "is_master" : {
      "type" : "boolean",
      "default" : false
    },
    "is_client" : {
      "type" : "boolean",
      "default" : false
    },
    "bulk_commands_master_component_namen" : {
      "type" : "string"
    },
    "decommission_allowed" : {
      "type" : "boolean",
      "default" : false
    },
    "reassign_allowed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.StackServiceComponentResponseSwagger = {
  "type" : "object",
  "properties" : {
    "StackServiceComponents" : {
      "$ref" : "#/definitions/StackServiceComponentResponse"
    }
  }
};
    defs.StackServiceResponse = {
  "type" : "object",
  "properties" : {
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "service_type" : {
      "type" : "string"
    },
    "display_name" : {
      "type" : "string"
    },
    "user_name" : {
      "type" : "string"
    },
    "comments" : {
      "type" : "string"
    },
    "service_version" : {
      "type" : "string"
    },
    "selection" : {
      "type" : "string",
      "enum" : [ "DEFAULT", "TECH_PREVIEW", "MANDATORY", "DEPRECATED" ]
    },
    "service_check_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "custom_commands" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "config_types" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "additionalProperties" : {
            "type" : "string"
          }
        }
      }
    },
    "required_services" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "credential_store_supported" : {
      "type" : "boolean",
      "default" : false
    },
    "credential_store_enabled" : {
      "type" : "boolean",
      "default" : false
    },
    "credential_store_required" : {
      "type" : "boolean",
      "default" : false
    },
    "sso_integration_supported" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.StackServiceResponseSwagger = {
  "type" : "object",
  "properties" : {
    "StackServices" : {
      "$ref" : "#/definitions/StackServiceResponse"
    }
  }
};
    defs.StackVersionResponse = {
  "type" : "object",
  "properties" : {
    "min_jdk" : {
      "type" : "string"
    },
    "max_jdk" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "min_upgrade_version" : {
      "type" : "string"
    },
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "valid" : {
      "type" : "boolean",
      "default" : false
    },
    "parent_stack_version" : {
      "type" : "string"
    },
    "config_types" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "object",
        "additionalProperties" : {
          "type" : "object",
          "additionalProperties" : {
            "type" : "string"
          }
        }
      }
    },
    "upgrade_packs" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string"
      }
    },
    "stack-errors" : {
      "type" : "array",
      "items" : {
        "type" : "string"
      }
    }
  }
};
    defs.StackVersionResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Versions" : {
      "$ref" : "#/definitions/StackVersionResponse"
    }
  }
};
    defs.Subsection = {
  "type" : "object",
  "properties" : {
    "row-index" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "display-name" : {
      "type" : "string"
    },
    "column-span" : {
      "type" : "string"
    },
    "row-span" : {
      "type" : "string"
    },
    "column-index" : {
      "type" : "string"
    },
    "border" : {
      "type" : "string"
    },
    "left-vertical-splitter" : {
      "type" : "boolean",
      "default" : false
    },
    "depends-on" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigCondition"
      }
    },
    "subsection-tab" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/SubsectionTab"
      }
    },
    "removed" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.SubsectionTab = {
  "type" : "object",
  "properties" : {
    "name" : {
      "type" : "string"
    },
    "displayName" : {
      "type" : "string"
    },
    "dependsOn" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ConfigCondition"
      }
    }
  }
};
    defs.Tab = {
  "type" : "object",
  "properties" : {
    "display-name" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "layout" : {
      "$ref" : "#/definitions/TabLayout"
    }
  }
};
    defs.TabLayout = {
  "type" : "object",
  "properties" : {
    "tab-rows" : {
      "type" : "string"
    },
    "sections" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Section"
      }
    },
    "tab-columns" : {
      "type" : "string"
    }
  }
};
    defs.Theme = {
  "type" : "object",
  "properties" : {
    "description" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    },
    "configuration" : {
      "$ref" : "#/definitions/ThemeConfiguration"
    }
  }
};
    defs.ThemeConfiguration = {
  "type" : "object",
  "properties" : {
    "placement" : {
      "$ref" : "#/definitions/Placement"
    },
    "widgets" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/WidgetEntry"
      }
    },
    "layouts" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Layout"
      }
    }
  }
};
    defs.ThemeInfoResponse = {
  "type" : "object",
  "properties" : {
    "default" : {
      "type" : "boolean",
      "default" : false
    },
    "file_name" : {
      "type" : "string"
    },
    "stack_name" : {
      "type" : "string"
    },
    "stack_version" : {
      "type" : "string"
    },
    "service_name" : {
      "type" : "string"
    },
    "theme_data" : {
      "$ref" : "#/definitions/Theme"
    }
  }
};
    defs.ThemeResponse = {
  "type" : "object",
  "properties" : {
    "ThemeInfo" : {
      "$ref" : "#/definitions/ThemeInfoResponse"
    }
  }
};
    defs.Unit = {
  "type" : "object",
  "properties" : {
    "unit-name" : {
      "type" : "string"
    }
  }
};
    defs.UpdateUserInfo = {
  "type" : "object",
  "properties" : {
    "display_name" : {
      "type" : "string"
    },
    "password" : {
      "type" : "string"
    },
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "local_user_name" : {
      "type" : "string"
    },
    "old_password" : {
      "type" : "string"
    },
    "admin" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.UserAuthenticationSourceRequestCreateSwagger = {
  "type" : "object",
  "properties" : {
    "AuthenticationSourceInfo" : {
      "$ref" : "#/definitions/CreateUserAuthenticationSourceInfo"
    }
  }
};
    defs.UserAuthenticationSourceRequestUpdateInfo = {
  "type" : "object",
  "required" : [ "key" ],
  "properties" : {
    "key" : {
      "type" : "string"
    },
    "old_key" : {
      "type" : "string"
    }
  }
};
    defs.UserAuthenticationSourceRequestUpdateSwagger = {
  "type" : "object",
  "properties" : {
    "AuthenticationSourceInfo" : {
      "$ref" : "#/definitions/UserAuthenticationSourceRequestUpdateInfo"
    }
  }
};
    defs.UserAuthenticationSourceResponse = {
  "type" : "object",
  "required" : [ "authentication_type", "source_id", "user_name" ],
  "properties" : {
    "user_name" : {
      "type" : "string"
    },
    "source_id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "authentication_type" : {
      "type" : "string",
      "enum" : [ "LOCAL", "LDAP", "JWT", "PAM", "KERBEROS" ]
    },
    "key" : {
      "type" : "string"
    },
    "created" : {
      "type" : "string",
      "format" : "date-time"
    },
    "updated" : {
      "type" : "string",
      "format" : "date-time"
    }
  }
};
    defs.UserAuthenticationSourceResponseSwagger = {
  "type" : "object",
  "properties" : {
    "AuthenticationSourceInfo" : {
      "$ref" : "#/definitions/UserAuthenticationSourceResponse"
    }
  }
};
    defs.UserAuthorizationResponse = {
  "type" : "object",
  "required" : [ "AuthorizationInfo/user_name" ],
  "properties" : {
    "AuthorizationInfo/authorization_id" : {
      "type" : "string"
    },
    "AuthorizationInfo/authorization_name" : {
      "type" : "string"
    },
    "AuthorizationInfo/resource_type" : {
      "type" : "string"
    },
    "AuthorizationInfo/user_name" : {
      "type" : "string"
    },
    "AuthorizationInfo/cluster_name" : {
      "type" : "string"
    },
    "AuthorizationInfo/view_name" : {
      "type" : "string"
    },
    "AuthorizationInfo/view_version" : {
      "type" : "string"
    },
    "AuthorizationInfo/view_instance_name" : {
      "type" : "string"
    }
  }
};
    defs.UserGroupInfo = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "name" : {
      "type" : "string"
    }
  }
};
    defs.UserPrivilegeResponse = {
  "type" : "object",
  "required" : [ "PrivilegeInfo/user_name" ],
  "properties" : {
    "permission_label" : {
      "type" : "string"
    },
    "privilege_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "principal_type" : {
      "type" : "string",
      "enum" : [ "USER", "GROUP", "ROLE" ]
    },
    "principal_name" : {
      "type" : "string"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "AMBARI", "CLUSTER", "VIEW" ]
    },
    "cluster_name" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    },
    "PrivilegeInfo/user_name" : {
      "type" : "string"
    }
  }
};
    defs.UserRequestCreateUserSwagger = {
  "type" : "object",
  "properties" : {
    "Users" : {
      "$ref" : "#/definitions/CreateUserInfo"
    }
  }
};
    defs.UserRequestCreateUsersSwagger = {
  "type" : "object",
  "properties" : {
    "Users" : {
      "$ref" : "#/definitions/CreateUsersInfo"
    }
  }
};
    defs.UserRequestUpdateUserSwagger = {
  "type" : "object",
  "properties" : {
    "Users" : {
      "$ref" : "#/definitions/UpdateUserInfo"
    }
  }
};
    defs.UserResponse = {
  "type" : "object",
  "properties" : {
    "display_name" : {
      "type" : "string"
    },
    "user_type" : {
      "type" : "string",
      "enum" : [ "LOCAL", "LDAP", "JWT", "PAM", "KERBEROS" ]
    },
    "groups" : {
      "type" : "array",
      "uniqueItems" : true,
      "items" : {
        "type" : "string"
      }
    },
    "created" : {
      "type" : "string",
      "format" : "date-time"
    },
    "consecutive_failures" : {
      "type" : "integer",
      "format" : "int32"
    },
    "user_name" : {
      "type" : "string"
    },
    "active" : {
      "type" : "boolean",
      "default" : false
    },
    "admin" : {
      "type" : "boolean",
      "default" : false
    },
    "ldap_user" : {
      "type" : "boolean",
      "default" : false
    },
    "local_user_name" : {
      "type" : "string"
    }
  }
};
    defs.UserResponseSwagger = {
  "type" : "object",
  "properties" : {
    "Users" : {
      "$ref" : "#/definitions/UserResponse"
    }
  }
};
    defs.ValidationResult = {
  "type" : "object",
  "properties" : {
    "detail" : {
      "type" : "string"
    },
    "valid" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ValueAttributesInfo = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "maximum" : {
      "type" : "string"
    },
    "minimum" : {
      "type" : "string"
    },
    "unit" : {
      "type" : "string"
    },
    "delete" : {
      "type" : "string"
    },
    "visible" : {
      "type" : "boolean",
      "default" : false
    },
    "overridable" : {
      "type" : "boolean",
      "default" : false
    },
    "copy" : {
      "type" : "string"
    },
    "empty_value_valid" : {
      "type" : "boolean",
      "xml" : {
        "name" : "empty-value-valid"
      },
      "default" : false
    },
    "ui_only_property" : {
      "type" : "boolean",
      "xml" : {
        "name" : "ui-only-property"
      },
      "default" : false
    },
    "read_only" : {
      "type" : "boolean",
      "xml" : {
        "name" : "read-only"
      },
      "default" : false
    },
    "editable_only_at_install" : {
      "type" : "boolean",
      "xml" : {
        "name" : "editable-only-at-install"
      },
      "default" : false
    },
    "show_property_name" : {
      "type" : "boolean",
      "xml" : {
        "name" : "show-property-name"
      },
      "default" : false
    },
    "increment_step" : {
      "type" : "string",
      "xml" : {
        "name" : "increment-step"
      }
    },
    "entries" : {
      "type" : "array",
      "xml" : {
        "name" : "entries",
        "wrapped" : true
      },
      "items" : {
        "$ref" : "#/definitions/ValueEntryInfo"
      }
    },
    "hidden" : {
      "type" : "string"
    },
    "entries_editable" : {
      "type" : "boolean",
      "default" : false
    },
    "selection_cardinality" : {
      "type" : "string",
      "xml" : {
        "name" : "selection-cardinality"
      }
    },
    "property-file-name" : {
      "type" : "string"
    },
    "property-file-type" : {
      "type" : "string"
    },
    "user-group-entries" : {
      "type" : "array",
      "xml" : {
        "name" : "user-groups",
        "wrapped" : true
      },
      "items" : {
        "$ref" : "#/definitions/UserGroupInfo"
      }
    },
    "keystore" : {
      "type" : "boolean",
      "default" : false
    }
  }
};
    defs.ValueEntryInfo = {
  "type" : "object",
  "properties" : {
    "value" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    }
  }
};
    defs.VersionDefinitionXml = {
  "type" : "object",
  "properties" : {
    "release" : {
      "$ref" : "#/definitions/Release"
    },
    "repositoryInfo" : {
      "xml" : {
        "name" : "repository-info"
      },
      "$ref" : "#/definitions/RepositoryXml"
    },
    "xsdLocation" : {
      "type" : "string"
    },
    "stackDefault" : {
      "type" : "boolean",
      "default" : false
    }
  },
  "xml" : {
    "name" : "repository-version"
  }
};
    defs.ViewInfo = {
  "type" : "object",
  "properties" : {
    "view_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewInstanceResponse = {
  "type" : "object",
  "properties" : {
    "ViewInstanceInfo" : {
      "$ref" : "#/definitions/ViewInstanceResponseInfo"
    }
  }
};
    defs.ViewInstanceResponseInfo = {
  "type" : "object",
  "properties" : {
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "visible" : {
      "type" : "boolean",
      "default" : false
    },
    "icon_path" : {
      "type" : "string"
    },
    "icon64_path" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "instance_data" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "cluster_handle" : {
      "type" : "integer",
      "format" : "int32"
    },
    "cluster_type" : {
      "type" : "string",
      "enum" : [ "LOCAL_AMBARI", "REMOTE_AMBARI", "NONE" ]
    },
    "context_path" : {
      "type" : "string"
    },
    "static" : {
      "type" : "boolean",
      "default" : false
    },
    "short_url" : {
      "type" : "string"
    },
    "short_url_name" : {
      "type" : "string"
    },
    "validation_result" : {
      "$ref" : "#/definitions/ValidationResult"
    },
    "property_validation_results" : {
      "type" : "object",
      "additionalProperties" : {
        "$ref" : "#/definitions/ValidationResult"
      }
    }
  }
};
    defs.ViewPermissionInfo = {
  "type" : "object",
  "properties" : {
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "permission_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "resource_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewPermissionResponse = {
  "type" : "object",
  "properties" : {
    "PermissionInfo" : {
      "$ref" : "#/definitions/ViewPermissionInfo"
    }
  }
};
    defs.ViewPrivilegeResponse = {
  "type" : "object",
  "properties" : {
    "permission_label" : {
      "type" : "string"
    },
    "privilege_id" : {
      "type" : "integer",
      "format" : "int32"
    },
    "permission_name" : {
      "type" : "string"
    },
    "principal_type" : {
      "type" : "string",
      "enum" : [ "USER", "GROUP", "ROLE" ]
    },
    "principal_name" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    },
    "version" : {
      "type" : "string"
    },
    "instance_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewPrivilegeResponseWrapper = {
  "type" : "object",
  "properties" : {
    "PrivilegeInfo" : {
      "$ref" : "#/definitions/ViewPrivilegeResponse"
    }
  }
};
    defs.ViewPrivilegeService = {
  "type" : "object"
};
    defs.ViewResponse = {
  "type" : "object",
  "properties" : {
    "ViewInfo" : {
      "$ref" : "#/definitions/ViewInfo"
    }
  }
};
    defs.ViewUrlInfo = {
  "type" : "object",
  "properties" : {
    "url_name" : {
      "type" : "string"
    },
    "url_suffix" : {
      "type" : "string"
    },
    "view_instance_common_name" : {
      "type" : "string"
    },
    "view_instance_version" : {
      "type" : "string"
    },
    "view_instance_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewUrlResponseSwagger = {
  "type" : "object",
  "properties" : {
    "ViewUrlInfo" : {
      "$ref" : "#/definitions/ViewUrlInfo"
    }
  }
};
    defs.ViewVersionInfo = {
  "type" : "object",
  "properties" : {
    "archive" : {
      "type" : "string"
    },
    "build_number" : {
      "type" : "string"
    },
    "cluster_configurable" : {
      "type" : "boolean",
      "default" : false
    },
    "description" : {
      "type" : "string"
    },
    "label" : {
      "type" : "string"
    },
    "masker_class" : {
      "type" : "string"
    },
    "max_ambari_version" : {
      "type" : "string"
    },
    "min_ambari_version" : {
      "type" : "string"
    },
    "parameters" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/ParameterConfig"
      }
    },
    "status" : {
      "type" : "string",
      "enum" : [ "PENDING", "DEPLOYING", "DEPLOYED", "ERROR" ]
    },
    "status_detail" : {
      "type" : "string"
    },
    "system" : {
      "type" : "boolean",
      "default" : false
    },
    "version" : {
      "type" : "string"
    },
    "view_name" : {
      "type" : "string"
    }
  }
};
    defs.ViewVersionResponse = {
  "type" : "object",
  "properties" : {
    "ViewVersionInfo" : {
      "$ref" : "#/definitions/ViewVersionInfo"
    }
  }
};
    defs.Widget = {
  "type" : "object",
  "properties" : {
    "type" : {
      "type" : "string"
    },
    "units" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Unit"
      }
    },
    "required-properties" : {
      "type" : "object",
      "additionalProperties" : {
        "type" : "string"
      }
    },
    "display-name" : {
      "type" : "string"
    }
  }
};
    defs.WidgetEntry = {
  "type" : "object",
  "properties" : {
    "config" : {
      "type" : "string"
    },
    "widget" : {
      "$ref" : "#/definitions/Widget"
    }
  }
};
    defs.WidgetLayoutIdWrapper = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    }
  }
};
    defs.WidgetResponse = {
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer",
      "format" : "int64"
    },
    "widgetName" : {
      "type" : "string"
    },
    "widgetType" : {
      "type" : "string"
    },
    "metrics" : {
      "type" : "string"
    },
    "timeCreated" : {
      "type" : "integer",
      "format" : "int64"
    },
    "author" : {
      "type" : "string"
    },
    "description" : {
      "type" : "string"
    },
    "displayName" : {
      "type" : "string"
    },
    "scope" : {
      "type" : "string"
    },
    "widgetValues" : {
      "type" : "string"
    },
    "properties" : {
      "type" : "string"
    },
    "clusterName" : {
      "type" : "string"
    },
    "tag" : {
      "type" : "string"
    }
  }
};
  </script>

  <div class="container-fluid">
    <div class="row-fluid">
      <div id="sidenav" class="span2">
        <nav id="scrollingNav">
          <ul class="sidenav nav nav-list">
            <!-- Logo Area -->
              <!--<div style="width: 80%; background-color: #4c8eca; color: white; padding: 20px; text-align: center; margin-bottom: 20px; ">

              API Docs 2

              </div>
            -->
            <li class="nav-fixed nav-header active" data-group="_"><a href="#api-_">API Summary</a></li>

                  <li class="nav-header" data-group="Actions"><a href="#api-Actions">API Methods - Actions</a></li>
                    <li data-group="Actions" data-name="actionServiceCreateActionDefinition" class="">
                      <a href="#api-Actions-actionServiceCreateActionDefinition">actionServiceCreateActionDefinition</a>
                    </li>
                    <li data-group="Actions" data-name="actionServiceDeleteActionDefinition" class="">
                      <a href="#api-Actions-actionServiceDeleteActionDefinition">actionServiceDeleteActionDefinition</a>
                    </li>
                    <li data-group="Actions" data-name="actionServiceGetActionDefinition" class="">
                      <a href="#api-Actions-actionServiceGetActionDefinition">actionServiceGetActionDefinition</a>
                    </li>
                    <li data-group="Actions" data-name="actionServiceGetActionDefinitions" class="">
                      <a href="#api-Actions-actionServiceGetActionDefinitions">actionServiceGetActionDefinitions</a>
                    </li>
                    <li data-group="Actions" data-name="actionServiceUpdateActionDefinition" class="">
                      <a href="#api-Actions-actionServiceUpdateActionDefinition">actionServiceUpdateActionDefinition</a>
                    </li>
                  <li class="nav-header" data-group="Alerts"><a href="#api-Alerts">API Methods - Alerts</a></li>
                    <li data-group="Alerts" data-name="createTarget" class="">
                      <a href="#api-Alerts-createTarget">createTarget</a>
                    </li>
                    <li data-group="Alerts" data-name="deleteTarget" class="">
                      <a href="#api-Alerts-deleteTarget">deleteTarget</a>
                    </li>
                    <li data-group="Alerts" data-name="getTarget" class="">
                      <a href="#api-Alerts-getTarget">getTarget</a>
                    </li>
                    <li data-group="Alerts" data-name="getTargets" class="">
                      <a href="#api-Alerts-getTargets">getTargets</a>
                    </li>
                    <li data-group="Alerts" data-name="updateTarget" class="">
                      <a href="#api-Alerts-updateTarget">updateTarget</a>
                    </li>
                  <li class="nav-header" data-group="Blueprints"><a href="#api-Blueprints">API Methods - Blueprints</a></li>
                    <li data-group="Blueprints" data-name="blueprintServiceCreateBlueprint" class="">
                      <a href="#api-Blueprints-blueprintServiceCreateBlueprint">blueprintServiceCreateBlueprint</a>
                    </li>
                    <li data-group="Blueprints" data-name="blueprintServiceDeleteBlueprint" class="">
                      <a href="#api-Blueprints-blueprintServiceDeleteBlueprint">blueprintServiceDeleteBlueprint</a>
                    </li>
                    <li data-group="Blueprints" data-name="blueprintServiceDeleteBlueprints" class="">
                      <a href="#api-Blueprints-blueprintServiceDeleteBlueprints">blueprintServiceDeleteBlueprints</a>
                    </li>
                    <li data-group="Blueprints" data-name="blueprintServiceGetBlueprint" class="">
                      <a href="#api-Blueprints-blueprintServiceGetBlueprint">blueprintServiceGetBlueprint</a>
                    </li>
                    <li data-group="Blueprints" data-name="blueprintServiceGetBlueprints" class="">
                      <a href="#api-Blueprints-blueprintServiceGetBlueprints">blueprintServiceGetBlueprints</a>
                    </li>
                  <li class="nav-header" data-group="ClusterServices"><a href="#api-ClusterServices">API Methods - ClusterServices</a></li>
                    <li data-group="ClusterServices" data-name="serviceServiceCreateArtifact" class="">
                      <a href="#api-ClusterServices-serviceServiceCreateArtifact">serviceServiceCreateArtifact</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceCreateServices" class="">
                      <a href="#api-ClusterServices-serviceServiceCreateServices">serviceServiceCreateServices</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceDeleteArtifact" class="">
                      <a href="#api-ClusterServices-serviceServiceDeleteArtifact">serviceServiceDeleteArtifact</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceDeleteArtifacts" class="">
                      <a href="#api-ClusterServices-serviceServiceDeleteArtifacts">serviceServiceDeleteArtifacts</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceDeleteService" class="">
                      <a href="#api-ClusterServices-serviceServiceDeleteService">serviceServiceDeleteService</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceGetArtifact" class="">
                      <a href="#api-ClusterServices-serviceServiceGetArtifact">serviceServiceGetArtifact</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceGetArtifacts" class="">
                      <a href="#api-ClusterServices-serviceServiceGetArtifacts">serviceServiceGetArtifacts</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceGetService" class="">
                      <a href="#api-ClusterServices-serviceServiceGetService">serviceServiceGetService</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceGetServices" class="">
                      <a href="#api-ClusterServices-serviceServiceGetServices">serviceServiceGetServices</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceUpdateArtifact" class="">
                      <a href="#api-ClusterServices-serviceServiceUpdateArtifact">serviceServiceUpdateArtifact</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceUpdateArtifacts" class="">
                      <a href="#api-ClusterServices-serviceServiceUpdateArtifacts">serviceServiceUpdateArtifacts</a>
                    </li>
                    <li data-group="ClusterServices" data-name="serviceServiceUpdateService" class="">
                      <a href="#api-ClusterServices-serviceServiceUpdateService">serviceServiceUpdateService</a>
                    </li>
                  <li class="nav-header" data-group="Clusters"><a href="#api-Clusters">API Methods - Clusters</a></li>
                    <li data-group="Clusters" data-name="createCluster" class="">
                      <a href="#api-Clusters-createCluster">createCluster</a>
                    </li>
                    <li data-group="Clusters" data-name="createClusterArtifact" class="">
                      <a href="#api-Clusters-createClusterArtifact">createClusterArtifact</a>
                    </li>
                    <li data-group="Clusters" data-name="deleteCluster" class="">
                      <a href="#api-Clusters-deleteCluster">deleteCluster</a>
                    </li>
                    <li data-group="Clusters" data-name="deleteClusterArtifact" class="">
                      <a href="#api-Clusters-deleteClusterArtifact">deleteClusterArtifact</a>
                    </li>
                    <li data-group="Clusters" data-name="deleteClusterArtifacts" class="">
                      <a href="#api-Clusters-deleteClusterArtifacts">deleteClusterArtifacts</a>
                    </li>
                    <li data-group="Clusters" data-name="getCluster" class="">
                      <a href="#api-Clusters-getCluster">getCluster</a>
                    </li>
                    <li data-group="Clusters" data-name="getClusterArtifact" class="">
                      <a href="#api-Clusters-getClusterArtifact">getClusterArtifact</a>
                    </li>
                    <li data-group="Clusters" data-name="getClusterArtifacts" class="">
                      <a href="#api-Clusters-getClusterArtifacts">getClusterArtifacts</a>
                    </li>
                    <li data-group="Clusters" data-name="getClusters" class="">
                      <a href="#api-Clusters-getClusters">getClusters</a>
                    </li>
                    <li data-group="Clusters" data-name="updateCluster" class="">
                      <a href="#api-Clusters-updateCluster">updateCluster</a>
                    </li>
                    <li data-group="Clusters" data-name="updateClusterArtifact" class="">
                      <a href="#api-Clusters-updateClusterArtifact">updateClusterArtifact</a>
                    </li>
                    <li data-group="Clusters" data-name="updateClusterArtifacts" class="">
                      <a href="#api-Clusters-updateClusterArtifacts">updateClusterArtifacts</a>
                    </li>
                  <li class="nav-header" data-group="ConfigGroups"><a href="#api-ConfigGroups">API Methods - ConfigGroups</a></li>
                    <li data-group="ConfigGroups" data-name="createConfigGroup" class="">
                      <a href="#api-ConfigGroups-createConfigGroup">createConfigGroup</a>
                    </li>
                    <li data-group="ConfigGroups" data-name="deleteConfigGroup" class="">
                      <a href="#api-ConfigGroups-deleteConfigGroup">deleteConfigGroup</a>
                    </li>
                    <li data-group="ConfigGroups" data-name="getConfigGroup" class="">
                      <a href="#api-ConfigGroups-getConfigGroup">getConfigGroup</a>
                    </li>
                    <li data-group="ConfigGroups" data-name="getConfigGroups" class="">
                      <a href="#api-ConfigGroups-getConfigGroups">getConfigGroups</a>
                    </li>
                    <li data-group="ConfigGroups" data-name="updateConfigGroup" class="">
                      <a href="#api-ConfigGroups-updateConfigGroup">updateConfigGroup</a>
                    </li>
                  <li class="nav-header" data-group="Configurations"><a href="#api-Configurations">API Methods - Configurations</a></li>
                    <li data-group="Configurations" data-name="createConfigurations" class="">
                      <a href="#api-Configurations-createConfigurations">createConfigurations</a>
                    </li>
                    <li data-group="Configurations" data-name="getConfigurations" class="">
                      <a href="#api-Configurations-getConfigurations">getConfigurations</a>
                    </li>
                    <li data-group="Configurations" data-name="getServiceConfigVersions" class="">
                      <a href="#api-Configurations-getServiceConfigVersions">getServiceConfigVersions</a>
                    </li>
                  <li class="nav-header" data-group="Groups"><a href="#api-Groups">API Methods - Groups</a></li>
                    <li data-group="Groups" data-name="groupPrivilegeServiceGetPrivilege" class="">
                      <a href="#api-Groups-groupPrivilegeServiceGetPrivilege">groupPrivilegeServiceGetPrivilege</a>
                    </li>
                    <li data-group="Groups" data-name="groupPrivilegeServiceGetPrivileges" class="">
                      <a href="#api-Groups-groupPrivilegeServiceGetPrivileges">groupPrivilegeServiceGetPrivileges</a>
                    </li>
                    <li data-group="Groups" data-name="groupServiceCreateGroup" class="">
                      <a href="#api-Groups-groupServiceCreateGroup">groupServiceCreateGroup</a>
                    </li>
                    <li data-group="Groups" data-name="groupServiceDeleteGroup" class="">
                      <a href="#api-Groups-groupServiceDeleteGroup">groupServiceDeleteGroup</a>
                    </li>
                    <li data-group="Groups" data-name="groupServiceGetGroup" class="">
                      <a href="#api-Groups-groupServiceGetGroup">groupServiceGetGroup</a>
                    </li>
                    <li data-group="Groups" data-name="groupServiceGetGroups" class="">
                      <a href="#api-Groups-groupServiceGetGroups">groupServiceGetGroups</a>
                    </li>
                    <li data-group="Groups" data-name="memberServiceDeleteMember" class="">
                      <a href="#api-Groups-memberServiceDeleteMember">memberServiceDeleteMember</a>
                    </li>
                    <li data-group="Groups" data-name="memberServiceGetMember" class="">
                      <a href="#api-Groups-memberServiceGetMember">memberServiceGetMember</a>
                    </li>
                    <li data-group="Groups" data-name="memberServiceGetMembers" class="">
                      <a href="#api-Groups-memberServiceGetMembers">memberServiceGetMembers</a>
                    </li>
                    <li data-group="Groups" data-name="memberServiceUpdateMembers" class="">
                      <a href="#api-Groups-memberServiceUpdateMembers">memberServiceUpdateMembers</a>
                    </li>
                  <li class="nav-header" data-group="HostComponents"><a href="#api-HostComponents">API Methods - HostComponents</a></li>
                    <li data-group="HostComponents" data-name="createHostComponent" class="">
                      <a href="#api-HostComponents-createHostComponent">createHostComponent</a>
                    </li>
                    <li data-group="HostComponents" data-name="deleteHostComponent" class="">
                      <a href="#api-HostComponents-deleteHostComponent">deleteHostComponent</a>
                    </li>
                    <li data-group="HostComponents" data-name="deleteHostComponents" class="">
                      <a href="#api-HostComponents-deleteHostComponents">deleteHostComponents</a>
                    </li>
                    <li data-group="HostComponents" data-name="getHostComponent" class="">
                      <a href="#api-HostComponents-getHostComponent">getHostComponent</a>
                    </li>
                    <li data-group="HostComponents" data-name="getHostComponents" class="">
                      <a href="#api-HostComponents-getHostComponents">getHostComponents</a>
                    </li>
                    <li data-group="HostComponents" data-name="getProcesses" class="">
                      <a href="#api-HostComponents-getProcesses">getProcesses</a>
                    </li>
                    <li data-group="HostComponents" data-name="updateHostComponent" class="">
                      <a href="#api-HostComponents-updateHostComponent">updateHostComponent</a>
                    </li>
                  <li class="nav-header" data-group="Hosts"><a href="#api-Hosts">API Methods - Hosts</a></li>
                    <li data-group="Hosts" data-name="createHost" class="">
                      <a href="#api-Hosts-createHost">createHost</a>
                    </li>
                    <li data-group="Hosts" data-name="createHosts" class="">
                      <a href="#api-Hosts-createHosts">createHosts</a>
                    </li>
                    <li data-group="Hosts" data-name="deleteHost" class="">
                      <a href="#api-Hosts-deleteHost">deleteHost</a>
                    </li>
                    <li data-group="Hosts" data-name="deleteHosts" class="">
                      <a href="#api-Hosts-deleteHosts">deleteHosts</a>
                    </li>
                    <li data-group="Hosts" data-name="getHost" class="">
                      <a href="#api-Hosts-getHost">getHost</a>
                    </li>
                    <li data-group="Hosts" data-name="getHosts" class="">
                      <a href="#api-Hosts-getHosts">getHosts</a>
                    </li>
                    <li data-group="Hosts" data-name="updateHost" class="">
                      <a href="#api-Hosts-updateHost">updateHost</a>
                    </li>
                    <li data-group="Hosts" data-name="updateHosts" class="">
                      <a href="#api-Hosts-updateHosts">updateHosts</a>
                    </li>
                  <li class="nav-header" data-group="RequestSchedules"><a href="#api-RequestSchedules">API Methods - RequestSchedules</a></li>
                    <li data-group="RequestSchedules" data-name="createRequestSchedule" class="">
                      <a href="#api-RequestSchedules-createRequestSchedule">createRequestSchedule</a>
                    </li>
                    <li data-group="RequestSchedules" data-name="deleteRequestSchedule" class="">
                      <a href="#api-RequestSchedules-deleteRequestSchedule">deleteRequestSchedule</a>
                    </li>
                    <li data-group="RequestSchedules" data-name="getRequestSchedule" class="">
                      <a href="#api-RequestSchedules-getRequestSchedule">getRequestSchedule</a>
                    </li>
                    <li data-group="RequestSchedules" data-name="getRequestSchedules" class="">
                      <a href="#api-RequestSchedules-getRequestSchedules">getRequestSchedules</a>
                    </li>
                  <li class="nav-header" data-group="Requests"><a href="#api-Requests">API Methods - Requests</a></li>
                    <li data-group="Requests" data-name="requestServiceCreateRequests" class="">
                      <a href="#api-Requests-requestServiceCreateRequests">requestServiceCreateRequests</a>
                    </li>
                    <li data-group="Requests" data-name="requestServiceGetRequest" class="">
                      <a href="#api-Requests-requestServiceGetRequest">requestServiceGetRequest</a>
                    </li>
                    <li data-group="Requests" data-name="requestServiceGetRequests" class="">
                      <a href="#api-Requests-requestServiceGetRequests">requestServiceGetRequests</a>
                    </li>
                    <li data-group="Requests" data-name="requestServiceUpdateRequests" class="">
                      <a href="#api-Requests-requestServiceUpdateRequests">requestServiceUpdateRequests</a>
                    </li>
                  <li class="nav-header" data-group="RootServiceConfigurations"><a href="#api-RootServiceConfigurations">API Methods - RootServiceConfigurations</a></li>
                    <li data-group="RootServiceConfigurations" data-name="rootServiceComponentConfigurationServiceDeleteConfiguration" class="">
                      <a href="#api-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration">rootServiceComponentConfigurationServiceDeleteConfiguration</a>
                    </li>
                    <li data-group="RootServiceConfigurations" data-name="rootServiceComponentConfigurationServiceGetConfiguration" class="">
                      <a href="#api-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration">rootServiceComponentConfigurationServiceGetConfiguration</a>
                    </li>
                    <li data-group="RootServiceConfigurations" data-name="rootServiceComponentConfigurationServiceUpdateConfiguration" class="">
                      <a href="#api-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration">rootServiceComponentConfigurationServiceUpdateConfiguration</a>
                    </li>
                  <li class="nav-header" data-group="Services"><a href="#api-Services">API Methods - Services</a></li>
                    <li data-group="Services" data-name="getRootHost" class="">
                      <a href="#api-Services-getRootHost">getRootHost</a>
                    </li>
                    <li data-group="Services" data-name="getRootHosts" class="">
                      <a href="#api-Services-getRootHosts">getRootHosts</a>
                    </li>
                    <li data-group="Services" data-name="getRootService" class="">
                      <a href="#api-Services-getRootService">getRootService</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceComponent" class="">
                      <a href="#api-Services-getRootServiceComponent">getRootServiceComponent</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceComponentHosts" class="">
                      <a href="#api-Services-getRootServiceComponentHosts">getRootServiceComponentHosts</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceComponents" class="">
                      <a href="#api-Services-getRootServiceComponents">getRootServiceComponents</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceHostComponent" class="">
                      <a href="#api-Services-getRootServiceHostComponent">getRootServiceHostComponent</a>
                    </li>
                    <li data-group="Services" data-name="getRootServiceHostComponents" class="">
                      <a href="#api-Services-getRootServiceHostComponents">getRootServiceHostComponents</a>
                    </li>
                    <li data-group="Services" data-name="getRootServices" class="">
                      <a href="#api-Services-getRootServices">getRootServices</a>
                    </li>
                  <li class="nav-header" data-group="Settings"><a href="#api-Settings">API Methods - Settings</a></li>
                    <li data-group="Settings" data-name="createSetting" class="">
                      <a href="#api-Settings-createSetting">createSetting</a>
                    </li>
                    <li data-group="Settings" data-name="deleteSetting" class="">
                      <a href="#api-Settings-deleteSetting">deleteSetting</a>
                    </li>
                    <li data-group="Settings" data-name="getSetting" class="">
                      <a href="#api-Settings-getSetting">getSetting</a>
                    </li>
                    <li data-group="Settings" data-name="getSettings" class="">
                      <a href="#api-Settings-getSettings">getSettings</a>
                    </li>
                    <li data-group="Settings" data-name="updateSetting" class="">
                      <a href="#api-Settings-updateSetting">updateSetting</a>
                    </li>
                  <li class="nav-header" data-group="Stacks"><a href="#api-Stacks">API Methods - Stacks</a></li>
                    <li data-group="Stacks" data-name="stacksServiceGetServiceComponent" class="">
                      <a href="#api-Stacks-stacksServiceGetServiceComponent">stacksServiceGetServiceComponent</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetServiceComponentDependencies" class="">
                      <a href="#api-Stacks-stacksServiceGetServiceComponentDependencies">stacksServiceGetServiceComponentDependencies</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetServiceComponentDependency" class="">
                      <a href="#api-Stacks-stacksServiceGetServiceComponentDependency">stacksServiceGetServiceComponentDependency</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetServiceComponents" class="">
                      <a href="#api-Stacks-stacksServiceGetServiceComponents">stacksServiceGetServiceComponents</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStack" class="">
                      <a href="#api-Stacks-stacksServiceGetStack">stacksServiceGetStack</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackArtifact" class="">
                      <a href="#api-Stacks-stacksServiceGetStackArtifact">stacksServiceGetStackArtifact</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackArtifacts" class="">
                      <a href="#api-Stacks-stacksServiceGetStackArtifacts">stacksServiceGetStackArtifacts</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackConfiguration" class="">
                      <a href="#api-Stacks-stacksServiceGetStackConfiguration">stacksServiceGetStackConfiguration</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackConfigurationDependencies" class="">
                      <a href="#api-Stacks-stacksServiceGetStackConfigurationDependencies">stacksServiceGetStackConfigurationDependencies</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackConfigurations" class="">
                      <a href="#api-Stacks-stacksServiceGetStackConfigurations">stacksServiceGetStackConfigurations</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackLevelConfiguration" class="">
                      <a href="#api-Stacks-stacksServiceGetStackLevelConfiguration">stacksServiceGetStackLevelConfiguration</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackLevelConfigurations" class="">
                      <a href="#api-Stacks-stacksServiceGetStackLevelConfigurations">stacksServiceGetStackLevelConfigurations</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackService" class="">
                      <a href="#api-Stacks-stacksServiceGetStackService">stacksServiceGetStackService</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceArtifact" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceArtifact">stacksServiceGetStackServiceArtifact</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceArtifacts" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceArtifacts">stacksServiceGetStackServiceArtifacts</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceQuickLinksConfiguration" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration">stacksServiceGetStackServiceQuickLinksConfiguration</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceQuickLinksConfigurations" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations">stacksServiceGetStackServiceQuickLinksConfigurations</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceTheme" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceTheme">stacksServiceGetStackServiceTheme</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServiceThemes" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServiceThemes">stacksServiceGetStackServiceThemes</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackServices" class="">
                      <a href="#api-Stacks-stacksServiceGetStackServices">stacksServiceGetStackServices</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackVersion" class="">
                      <a href="#api-Stacks-stacksServiceGetStackVersion">stacksServiceGetStackVersion</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackVersionLinks" class="">
                      <a href="#api-Stacks-stacksServiceGetStackVersionLinks">stacksServiceGetStackVersionLinks</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStackVersions" class="">
                      <a href="#api-Stacks-stacksServiceGetStackVersions">stacksServiceGetStackVersions</a>
                    </li>
                    <li data-group="Stacks" data-name="stacksServiceGetStacks" class="">
                      <a href="#api-Stacks-stacksServiceGetStacks">stacksServiceGetStacks</a>
                    </li>
                  <li class="nav-header" data-group="UserAuthenticationSources"><a href="#api-UserAuthenticationSources">API Methods - UserAuthenticationSources</a></li>
                    <li data-group="UserAuthenticationSources" data-name="createAuthenticationSources" class="">
                      <a href="#api-UserAuthenticationSources-createAuthenticationSources">createAuthenticationSources</a>
                    </li>
                    <li data-group="UserAuthenticationSources" data-name="deleteAuthenticationSource" class="">
                      <a href="#api-UserAuthenticationSources-deleteAuthenticationSource">deleteAuthenticationSource</a>
                    </li>
                    <li data-group="UserAuthenticationSources" data-name="getAuthenticationSource" class="">
                      <a href="#api-UserAuthenticationSources-getAuthenticationSource">getAuthenticationSource</a>
                    </li>
                    <li data-group="UserAuthenticationSources" data-name="getAuthenticationSources" class="">
                      <a href="#api-UserAuthenticationSources-getAuthenticationSources">getAuthenticationSources</a>
                    </li>
                    <li data-group="UserAuthenticationSources" data-name="updateAuthenticationSource" class="">
                      <a href="#api-UserAuthenticationSources-updateAuthenticationSource">updateAuthenticationSource</a>
                    </li>
                  <li class="nav-header" data-group="Users"><a href="#api-Users">API Methods - Users</a></li>
                    <li data-group="Users" data-name="activeWidgetLayoutServiceGetServices" class="">
                      <a href="#api-Users-activeWidgetLayoutServiceGetServices">activeWidgetLayoutServiceGetServices</a>
                    </li>
                    <li data-group="Users" data-name="activeWidgetLayoutServiceUpdateServices" class="">
                      <a href="#api-Users-activeWidgetLayoutServiceUpdateServices">activeWidgetLayoutServiceUpdateServices</a>
                    </li>
                    <li data-group="Users" data-name="createUser" class="">
                      <a href="#api-Users-createUser">createUser</a>
                    </li>
                    <li data-group="Users" data-name="createUsers" class="">
                      <a href="#api-Users-createUsers">createUsers</a>
                    </li>
                    <li data-group="Users" data-name="deleteUser" class="">
                      <a href="#api-Users-deleteUser">deleteUser</a>
                    </li>
                    <li data-group="Users" data-name="getUser" class="">
                      <a href="#api-Users-getUser">getUser</a>
                    </li>
                    <li data-group="Users" data-name="getUsers" class="">
                      <a href="#api-Users-getUsers">getUsers</a>
                    </li>
                    <li data-group="Users" data-name="updateUser" class="">
                      <a href="#api-Users-updateUser">updateUser</a>
                    </li>
                    <li data-group="Users" data-name="userAuthorizationServiceGetAuthorization" class="">
                      <a href="#api-Users-userAuthorizationServiceGetAuthorization">userAuthorizationServiceGetAuthorization</a>
                    </li>
                    <li data-group="Users" data-name="userAuthorizationServiceGetAuthorizations" class="">
                      <a href="#api-Users-userAuthorizationServiceGetAuthorizations">userAuthorizationServiceGetAuthorizations</a>
                    </li>
                    <li data-group="Users" data-name="userPrivilegeServiceGetPrivilege" class="">
                      <a href="#api-Users-userPrivilegeServiceGetPrivilege">userPrivilegeServiceGetPrivilege</a>
                    </li>
                    <li data-group="Users" data-name="userPrivilegeServiceGetPrivileges" class="">
                      <a href="#api-Users-userPrivilegeServiceGetPrivileges">userPrivilegeServiceGetPrivileges</a>
                    </li>
                  <li class="nav-header" data-group="Views"><a href="#api-Views">API Methods - Views</a></li>
                    <li data-group="Views" data-name="createPrivilege" class="">
                      <a href="#api-Views-createPrivilege">createPrivilege</a>
                    </li>
                    <li data-group="Views" data-name="createService" class="">
                      <a href="#api-Views-createService">createService</a>
                    </li>
                    <li data-group="Views" data-name="createServices" class="">
                      <a href="#api-Views-createServices">createServices</a>
                    </li>
                    <li data-group="Views" data-name="createUrl" class="">
                      <a href="#api-Views-createUrl">createUrl</a>
                    </li>
                    <li data-group="Views" data-name="deletePrivilege" class="">
                      <a href="#api-Views-deletePrivilege">deletePrivilege</a>
                    </li>
                    <li data-group="Views" data-name="deletePrivileges" class="">
                      <a href="#api-Views-deletePrivileges">deletePrivileges</a>
                    </li>
                    <li data-group="Views" data-name="deleteService" class="">
                      <a href="#api-Views-deleteService">deleteService</a>
                    </li>
                    <li data-group="Views" data-name="deleteUrl" class="">
                      <a href="#api-Views-deleteUrl">deleteUrl</a>
                    </li>
                    <li data-group="Views" data-name="getPermission" class="">
                      <a href="#api-Views-getPermission">getPermission</a>
                    </li>
                    <li data-group="Views" data-name="getPermissions" class="">
                      <a href="#api-Views-getPermissions">getPermissions</a>
                    </li>
                    <li data-group="Views" data-name="getPrivilege" class="">
                      <a href="#api-Views-getPrivilege">getPrivilege</a>
                    </li>
                    <li data-group="Views" data-name="getPrivileges" class="">
                      <a href="#api-Views-getPrivileges">getPrivileges</a>
                    </li>
                    <li data-group="Views" data-name="getService" class="">
                      <a href="#api-Views-getService">getService</a>
                    </li>
                    <li data-group="Views" data-name="getServices" class="">
                      <a href="#api-Views-getServices">getServices</a>
                    </li>
                    <li data-group="Views" data-name="getVersion" class="">
                      <a href="#api-Views-getVersion">getVersion</a>
                    </li>
                    <li data-group="Views" data-name="getVersions" class="">
                      <a href="#api-Views-getVersions">getVersions</a>
                    </li>
                    <li data-group="Views" data-name="getView" class="">
                      <a href="#api-Views-getView">getView</a>
                    </li>
                    <li data-group="Views" data-name="getViewUrl" class="">
                      <a href="#api-Views-getViewUrl">getViewUrl</a>
                    </li>
                    <li data-group="Views" data-name="getViewUrls" class="">
                      <a href="#api-Views-getViewUrls">getViewUrls</a>
                    </li>
                    <li data-group="Views" data-name="getViews" class="">
                      <a href="#api-Views-getViews">getViews</a>
                    </li>
                    <li data-group="Views" data-name="migrateData" class="">
                      <a href="#api-Views-migrateData">migrateData</a>
                    </li>
                    <li data-group="Views" data-name="updatePrivileges" class="">
                      <a href="#api-Views-updatePrivileges">updatePrivileges</a>
                    </li>
                    <li data-group="Views" data-name="updateService" class="">
                      <a href="#api-Views-updateService">updateService</a>
                    </li>
                    <li data-group="Views" data-name="updateServices" class="">
                      <a href="#api-Views-updateServices">updateServices</a>
                    </li>
                    <li data-group="Views" data-name="updateUrl" class="">
                      <a href="#api-Views-updateUrl">updateUrl</a>
                    </li>
          </ul>
        </nav>
      </div>
      <div id="content">
        <div id="project">
          <div class="pull-left">
            <h1>Swagger spec for Ambari REST API</h1>
          </div>
          <div class="clearfix"></div>
        </div>
        <div id="header">
          <div id="api-_">
            <h2 id="welcome-to-apidoc">API and SDK Documentation</h2>
              <div class="app-desc">Version: v1</div>
            <hr>
            <p class="marked">Ambari REST APIs has inherent support for querying, sorting and pagination</p>
          </div>
        </div>
        <div id="sections">
                <section id="api-Actions">
                  <h1>Actions</h1>
                    <div id="api-Actions-actionServiceCreateActionDefinition">
                      <article id="api-Actions-actionServiceCreateActionDefinition-0" data-group="User" data-name="actionServiceCreateActionDefinition" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceCreateActionDefinition</h1>
                          <p>Creates an action definition - Currently Not Supported</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/actions/{actionName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceCreateActionDefinition-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceCreateActionDefinition-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceCreateActionDefinition-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/actions/{actionName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        ActionRequestSwagger body = ; // ActionRequestSwagger | 
        try {
            apiInstance.actionServiceCreateActionDefinition(actionName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceCreateActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        ActionRequestSwagger body = ; // ActionRequestSwagger | 
        try {
            apiInstance.actionServiceCreateActionDefinition(actionName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceCreateActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *actionName = actionName_example; // 
ActionRequestSwagger *body = ; //  (optional)

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Creates an action definition - Currently Not Supported
[apiInstance actionServiceCreateActionDefinitionWith:actionName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var actionName = actionName_example; // {String} 

var opts = { 
  'body':  // {ActionRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.actionServiceCreateActionDefinition(actionName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceCreateActionDefinitionExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var actionName = actionName_example;  // String | 
            var body = new ActionRequestSwagger(); // ActionRequestSwagger |  (optional) 

            try
            {
                // Creates an action definition - Currently Not Supported
                apiInstance.actionServiceCreateActionDefinition(actionName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceCreateActionDefinition: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$actionName = actionName_example; // String | 
$body = ; // ActionRequestSwagger | 

try {
    $api_instance->actionServiceCreateActionDefinition($actionName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceCreateActionDefinition: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $actionName = actionName_example; # String | 
my $body = WWW::SwaggerClient::Object::ActionRequestSwagger->new(); # ActionRequestSwagger | 

eval { 
    $api_instance->actionServiceCreateActionDefinition(actionName => $actionName, body => $body);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceCreateActionDefinition: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceCreateActionDefinition-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
actionName = actionName_example # String | 
body =  # ActionRequestSwagger |  (optional)

try: 
    # Creates an action definition - Currently Not Supported
    api_instance.actionServiceCreateActionDefinition(actionName, body=body)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceCreateActionDefinition: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">actionName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "actionName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceCreateActionDefinition_actionName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceCreateActionDefinition_actionName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ActionRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_actionServiceCreateActionDefinition_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_actionServiceCreateActionDefinition_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 400 - Invalid request </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Actions-actionServiceDeleteActionDefinition">
                      <article id="api-Actions-actionServiceDeleteActionDefinition-0" data-group="User" data-name="actionServiceDeleteActionDefinition" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceDeleteActionDefinition</h1>
                          <p>Deletes an action definition - Currently Not Supported</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/actions/{actionName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceDeleteActionDefinition-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceDeleteActionDefinition-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/actions/{actionName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        try {
            apiInstance.actionServiceDeleteActionDefinition(actionName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceDeleteActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        try {
            apiInstance.actionServiceDeleteActionDefinition(actionName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceDeleteActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *actionName = actionName_example; // 

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Deletes an action definition - Currently Not Supported
[apiInstance actionServiceDeleteActionDefinitionWith:actionName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var actionName = actionName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.actionServiceDeleteActionDefinition(actionName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceDeleteActionDefinitionExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var actionName = actionName_example;  // String | 

            try
            {
                // Deletes an action definition - Currently Not Supported
                apiInstance.actionServiceDeleteActionDefinition(actionName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceDeleteActionDefinition: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$actionName = actionName_example; // String | 

try {
    $api_instance->actionServiceDeleteActionDefinition($actionName);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceDeleteActionDefinition: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $actionName = actionName_example; # String | 

eval { 
    $api_instance->actionServiceDeleteActionDefinition(actionName => $actionName);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceDeleteActionDefinition: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceDeleteActionDefinition-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
actionName = actionName_example # String | 

try: 
    # Deletes an action definition - Currently Not Supported
    api_instance.actionServiceDeleteActionDefinition(actionName)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceDeleteActionDefinition: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">actionName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "actionName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceDeleteActionDefinition_actionName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceDeleteActionDefinition_actionName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Actions-actionServiceGetActionDefinition">
                      <article id="api-Actions-actionServiceGetActionDefinition-0" data-group="User" data-name="actionServiceGetActionDefinition" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceGetActionDefinition</h1>
                          <p>Get the details of an action definition</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/actions/{actionName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceGetActionDefinition-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinition-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceGetActionDefinition-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/actions/{actionName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ActionResponseSwagger result = apiInstance.actionServiceGetActionDefinition(actionName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceGetActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ActionResponseSwagger result = apiInstance.actionServiceGetActionDefinition(actionName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceGetActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *actionName = actionName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Actions/*)

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Get the details of an action definition
[apiInstance actionServiceGetActionDefinitionWith:actionName
    fields:fields
              completionHandler: ^(ActionResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var actionName = actionName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.actionServiceGetActionDefinition(actionName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceGetActionDefinitionExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var actionName = actionName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Actions/*)

            try
            {
                // Get the details of an action definition
                ActionResponseSwagger result = apiInstance.actionServiceGetActionDefinition(actionName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceGetActionDefinition: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$actionName = actionName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->actionServiceGetActionDefinition($actionName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceGetActionDefinition: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $actionName = actionName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->actionServiceGetActionDefinition(actionName => $actionName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceGetActionDefinition: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinition-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
actionName = actionName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Actions/*)

try: 
    # Get the details of an action definition
    api_response = api_instance.actionServiceGetActionDefinition(actionName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceGetActionDefinition: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">actionName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "actionName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinition_actionName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinition_actionName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Actions/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinition_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinition_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-actionServiceGetActionDefinition-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-actionServiceGetActionDefinition-200-schema">
                                  <div id='responses-actionServiceGetActionDefinition-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ActionResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-actionServiceGetActionDefinition-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-actionServiceGetActionDefinition-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-actionServiceGetActionDefinition-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Actions-actionServiceGetActionDefinitions">
                      <article id="api-Actions-actionServiceGetActionDefinitions-0" data-group="User" data-name="actionServiceGetActionDefinitions" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceGetActionDefinitions</h1>
                          <p>Get all action definitions</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/actions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceGetActionDefinitions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceGetActionDefinitions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceGetActionDefinitions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/actions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ActionResponseSwagger] result = apiInstance.actionServiceGetActionDefinitions(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceGetActionDefinitions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ActionResponseSwagger] result = apiInstance.actionServiceGetActionDefinitions(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceGetActionDefinitions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Actions/action_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Actions/action_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Get all action definitions
[apiInstance actionServiceGetActionDefinitionsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ActionResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.actionServiceGetActionDefinitions(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceGetActionDefinitionsExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Actions/action_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Actions/action_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all action definitions
                array[ActionResponseSwagger] result = apiInstance.actionServiceGetActionDefinitions(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceGetActionDefinitions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->actionServiceGetActionDefinitions($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceGetActionDefinitions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->actionServiceGetActionDefinitions(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceGetActionDefinitions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceGetActionDefinitions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Actions/action_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Actions/action_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all action definitions
    api_response = api_instance.actionServiceGetActionDefinitions(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceGetActionDefinitions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Actions/action_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Actions/action_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceGetActionDefinitions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceGetActionDefinitions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-actionServiceGetActionDefinitions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-actionServiceGetActionDefinitions-200-schema">
                                  <div id='responses-actionServiceGetActionDefinitions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ActionResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-actionServiceGetActionDefinitions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-actionServiceGetActionDefinitions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-actionServiceGetActionDefinitions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Actions-actionServiceUpdateActionDefinition">
                      <article id="api-Actions-actionServiceUpdateActionDefinition-0" data-group="User" data-name="actionServiceUpdateActionDefinition" data-version="0">
                        <div class="pull-left">
                          <h1>actionServiceUpdateActionDefinition</h1>
                          <p>Updates an action definition - Currently Not Supported</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/actions/{actionName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-java">Java</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Actions-actionServiceUpdateActionDefinition-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Actions-actionServiceUpdateActionDefinition-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/actions/{actionName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ActionsApi;

import java.io.File;
import java.util.*;

public class ActionsApiExample {

    public static void main(String[] args) {
        
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        ActionRequestSwagger body = ; // ActionRequestSwagger | 
        try {
            apiInstance.actionServiceUpdateActionDefinition(actionName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceUpdateActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ActionsApi;

public class ActionsApiExample {

    public static void main(String[] args) {
        ActionsApi apiInstance = new ActionsApi();
        String actionName = actionName_example; // String | 
        ActionRequestSwagger body = ; // ActionRequestSwagger | 
        try {
            apiInstance.actionServiceUpdateActionDefinition(actionName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ActionsApi#actionServiceUpdateActionDefinition");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *actionName = actionName_example; // 
ActionRequestSwagger *body = ; //  (optional)

ActionsApi *apiInstance = [[ActionsApi alloc] init];

// Updates an action definition - Currently Not Supported
[apiInstance actionServiceUpdateActionDefinitionWith:actionName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ActionsApi()

var actionName = actionName_example; // {String} 

var opts = { 
  'body':  // {ActionRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.actionServiceUpdateActionDefinition(actionName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class actionServiceUpdateActionDefinitionExample
    {
        public void main()
        {
            
            var apiInstance = new ActionsApi();
            var actionName = actionName_example;  // String | 
            var body = new ActionRequestSwagger(); // ActionRequestSwagger |  (optional) 

            try
            {
                // Updates an action definition - Currently Not Supported
                apiInstance.actionServiceUpdateActionDefinition(actionName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ActionsApi.actionServiceUpdateActionDefinition: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ActionsApi();
$actionName = actionName_example; // String | 
$body = ; // ActionRequestSwagger | 

try {
    $api_instance->actionServiceUpdateActionDefinition($actionName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ActionsApi->actionServiceUpdateActionDefinition: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ActionsApi;

my $api_instance = WWW::SwaggerClient::ActionsApi->new();
my $actionName = actionName_example; # String | 
my $body = WWW::SwaggerClient::Object::ActionRequestSwagger->new(); # ActionRequestSwagger | 

eval { 
    $api_instance->actionServiceUpdateActionDefinition(actionName => $actionName, body => $body);
};
if ($@) {
    warn "Exception when calling ActionsApi->actionServiceUpdateActionDefinition: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Actions-actionServiceUpdateActionDefinition-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ActionsApi()
actionName = actionName_example # String | 
body =  # ActionRequestSwagger |  (optional)

try: 
    # Updates an action definition - Currently Not Supported
    api_instance.actionServiceUpdateActionDefinition(actionName, body=body)
except ApiException as e:
    print("Exception when calling ActionsApi->actionServiceUpdateActionDefinition: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">actionName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "actionName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_actionServiceUpdateActionDefinition_actionName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_actionServiceUpdateActionDefinition_actionName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ActionRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_actionServiceUpdateActionDefinition_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_actionServiceUpdateActionDefinition_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 400 - Invalid request </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Alerts">
                  <h1>Alerts</h1>
                    <div id="api-Alerts-createTarget">
                      <article id="api-Alerts-createTarget-0" data-group="User" data-name="createTarget" data-version="0">
                        <div class="pull-left">
                          <h1>createTarget</h1>
                          <p>Creates an alert target</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/alert_targets</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-createTarget-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-createTarget-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-createTarget-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-createTarget-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-createTarget-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-createTarget-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-createTarget-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/alert_targets?validateConfig=&overwriteExisting="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-createTarget-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        AlertTargetSwagger body = ; // AlertTargetSwagger | 
        String validateConfig = validateConfig_example; // String | 
        String overwriteExisting = overwriteExisting_example; // String | 
        try {
            apiInstance.createTarget(body, validateConfig, overwriteExisting);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#createTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-createTarget-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        AlertTargetSwagger body = ; // AlertTargetSwagger | 
        String validateConfig = validateConfig_example; // String | 
        String overwriteExisting = overwriteExisting_example; // String | 
        try {
            apiInstance.createTarget(body, validateConfig, overwriteExisting);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#createTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-createTarget-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-createTarget-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">AlertTargetSwagger *body = ; //  (optional)
String *validateConfig = validateConfig_example; //  (optional)
String *overwriteExisting = overwriteExisting_example; //  (optional)

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Creates an alert target
[apiInstance createTargetWith:body
    validateConfig:validateConfig
    overwriteExisting:overwriteExisting
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-createTarget-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var opts = { 
  'body': , // {AlertTargetSwagger} 
  'validateConfig': validateConfig_example, // {String} 
  'overwriteExisting': overwriteExisting_example // {String} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createTarget(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-createTarget-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-createTarget-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createTargetExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var body = new AlertTargetSwagger(); // AlertTargetSwagger |  (optional) 
            var validateConfig = validateConfig_example;  // String |  (optional) 
            var overwriteExisting = overwriteExisting_example;  // String |  (optional) 

            try
            {
                // Creates an alert target
                apiInstance.createTarget(body, validateConfig, overwriteExisting);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.createTarget: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-createTarget-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$body = ; // AlertTargetSwagger | 
$validateConfig = validateConfig_example; // String | 
$overwriteExisting = overwriteExisting_example; // String | 

try {
    $api_instance->createTarget($body, $validateConfig, $overwriteExisting);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->createTarget: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-createTarget-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $body = WWW::SwaggerClient::Object::AlertTargetSwagger->new(); # AlertTargetSwagger | 
my $validateConfig = validateConfig_example; # String | 
my $overwriteExisting = overwriteExisting_example; # String | 

eval { 
    $api_instance->createTarget(body => $body, validateConfig => $validateConfig, overwriteExisting => $overwriteExisting);
};
if ($@) {
    warn "Exception when calling AlertsApi->createTarget: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-createTarget-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
body =  # AlertTargetSwagger |  (optional)
validateConfig = validateConfig_example # String |  (optional)
overwriteExisting = overwriteExisting_example # String |  (optional)

try: 
    # Creates an alert target
    api_instance.createTarget(body=body, validateConfig=validateConfig, overwriteExisting=overwriteExisting)
except ApiException as e:
    print("Exception when calling AlertsApi->createTarget: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/AlertTargetSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createTarget_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createTarget_body"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">validate_config</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "validate_config",
  "in" : "query",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createTarget_validateConfig');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createTarget_validateConfig"></div>
</td>
</tr>

                                <tr><td style="width:150px;">overwrite_existing</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "overwrite_existing",
  "in" : "query",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createTarget_overwriteExisting');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createTarget_overwriteExisting"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Alerts-deleteTarget">
                      <article id="api-Alerts-deleteTarget-0" data-group="User" data-name="deleteTarget" data-version="0">
                        <div class="pull-left">
                          <h1>deleteTarget</h1>
                          <p>Deletes an alert target</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/alert_targets/{targetId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-deleteTarget-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-deleteTarget-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-deleteTarget-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-deleteTarget-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-deleteTarget-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/alert_targets/{targetId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-deleteTarget-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | 
        try {
            apiInstance.deleteTarget(targetId);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#deleteTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-deleteTarget-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | 
        try {
            apiInstance.deleteTarget(targetId);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#deleteTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-deleteTarget-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">Long *targetId = 789; // 

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Deletes an alert target
[apiInstance deleteTargetWith:targetId
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var targetId = 789; // {Long} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteTarget(targetId, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-deleteTarget-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteTargetExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var targetId = 789;  // Long | 

            try
            {
                // Deletes an alert target
                apiInstance.deleteTarget(targetId);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.deleteTarget: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$targetId = 789; // Long | 

try {
    $api_instance->deleteTarget($targetId);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->deleteTarget: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $targetId = 789; # Long | 

eval { 
    $api_instance->deleteTarget(targetId => $targetId);
};
if ($@) {
    warn "Exception when calling AlertsApi->deleteTarget: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-deleteTarget-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
targetId = 789 # Long | 

try: 
    # Deletes an alert target
    api_instance.deleteTarget(targetId)
except ApiException as e:
    print("Exception when calling AlertsApi->deleteTarget: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">targetId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "targetId",
  "in" : "path",
  "required" : true,
  "type" : "integer",
  "format" : "int64"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteTarget_targetId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteTarget_targetId"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Alerts-getTarget">
                      <article id="api-Alerts-getTarget-0" data-group="User" data-name="getTarget" data-version="0">
                        <div class="pull-left">
                          <h1>getTarget</h1>
                          <p>Returns a single alert target</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/alert_targets/{targetId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-getTarget-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-getTarget-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-getTarget-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-getTarget-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-getTarget-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-getTarget-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-getTarget-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/alert_targets/{targetId}?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-getTarget-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | alert target id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            AlertTargetSwagger result = apiInstance.getTarget(targetId, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#getTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-getTarget-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | alert target id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            AlertTargetSwagger result = apiInstance.getTarget(targetId, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#getTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-getTarget-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-getTarget-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">Long *targetId = 789; // alert target id
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to AlertTarget/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Returns a single alert target
[apiInstance getTargetWith:targetId
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(AlertTargetSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTarget-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var targetId = 789; // {Long} alert target id

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getTarget(targetId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-getTarget-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-getTarget-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getTargetExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var targetId = 789;  // Long | alert target id
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to AlertTarget/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns a single alert target
                AlertTargetSwagger result = apiInstance.getTarget(targetId, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.getTarget: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTarget-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$targetId = 789; // Long | alert target id
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getTarget($targetId, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->getTarget: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTarget-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $targetId = 789; # Long | alert target id
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getTarget(targetId => $targetId, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling AlertsApi->getTarget: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTarget-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
targetId = 789 # Long | alert target id
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to AlertTarget/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns a single alert target
    api_response = api_instance.getTarget(targetId, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling AlertsApi->getTarget: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">targetId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "targetId",
  "in" : "path",
  "description" : "alert target id",
  "required" : true,
  "type" : "integer",
  "format" : "int64"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_targetId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_targetId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "AlertTarget/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTarget_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTarget_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getTarget-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getTarget-200-schema">
                                  <div id='responses-getTarget-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/AlertTargetSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getTarget-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getTarget-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getTarget-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Alerts-getTargets">
                      <article id="api-Alerts-getTargets-0" data-group="User" data-name="getTargets" data-version="0">
                        <div class="pull-left">
                          <h1>getTargets</h1>
                          <p>Returns all alert targets</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/alert_targets</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-getTargets-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-getTargets-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-getTargets-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-getTargets-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-getTargets-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-getTargets-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-getTargets-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/alert_targets?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-getTargets-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[AlertTargetSwagger] result = apiInstance.getTargets(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#getTargets");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-getTargets-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[AlertTargetSwagger] result = apiInstance.getTargets(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#getTargets");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-getTargets-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-getTargets-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to AlertTarget/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Returns all alert targets
[apiInstance getTargetsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[AlertTargetSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTargets-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getTargets(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-getTargets-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-getTargets-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getTargetsExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to AlertTarget/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all alert targets
                array[AlertTargetSwagger] result = apiInstance.getTargets(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.getTargets: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTargets-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getTargets($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->getTargets: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTargets-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getTargets(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling AlertsApi->getTargets: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-getTargets-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to AlertTarget/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all alert targets
    api_response = api_instance.getTargets(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling AlertsApi->getTargets: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "AlertTarget/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getTargets_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getTargets_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getTargets-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getTargets-200-schema">
                                  <div id='responses-getTargets-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/AlertTargetSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getTargets-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getTargets-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getTargets-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Alerts-updateTarget">
                      <article id="api-Alerts-updateTarget-0" data-group="User" data-name="updateTarget" data-version="0">
                        <div class="pull-left">
                          <h1>updateTarget</h1>
                          <p>Updates an alert target</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/alert_targets/{targetId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Alerts-updateTarget-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-java">Java</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Alerts-updateTarget-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Alerts-updateTarget-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Alerts-updateTarget-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Alerts-updateTarget-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Alerts-updateTarget-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Alerts-updateTarget-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/alert_targets/{targetId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Alerts-updateTarget-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.AlertsApi;

import java.io.File;
import java.util.*;

public class AlertsApiExample {

    public static void main(String[] args) {
        
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | 
        AlertTargetSwagger body = ; // AlertTargetSwagger | 
        try {
            apiInstance.updateTarget(targetId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#updateTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Alerts-updateTarget-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.AlertsApi;

public class AlertsApiExample {

    public static void main(String[] args) {
        AlertsApi apiInstance = new AlertsApi();
        Long targetId = 789; // Long | 
        AlertTargetSwagger body = ; // AlertTargetSwagger | 
        try {
            apiInstance.updateTarget(targetId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling AlertsApi#updateTarget");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Alerts-updateTarget-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">Long *targetId = 789; // 
AlertTargetSwagger *body = ; //  (optional)

AlertsApi *apiInstance = [[AlertsApi alloc] init];

// Updates an alert target
[apiInstance updateTargetWith:targetId
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.AlertsApi()

var targetId = 789; // {Long} 

var opts = { 
  'body':  // {AlertTargetSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateTarget(targetId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Alerts-updateTarget-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateTargetExample
    {
        public void main()
        {
            
            var apiInstance = new AlertsApi();
            var targetId = 789;  // Long | 
            var body = new AlertTargetSwagger(); // AlertTargetSwagger |  (optional) 

            try
            {
                // Updates an alert target
                apiInstance.updateTarget(targetId, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling AlertsApi.updateTarget: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\AlertsApi();
$targetId = 789; // Long | 
$body = ; // AlertTargetSwagger | 

try {
    $api_instance->updateTarget($targetId, $body);
} catch (Exception $e) {
    echo 'Exception when calling AlertsApi->updateTarget: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::AlertsApi;

my $api_instance = WWW::SwaggerClient::AlertsApi->new();
my $targetId = 789; # Long | 
my $body = WWW::SwaggerClient::Object::AlertTargetSwagger->new(); # AlertTargetSwagger | 

eval { 
    $api_instance->updateTarget(targetId => $targetId, body => $body);
};
if ($@) {
    warn "Exception when calling AlertsApi->updateTarget: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Alerts-updateTarget-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.AlertsApi()
targetId = 789 # Long | 
body =  # AlertTargetSwagger |  (optional)

try: 
    # Updates an alert target
    api_instance.updateTarget(targetId, body=body)
except ApiException as e:
    print("Exception when calling AlertsApi->updateTarget: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">targetId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "targetId",
  "in" : "path",
  "required" : true,
  "type" : "integer",
  "format" : "int64"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateTarget_targetId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateTarget_targetId"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/AlertTargetSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateTarget_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateTarget_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Blueprints">
                  <h1>Blueprints</h1>
                    <div id="api-Blueprints-blueprintServiceCreateBlueprint">
                      <article id="api-Blueprints-blueprintServiceCreateBlueprint-0" data-group="User" data-name="blueprintServiceCreateBlueprint" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceCreateBlueprint</h1>
                          <p>Creates a blueprint</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/blueprints/{blueprintName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceCreateBlueprint-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/blueprints/{blueprintName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        BlueprintSwagger body = ; // BlueprintSwagger | 
        try {
            apiInstance.blueprintServiceCreateBlueprint(blueprintName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceCreateBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        BlueprintSwagger body = ; // BlueprintSwagger | 
        try {
            apiInstance.blueprintServiceCreateBlueprint(blueprintName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceCreateBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *blueprintName = blueprintName_example; // 
BlueprintSwagger *body = ; //  (optional)

BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Creates a blueprint
[apiInstance blueprintServiceCreateBlueprintWith:blueprintName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var blueprintName = blueprintName_example; // {String} 

var opts = { 
  'body':  // {BlueprintSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.blueprintServiceCreateBlueprint(blueprintName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceCreateBlueprintExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();
            var blueprintName = blueprintName_example;  // String | 
            var body = new BlueprintSwagger(); // BlueprintSwagger |  (optional) 

            try
            {
                // Creates a blueprint
                apiInstance.blueprintServiceCreateBlueprint(blueprintName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceCreateBlueprint: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();
$blueprintName = blueprintName_example; // String | 
$body = ; // BlueprintSwagger | 

try {
    $api_instance->blueprintServiceCreateBlueprint($blueprintName, $body);
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceCreateBlueprint: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();
my $blueprintName = blueprintName_example; # String | 
my $body = WWW::SwaggerClient::Object::BlueprintSwagger->new(); # BlueprintSwagger | 

eval { 
    $api_instance->blueprintServiceCreateBlueprint(blueprintName => $blueprintName, body => $body);
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceCreateBlueprint: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceCreateBlueprint-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()
blueprintName = blueprintName_example # String | 
body =  # BlueprintSwagger |  (optional)

try: 
    # Creates a blueprint
    api_instance.blueprintServiceCreateBlueprint(blueprintName, body=body)
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceCreateBlueprint: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">blueprintName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "blueprintName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceCreateBlueprint_blueprintName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceCreateBlueprint_blueprintName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/BlueprintSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_blueprintServiceCreateBlueprint_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_blueprintServiceCreateBlueprint_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Blueprints-blueprintServiceDeleteBlueprint">
                      <article id="api-Blueprints-blueprintServiceDeleteBlueprint-0" data-group="User" data-name="blueprintServiceDeleteBlueprint" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceDeleteBlueprint</h1>
                          <p>Deletes a blueprint</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/blueprints/{blueprintName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprint-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/blueprints/{blueprintName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        try {
            apiInstance.blueprintServiceDeleteBlueprint(blueprintName);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceDeleteBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        try {
            apiInstance.blueprintServiceDeleteBlueprint(blueprintName);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceDeleteBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *blueprintName = blueprintName_example; // 

BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Deletes a blueprint
[apiInstance blueprintServiceDeleteBlueprintWith:blueprintName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var blueprintName = blueprintName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.blueprintServiceDeleteBlueprint(blueprintName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceDeleteBlueprintExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();
            var blueprintName = blueprintName_example;  // String | 

            try
            {
                // Deletes a blueprint
                apiInstance.blueprintServiceDeleteBlueprint(blueprintName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceDeleteBlueprint: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();
$blueprintName = blueprintName_example; // String | 

try {
    $api_instance->blueprintServiceDeleteBlueprint($blueprintName);
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprint: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();
my $blueprintName = blueprintName_example; # String | 

eval { 
    $api_instance->blueprintServiceDeleteBlueprint(blueprintName => $blueprintName);
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprint: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprint-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()
blueprintName = blueprintName_example # String | 

try: 
    # Deletes a blueprint
    api_instance.blueprintServiceDeleteBlueprint(blueprintName)
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprint: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">blueprintName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "blueprintName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceDeleteBlueprint_blueprintName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceDeleteBlueprint_blueprintName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Blueprints-blueprintServiceDeleteBlueprints">
                      <article id="api-Blueprints-blueprintServiceDeleteBlueprints-0" data-group="User" data-name="blueprintServiceDeleteBlueprints" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceDeleteBlueprints</h1>
                          <p>Deletes multiple blueprints that match the predicate. Omitting the predicate will delete all blueprints.</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/blueprints</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceDeleteBlueprints-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/blueprints"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        try {
            apiInstance.blueprintServiceDeleteBlueprints();
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceDeleteBlueprints");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        try {
            apiInstance.blueprintServiceDeleteBlueprints();
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceDeleteBlueprints");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">
BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Deletes multiple blueprints that match the predicate. Omitting the predicate will delete all blueprints.
[apiInstance blueprintServiceDeleteBlueprintsWithCompletionHandler: 
              ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.blueprintServiceDeleteBlueprints(callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceDeleteBlueprintsExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();

            try
            {
                // Deletes multiple blueprints that match the predicate. Omitting the predicate will delete all blueprints.
                apiInstance.blueprintServiceDeleteBlueprints();
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceDeleteBlueprints: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();

try {
    $api_instance->blueprintServiceDeleteBlueprints();
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprints: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();

eval { 
    $api_instance->blueprintServiceDeleteBlueprints();
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprints: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceDeleteBlueprints-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()

try: 
    # Deletes multiple blueprints that match the predicate. Omitting the predicate will delete all blueprints.
    api_instance.blueprintServiceDeleteBlueprints()
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceDeleteBlueprints: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>






                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Blueprints-blueprintServiceGetBlueprint">
                      <article id="api-Blueprints-blueprintServiceGetBlueprint-0" data-group="User" data-name="blueprintServiceGetBlueprint" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceGetBlueprint</h1>
                          <p>Get the details of a blueprint</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/blueprints/{blueprintName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprint-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceGetBlueprint-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/blueprints/{blueprintName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprint(blueprintName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceGetBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        String blueprintName = blueprintName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprint(blueprintName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceGetBlueprint");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *blueprintName = blueprintName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Blueprints/*)

BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Get the details of a blueprint
[apiInstance blueprintServiceGetBlueprintWith:blueprintName
    fields:fields
              completionHandler: ^(array[BlueprintSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var blueprintName = blueprintName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.blueprintServiceGetBlueprint(blueprintName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceGetBlueprintExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();
            var blueprintName = blueprintName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Blueprints/*)

            try
            {
                // Get the details of a blueprint
                array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprint(blueprintName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceGetBlueprint: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();
$blueprintName = blueprintName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->blueprintServiceGetBlueprint($blueprintName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceGetBlueprint: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();
my $blueprintName = blueprintName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->blueprintServiceGetBlueprint(blueprintName => $blueprintName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceGetBlueprint: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprint-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()
blueprintName = blueprintName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Blueprints/*)

try: 
    # Get the details of a blueprint
    api_response = api_instance.blueprintServiceGetBlueprint(blueprintName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceGetBlueprint: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">blueprintName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "blueprintName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprint_blueprintName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprint_blueprintName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Blueprints/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprint_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprint_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-blueprintServiceGetBlueprint-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-blueprintServiceGetBlueprint-200-schema">
                                  <div id='responses-blueprintServiceGetBlueprint-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/BlueprintSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-blueprintServiceGetBlueprint-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-blueprintServiceGetBlueprint-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-blueprintServiceGetBlueprint-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Blueprints-blueprintServiceGetBlueprints">
                      <article id="api-Blueprints-blueprintServiceGetBlueprints-0" data-group="User" data-name="blueprintServiceGetBlueprints" data-version="0">
                        <div class="pull-left">
                          <h1>blueprintServiceGetBlueprints</h1>
                          <p>Get all blueprints</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/blueprints</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-java">Java</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Blueprints-blueprintServiceGetBlueprints-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Blueprints-blueprintServiceGetBlueprints-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/blueprints?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.BlueprintsApi;

import java.io.File;
import java.util.*;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        
        BlueprintsApi apiInstance = new BlueprintsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprints(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceGetBlueprints");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.BlueprintsApi;

public class BlueprintsApiExample {

    public static void main(String[] args) {
        BlueprintsApi apiInstance = new BlueprintsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprints(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling BlueprintsApi#blueprintServiceGetBlueprints");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Blueprints/blueprint_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Blueprints/blueprint_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

BlueprintsApi *apiInstance = [[BlueprintsApi alloc] init];

// Get all blueprints
[apiInstance blueprintServiceGetBlueprintsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[BlueprintSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.BlueprintsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.blueprintServiceGetBlueprints(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class blueprintServiceGetBlueprintsExample
    {
        public void main()
        {
            
            var apiInstance = new BlueprintsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Blueprints/blueprint_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Blueprints/blueprint_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all blueprints
                array[BlueprintSwagger] result = apiInstance.blueprintServiceGetBlueprints(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling BlueprintsApi.blueprintServiceGetBlueprints: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\BlueprintsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->blueprintServiceGetBlueprints($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling BlueprintsApi->blueprintServiceGetBlueprints: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::BlueprintsApi;

my $api_instance = WWW::SwaggerClient::BlueprintsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->blueprintServiceGetBlueprints(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling BlueprintsApi->blueprintServiceGetBlueprints: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Blueprints-blueprintServiceGetBlueprints-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.BlueprintsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Blueprints/blueprint_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Blueprints/blueprint_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all blueprints
    api_response = api_instance.blueprintServiceGetBlueprints(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling BlueprintsApi->blueprintServiceGetBlueprints: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Blueprints/blueprint_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Blueprints/blueprint_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_blueprintServiceGetBlueprints_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_blueprintServiceGetBlueprints_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-blueprintServiceGetBlueprints-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-blueprintServiceGetBlueprints-200-schema">
                                  <div id='responses-blueprintServiceGetBlueprints-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/BlueprintSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-blueprintServiceGetBlueprints-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-blueprintServiceGetBlueprints-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-blueprintServiceGetBlueprints-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-ClusterServices">
                  <h1>ClusterServices</h1>
                    <div id="api-ClusterServices-serviceServiceCreateArtifact">
                      <article id="api-ClusterServices-serviceServiceCreateArtifact-0" data-group="User" data-name="serviceServiceCreateArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceCreateArtifact</h1>
                          <p>Creates a service artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceCreateArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceCreateArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceCreateArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *clusterName = clusterName_example; // 
ClusterServiceArtifactRequest *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Creates a service artifact
[apiInstance serviceServiceCreateArtifactWith:serviceName
    artifactName:artifactName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterServiceArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceCreateArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterServiceArtifactRequest(); // ClusterServiceArtifactRequest |  (optional) 

            try
            {
                // Creates a service artifact
                apiInstance.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceCreateArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ClusterServiceArtifactRequest | 

try {
    $api_instance->serviceServiceCreateArtifact($serviceName, $artifactName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceCreateArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterServiceArtifactRequest->new(); # ClusterServiceArtifactRequest | 

eval { 
    $api_instance->serviceServiceCreateArtifact(serviceName => $serviceName, artifactName => $artifactName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceCreateArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
clusterName = clusterName_example # String | 
body =  # ClusterServiceArtifactRequest |  (optional)

try: 
    # Creates a service artifact
    api_instance.serviceServiceCreateArtifact(serviceName, artifactName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceCreateArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateArtifact_artifactName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateArtifact_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterServiceArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceCreateArtifact_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceCreateArtifact_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceCreateServices">
                      <article id="api-ClusterServices-serviceServiceCreateServices-0" data-group="User" data-name="serviceServiceCreateServices" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceCreateServices</h1>
                          <p>Creates a service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceCreateServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceCreateServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceCreateServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceRequestSwagger body = ; // ServiceRequestSwagger | 
        try {
            apiInstance.serviceServiceCreateServices(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceCreateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceRequestSwagger body = ; // ServiceRequestSwagger | 
        try {
            apiInstance.serviceServiceCreateServices(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceCreateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
ServiceRequestSwagger *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Creates a service
[apiInstance serviceServiceCreateServicesWith:serviceName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ServiceRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceCreateServices(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceCreateServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ServiceRequestSwagger(); // ServiceRequestSwagger |  (optional) 

            try
            {
                // Creates a service
                apiInstance.serviceServiceCreateServices(serviceName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceCreateServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ServiceRequestSwagger | 

try {
    $api_instance->serviceServiceCreateServices($serviceName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceCreateServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ServiceRequestSwagger->new(); # ServiceRequestSwagger | 

eval { 
    $api_instance->serviceServiceCreateServices(serviceName => $serviceName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceCreateServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceCreateServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
body =  # ServiceRequestSwagger |  (optional)

try: 
    # Creates a service
    api_instance.serviceServiceCreateServices(serviceName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceCreateServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateServices_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateServices_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceCreateServices_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceCreateServices_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ServiceRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceCreateServices_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceCreateServices_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceDeleteArtifact">
                      <article id="api-ClusterServices-serviceServiceDeleteArtifact-0" data-group="User" data-name="serviceServiceDeleteArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceDeleteArtifact</h1>
                          <p>Deletes a single service artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *clusterName = clusterName_example; // 

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Deletes a single service artifact
[apiInstance serviceServiceDeleteArtifactWith:serviceName
    artifactName:artifactName
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceDeleteArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes a single service artifact
                apiInstance.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceDeleteArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->serviceServiceDeleteArtifact($serviceName, $artifactName, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceDeleteArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->serviceServiceDeleteArtifact(serviceName => $serviceName, artifactName => $artifactName, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceDeleteArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Deletes a single service artifact
    api_instance.serviceServiceDeleteArtifact(serviceName, artifactName, clusterName)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceDeleteArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifact_artifactName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifact_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceDeleteArtifacts">
                      <article id="api-ClusterServices-serviceServiceDeleteArtifacts-0" data-group="User" data-name="serviceServiceDeleteArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceDeleteArtifacts</h1>
                          <p>Deletes all artifacts of a service that match the provided predicate</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteArtifacts(serviceName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteArtifacts(serviceName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Deletes all artifacts of a service that match the provided predicate
[apiInstance serviceServiceDeleteArtifactsWith:serviceName
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceDeleteArtifacts(serviceName, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceDeleteArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes all artifacts of a service that match the provided predicate
                apiInstance.serviceServiceDeleteArtifacts(serviceName, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceDeleteArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->serviceServiceDeleteArtifacts($serviceName, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceDeleteArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->serviceServiceDeleteArtifacts(serviceName => $serviceName, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceDeleteArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Deletes all artifacts of a service that match the provided predicate
    api_instance.serviceServiceDeleteArtifacts(serviceName, clusterName)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceDeleteArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifacts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifacts_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteArtifacts_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceDeleteService">
                      <article id="api-ClusterServices-serviceServiceDeleteService-0" data-group="User" data-name="serviceServiceDeleteService" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceDeleteService</h1>
                          <p>Deletes a service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceDeleteService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceDeleteService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceDeleteService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteService(serviceName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.serviceServiceDeleteService(serviceName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceDeleteService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Deletes a service
[apiInstance serviceServiceDeleteServiceWith:serviceName
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceDeleteService(serviceName, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceDeleteServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes a service
                apiInstance.serviceServiceDeleteService(serviceName, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceDeleteService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->serviceServiceDeleteService($serviceName, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceDeleteService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->serviceServiceDeleteService(serviceName => $serviceName, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceDeleteService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceDeleteService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Deletes a service
    api_instance.serviceServiceDeleteService(serviceName, clusterName)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceDeleteService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteService_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceDeleteService_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceDeleteService_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceGetArtifact">
                      <article id="api-ClusterServices-serviceServiceGetArtifact-0" data-group="User" data-name="serviceServiceGetArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceGetArtifact</h1>
                          <p>Get the details of a service artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceGetArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifact(serviceName, artifactName, clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifact(serviceName, artifactName, clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Artifacts/artifact_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Artifacts/artifact_name)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Get the details of a service artifact
[apiInstance serviceServiceGetArtifactWith:serviceName
    artifactName:artifactName
    clusterName:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ClusterServiceArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.serviceServiceGetArtifact(serviceName, artifactName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceGetArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Artifacts/artifact_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Artifacts/artifact_name)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get the details of a service artifact
                array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifact(serviceName, artifactName, clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceGetArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->serviceServiceGetArtifact($serviceName, $artifactName, $clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceGetArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->serviceServiceGetArtifact(serviceName => $serviceName, artifactName => $artifactName, clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceGetArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Artifacts/artifact_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Artifacts/artifact_name)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get the details of a service artifact
    api_response = api_instance.serviceServiceGetArtifact(serviceName, artifactName, clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceGetArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_artifactName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifact_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifact_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-serviceServiceGetArtifact-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-serviceServiceGetArtifact-200-schema">
                                  <div id='responses-serviceServiceGetArtifact-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ClusterServiceArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-serviceServiceGetArtifact-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-serviceServiceGetArtifact-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-serviceServiceGetArtifact-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceGetArtifacts">
                      <article id="api-ClusterServices-serviceServiceGetArtifacts-0" data-group="User" data-name="serviceServiceGetArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceGetArtifacts</h1>
                          <p>Get all service artifacts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceGetArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifacts(serviceName, clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifacts(serviceName, clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Artifacts/artifact_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Artifacts/artifact_name)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Get all service artifacts
[apiInstance serviceServiceGetArtifactsWith:serviceName
    clusterName:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ClusterServiceArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.serviceServiceGetArtifacts(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceGetArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Artifacts/artifact_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Artifacts/artifact_name)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all service artifacts
                array[ClusterServiceArtifactResponse] result = apiInstance.serviceServiceGetArtifacts(serviceName, clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceGetArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->serviceServiceGetArtifacts($serviceName, $clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceGetArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->serviceServiceGetArtifacts(serviceName => $serviceName, clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceGetArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Artifacts/artifact_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Artifacts/artifact_name)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all service artifacts
    api_response = api_instance.serviceServiceGetArtifacts(serviceName, clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceGetArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetArtifacts_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetArtifacts_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-serviceServiceGetArtifacts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-serviceServiceGetArtifacts-200-schema">
                                  <div id='responses-serviceServiceGetArtifacts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ClusterServiceArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-serviceServiceGetArtifacts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-serviceServiceGetArtifacts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-serviceServiceGetArtifacts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceGetService">
                      <article id="api-ClusterServices-serviceServiceGetService-0" data-group="User" data-name="serviceServiceGetService" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceGetService</h1>
                          <p>Get the details of a service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceGetService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceGetService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetService(serviceName, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetService(serviceName, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ServiceInfo/*)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Get the details of a service
[apiInstance serviceServiceGetServiceWith:serviceName
    clusterName:clusterName
    fields:fields
              completionHandler: ^(array[ServiceResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.serviceServiceGetService(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceGetServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ServiceInfo/*)

            try
            {
                // Get the details of a service
                array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetService(serviceName, clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceGetService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->serviceServiceGetService($serviceName, $clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceGetService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->serviceServiceGetService(serviceName => $serviceName, clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceGetService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ServiceInfo/*)

try: 
    # Get the details of a service
    api_response = api_instance.serviceServiceGetService(serviceName, clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceGetService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetService_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetService_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetService_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ServiceInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetService_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetService_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-serviceServiceGetService-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-serviceServiceGetService-200-schema">
                                  <div id='responses-serviceServiceGetService-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ServiceResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-serviceServiceGetService-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-serviceServiceGetService-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-serviceServiceGetService-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceGetServices">
                      <article id="api-ClusterServices-serviceServiceGetServices-0" data-group="User" data-name="serviceServiceGetServices" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceGetServices</h1>
                          <p>Get all services</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all services.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/services</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceGetServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceGetServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceGetServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/services?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetServices(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetServices(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceGetServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ServiceInfo/service_name,ServiceInfo/cluster_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to ServiceInfo/service_name.asc,ServiceInfo/cluster_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Get all services
[apiInstance serviceServiceGetServicesWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ServiceResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.serviceServiceGetServices(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceGetServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ServiceInfo/service_name,ServiceInfo/cluster_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to ServiceInfo/service_name.asc,ServiceInfo/cluster_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all services
                array[ServiceResponseSwagger] result = apiInstance.serviceServiceGetServices(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceGetServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->serviceServiceGetServices($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceGetServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->serviceServiceGetServices(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceGetServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceGetServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ServiceInfo/service_name,ServiceInfo/cluster_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to ServiceInfo/service_name.asc,ServiceInfo/cluster_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all services
    api_response = api_instance.serviceServiceGetServices(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceGetServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ServiceInfo/service_name,ServiceInfo/cluster_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "ServiceInfo/service_name.asc,ServiceInfo/cluster_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceGetServices_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceGetServices_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-serviceServiceGetServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-serviceServiceGetServices-200-schema">
                                  <div id='responses-serviceServiceGetServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ServiceResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-serviceServiceGetServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-serviceServiceGetServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-serviceServiceGetServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceUpdateArtifact">
                      <article id="api-ClusterServices-serviceServiceUpdateArtifact-0" data-group="User" data-name="serviceServiceUpdateArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceUpdateArtifact</h1>
                          <p>Updates a single artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *clusterName = clusterName_example; // 
ClusterServiceArtifactRequest *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Updates a single artifact
[apiInstance serviceServiceUpdateArtifactWith:serviceName
    artifactName:artifactName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterServiceArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceUpdateArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterServiceArtifactRequest(); // ClusterServiceArtifactRequest |  (optional) 

            try
            {
                // Updates a single artifact
                apiInstance.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceUpdateArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ClusterServiceArtifactRequest | 

try {
    $api_instance->serviceServiceUpdateArtifact($serviceName, $artifactName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceUpdateArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterServiceArtifactRequest->new(); # ClusterServiceArtifactRequest | 

eval { 
    $api_instance->serviceServiceUpdateArtifact(serviceName => $serviceName, artifactName => $artifactName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceUpdateArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
clusterName = clusterName_example # String | 
body =  # ClusterServiceArtifactRequest |  (optional)

try: 
    # Updates a single artifact
    api_instance.serviceServiceUpdateArtifact(serviceName, artifactName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceUpdateArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifact_artifactName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifact_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterServiceArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceUpdateArtifact_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifact_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceUpdateArtifacts">
                      <article id="api-ClusterServices-serviceServiceUpdateArtifacts-0" data-group="User" data-name="serviceServiceUpdateArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceUpdateArtifacts</h1>
                          <p>Updates multiple artifacts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}/artifacts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceUpdateArtifacts(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ClusterServiceArtifactRequest body = ; // ClusterServiceArtifactRequest | 
        try {
            apiInstance.serviceServiceUpdateArtifacts(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
ClusterServiceArtifactRequest *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Updates multiple artifacts
[apiInstance serviceServiceUpdateArtifactsWith:serviceName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterServiceArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceUpdateArtifacts(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceUpdateArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterServiceArtifactRequest(); // ClusterServiceArtifactRequest |  (optional) 

            try
            {
                // Updates multiple artifacts
                apiInstance.serviceServiceUpdateArtifacts(serviceName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceUpdateArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ClusterServiceArtifactRequest | 

try {
    $api_instance->serviceServiceUpdateArtifacts($serviceName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceUpdateArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterServiceArtifactRequest->new(); # ClusterServiceArtifactRequest | 

eval { 
    $api_instance->serviceServiceUpdateArtifacts(serviceName => $serviceName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceUpdateArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
body =  # ClusterServiceArtifactRequest |  (optional)

try: 
    # Updates multiple artifacts
    api_instance.serviceServiceUpdateArtifacts(serviceName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceUpdateArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifacts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifacts_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifacts_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterServiceArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceUpdateArtifacts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceUpdateArtifacts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ClusterServices-serviceServiceUpdateService">
                      <article id="api-ClusterServices-serviceServiceUpdateService-0" data-group="User" data-name="serviceServiceUpdateService" data-version="0">
                        <div class="pull-left">
                          <h1>serviceServiceUpdateService</h1>
                          <p>Updates a service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ClusterServices-serviceServiceUpdateService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-java">Java</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ClusterServices-serviceServiceUpdateService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ClusterServices-serviceServiceUpdateService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/services/{serviceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClusterServicesApi;

import java.io.File;
import java.util.*;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceRequestSwagger body = ; // ServiceRequestSwagger | 
        try {
            apiInstance.serviceServiceUpdateService(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClusterServicesApi;

public class ClusterServicesApiExample {

    public static void main(String[] args) {
        ClusterServicesApi apiInstance = new ClusterServicesApi();
        String serviceName = serviceName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceRequestSwagger body = ; // ServiceRequestSwagger | 
        try {
            apiInstance.serviceServiceUpdateService(serviceName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClusterServicesApi#serviceServiceUpdateService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // 
String *clusterName = clusterName_example; // 
ServiceRequestSwagger *body = ; //  (optional)

ClusterServicesApi *apiInstance = [[ClusterServicesApi alloc] init];

// Updates a service
[apiInstance serviceServiceUpdateServiceWith:serviceName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClusterServicesApi()

var serviceName = serviceName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ServiceRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.serviceServiceUpdateService(serviceName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class serviceServiceUpdateServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ClusterServicesApi();
            var serviceName = serviceName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ServiceRequestSwagger(); // ServiceRequestSwagger |  (optional) 

            try
            {
                // Updates a service
                apiInstance.serviceServiceUpdateService(serviceName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClusterServicesApi.serviceServiceUpdateService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClusterServicesApi();
$serviceName = serviceName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ServiceRequestSwagger | 

try {
    $api_instance->serviceServiceUpdateService($serviceName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClusterServicesApi->serviceServiceUpdateService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClusterServicesApi;

my $api_instance = WWW::SwaggerClient::ClusterServicesApi->new();
my $serviceName = serviceName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ServiceRequestSwagger->new(); # ServiceRequestSwagger | 

eval { 
    $api_instance->serviceServiceUpdateService(serviceName => $serviceName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClusterServicesApi->serviceServiceUpdateService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ClusterServices-serviceServiceUpdateService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClusterServicesApi()
serviceName = serviceName_example # String | 
clusterName = clusterName_example # String | 
body =  # ServiceRequestSwagger |  (optional)

try: 
    # Updates a service
    api_instance.serviceServiceUpdateService(serviceName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClusterServicesApi->serviceServiceUpdateService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateService_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_serviceServiceUpdateService_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_serviceServiceUpdateService_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ServiceRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_serviceServiceUpdateService_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_serviceServiceUpdateService_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Clusters">
                  <h1>Clusters</h1>
                    <div id="api-Clusters-createCluster">
                      <article id="api-Clusters-createCluster-0" data-group="User" data-name="createCluster" data-version="0">
                        <div class="pull-left">
                          <h1>createCluster</h1>
                          <p>Creates a cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-createCluster-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-createCluster-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-createCluster-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-createCluster-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-createCluster-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-createCluster-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-createCluster-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-createCluster-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterRequestSwagger body = ; // ClusterRequestSwagger | 
        try {
            apiInstance.createCluster(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#createCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-createCluster-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterRequestSwagger body = ; // ClusterRequestSwagger | 
        try {
            apiInstance.createCluster(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#createCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-createCluster-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-createCluster-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ClusterRequestSwagger *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Creates a cluster
[apiInstance createClusterWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createCluster-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createCluster(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-createCluster-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-createCluster-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createClusterExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterRequestSwagger(); // ClusterRequestSwagger |  (optional) 

            try
            {
                // Creates a cluster
                apiInstance.createCluster(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.createCluster: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createCluster-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$body = ; // ClusterRequestSwagger | 

try {
    $api_instance->createCluster($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->createCluster: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createCluster-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterRequestSwagger->new(); # ClusterRequestSwagger | 

eval { 
    $api_instance->createCluster(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->createCluster: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createCluster-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
body =  # ClusterRequestSwagger |  (optional)

try: 
    # Creates a cluster
    api_instance.createCluster(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->createCluster: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createCluster_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createCluster_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createCluster_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createCluster_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-createClusterArtifact">
                      <article id="api-Clusters-createClusterArtifact-0" data-group="User" data-name="createClusterArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>createClusterArtifact</h1>
                          <p>Creates a cluster artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-createClusterArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-createClusterArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-createClusterArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-createClusterArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-createClusterArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.createClusterArtifact(clusterName, artifactName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#createClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.createClusterArtifact(clusterName, artifactName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#createClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *artifactName = artifactName_example; // 
ClusterArtifactRequest *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Creates a cluster artifact
[apiInstance createClusterArtifactWith:clusterName
    artifactName:artifactName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'body':  // {ClusterArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createClusterArtifact(clusterName, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createClusterArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var body = new ClusterArtifactRequest(); // ClusterArtifactRequest |  (optional) 

            try
            {
                // Creates a cluster artifact
                apiInstance.createClusterArtifact(clusterName, artifactName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.createClusterArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$artifactName = artifactName_example; // String | 
$body = ; // ClusterArtifactRequest | 

try {
    $api_instance->createClusterArtifact($clusterName, $artifactName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->createClusterArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterArtifactRequest->new(); # ClusterArtifactRequest | 

eval { 
    $api_instance->createClusterArtifact(clusterName => $clusterName, artifactName => $artifactName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->createClusterArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-createClusterArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
artifactName = artifactName_example # String | 
body =  # ClusterArtifactRequest |  (optional)

try: 
    # Creates a cluster artifact
    api_instance.createClusterArtifact(clusterName, artifactName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->createClusterArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createClusterArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createClusterArtifact_clusterName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createClusterArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createClusterArtifact_artifactName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createClusterArtifact_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createClusterArtifact_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-deleteCluster">
                      <article id="api-Clusters-deleteCluster-0" data-group="User" data-name="deleteCluster" data-version="0">
                        <div class="pull-left">
                          <h1>deleteCluster</h1>
                          <p>Deletes a cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-deleteCluster-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteCluster-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteCluster-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteCluster-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-deleteCluster-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-deleteCluster-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteCluster(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-deleteCluster-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteCluster(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-deleteCluster-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Deletes a cluster
[apiInstance deleteClusterWith:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteCluster(clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-deleteCluster-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteClusterExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes a cluster
                apiInstance.deleteCluster(clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.deleteCluster: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteCluster($clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->deleteCluster: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteCluster(clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClustersApi->deleteCluster: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteCluster-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 

try: 
    # Deletes a cluster
    api_instance.deleteCluster(clusterName)
except ApiException as e:
    print("Exception when calling ClustersApi->deleteCluster: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteCluster_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteCluster_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-deleteClusterArtifact">
                      <article id="api-Clusters-deleteClusterArtifact-0" data-group="User" data-name="deleteClusterArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>deleteClusterArtifact</h1>
                          <p>Deletes a single artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-deleteClusterArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-deleteClusterArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        try {
            apiInstance.deleteClusterArtifact(clusterName, artifactName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        try {
            apiInstance.deleteClusterArtifact(clusterName, artifactName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *artifactName = artifactName_example; // 

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Deletes a single artifact
[apiInstance deleteClusterArtifactWith:clusterName
    artifactName:artifactName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var artifactName = artifactName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteClusterArtifact(clusterName, artifactName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteClusterArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var artifactName = artifactName_example;  // String | 

            try
            {
                // Deletes a single artifact
                apiInstance.deleteClusterArtifact(clusterName, artifactName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.deleteClusterArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$artifactName = artifactName_example; // String | 

try {
    $api_instance->deleteClusterArtifact($clusterName, $artifactName);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->deleteClusterArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $artifactName = artifactName_example; # String | 

eval { 
    $api_instance->deleteClusterArtifact(clusterName => $clusterName, artifactName => $artifactName);
};
if ($@) {
    warn "Exception when calling ClustersApi->deleteClusterArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
artifactName = artifactName_example # String | 

try: 
    # Deletes a single artifact
    api_instance.deleteClusterArtifact(clusterName, artifactName)
except ApiException as e:
    print("Exception when calling ClustersApi->deleteClusterArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteClusterArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteClusterArtifact_clusterName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteClusterArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteClusterArtifact_artifactName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-deleteClusterArtifacts">
                      <article id="api-Clusters-deleteClusterArtifacts-0" data-group="User" data-name="deleteClusterArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>deleteClusterArtifacts</h1>
                          <p>Deletes all artifacts of a cluster that match the provided predicate</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-deleteClusterArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-deleteClusterArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-deleteClusterArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteClusterArtifacts(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteClusterArtifacts(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#deleteClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Deletes all artifacts of a cluster that match the provided predicate
[apiInstance deleteClusterArtifactsWith:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteClusterArtifacts(clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteClusterArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes all artifacts of a cluster that match the provided predicate
                apiInstance.deleteClusterArtifacts(clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.deleteClusterArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteClusterArtifacts($clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->deleteClusterArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteClusterArtifacts(clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ClustersApi->deleteClusterArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-deleteClusterArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 

try: 
    # Deletes all artifacts of a cluster that match the provided predicate
    api_instance.deleteClusterArtifacts(clusterName)
except ApiException as e:
    print("Exception when calling ClustersApi->deleteClusterArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteClusterArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteClusterArtifacts_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-getCluster">
                      <article id="api-Clusters-getCluster-0" data-group="User" data-name="getCluster" data-version="0">
                        <div class="pull-left">
                          <h1>getCluster</h1>
                          <p>Returns information about a specific cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-getCluster-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getCluster-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-getCluster-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getCluster-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-getCluster-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-getCluster-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-getCluster-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-getCluster-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ClusterResponseWrapper result = apiInstance.getCluster(clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-getCluster-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ClusterResponseWrapper result = apiInstance.getCluster(clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-getCluster-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-getCluster-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Clusters/*)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Returns information about a specific cluster
[apiInstance getClusterWith:clusterName
    fields:fields
              completionHandler: ^(ClusterResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getCluster-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getCluster(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-getCluster-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-getCluster-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getClusterExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Clusters/*)

            try
            {
                // Returns information about a specific cluster
                ClusterResponseWrapper result = apiInstance.getCluster(clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.getCluster: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getCluster-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getCluster($clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->getCluster: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getCluster-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getCluster(clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClustersApi->getCluster: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getCluster-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Clusters/*)

try: 
    # Returns information about a specific cluster
    api_response = api_instance.getCluster(clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClustersApi->getCluster: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getCluster_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getCluster_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Clusters/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getCluster_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getCluster_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getCluster-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getCluster-200-schema">
                                  <div id='responses-getCluster-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ClusterResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getCluster-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getCluster-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getCluster-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-getClusterArtifact">
                      <article id="api-Clusters-getClusterArtifact-0" data-group="User" data-name="getClusterArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>getClusterArtifact</h1>
                          <p>Get the details of a cluster artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-getClusterArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusterArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusterArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-getClusterArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts/{artifactName}?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            ClusterArtifactResponse result = apiInstance.getClusterArtifact(clusterName, artifactName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            ClusterArtifactResponse result = apiInstance.getClusterArtifact(clusterName, artifactName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *artifactName = artifactName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Get the details of a cluster artifact
[apiInstance getClusterArtifactWith:clusterName
    artifactName:artifactName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(ClusterArtifactResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getClusterArtifact(clusterName, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getClusterArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get the details of a cluster artifact
                ClusterArtifactResponse result = apiInstance.getClusterArtifact(clusterName, artifactName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.getClusterArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$artifactName = artifactName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getClusterArtifact($clusterName, $artifactName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->getClusterArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getClusterArtifact(clusterName => $clusterName, artifactName => $artifactName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClustersApi->getClusterArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
artifactName = artifactName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get the details of a cluster artifact
    api_response = api_instance.getClusterArtifact(clusterName, artifactName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClustersApi->getClusterArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_clusterName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_artifactName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifact_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifact_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getClusterArtifact-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getClusterArtifact-200-schema">
                                  <div id='responses-getClusterArtifact-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ClusterArtifactResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getClusterArtifact-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getClusterArtifact-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getClusterArtifact-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-getClusterArtifacts">
                      <article id="api-Clusters-getClusterArtifacts-0" data-group="User" data-name="getClusterArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>getClusterArtifacts</h1>
                          <p>Returns all artifacts associated with the cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-getClusterArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusterArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusterArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusterArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-getClusterArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterArtifactResponse] result = apiInstance.getClusterArtifacts(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterArtifactResponse] result = apiInstance.getClusterArtifacts(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Returns all artifacts associated with the cluster
[apiInstance getClusterArtifactsWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ClusterArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getClusterArtifacts(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getClusterArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all artifacts associated with the cluster
                array[ClusterArtifactResponse] result = apiInstance.getClusterArtifacts(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.getClusterArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getClusterArtifacts($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->getClusterArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getClusterArtifacts(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClustersApi->getClusterArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusterArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all artifacts associated with the cluster
    api_response = api_instance.getClusterArtifacts(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClustersApi->getClusterArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusterArtifacts_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusterArtifacts_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getClusterArtifacts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getClusterArtifacts-200-schema">
                                  <div id='responses-getClusterArtifacts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ClusterArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getClusterArtifacts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getClusterArtifacts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getClusterArtifacts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-getClusters">
                      <article id="api-Clusters-getClusters-0" data-group="User" data-name="getClusters" data-version="0">
                        <div class="pull-left">
                          <h1>getClusters</h1>
                          <p>Returns all clusters</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-getClusters-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusters-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusters-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-getClusters-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-getClusters-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-getClusters-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-getClusters-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-getClusters-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterResponseWrapper] result = apiInstance.getClusters(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusters");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-getClusters-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ClusterResponseWrapper] result = apiInstance.getClusters(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#getClusters");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-getClusters-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-getClusters-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Returns all clusters
[apiInstance getClustersWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ClusterResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusters-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getClusters(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-getClusters-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-getClusters-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getClustersExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all clusters
                array[ClusterResponseWrapper] result = apiInstance.getClusters(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.getClusters: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusters-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getClusters($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->getClusters: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusters-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getClusters(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ClustersApi->getClusters: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-getClusters-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all clusters
    api_response = api_instance.getClusters(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ClustersApi->getClusters: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getClusters_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getClusters_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getClusters-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getClusters-200-schema">
                                  <div id='responses-getClusters-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ClusterResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getClusters-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getClusters-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getClusters-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-updateCluster">
                      <article id="api-Clusters-updateCluster-0" data-group="User" data-name="updateCluster" data-version="0">
                        <div class="pull-left">
                          <h1>updateCluster</h1>
                          <p>Updates a cluster</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-updateCluster-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateCluster-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateCluster-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateCluster-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateCluster-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-updateCluster-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-updateCluster-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-updateCluster-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterRequestSwagger body = ; // ClusterRequestSwagger | 
        try {
            apiInstance.updateCluster(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-updateCluster-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterRequestSwagger body = ; // ClusterRequestSwagger | 
        try {
            apiInstance.updateCluster(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateCluster");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-updateCluster-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ClusterRequestSwagger *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Updates a cluster
[apiInstance updateClusterWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateCluster(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-updateCluster-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateClusterExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterRequestSwagger(); // ClusterRequestSwagger |  (optional) 

            try
            {
                // Updates a cluster
                apiInstance.updateCluster(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.updateCluster: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$body = ; // ClusterRequestSwagger | 

try {
    $api_instance->updateCluster($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->updateCluster: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterRequestSwagger->new(); # ClusterRequestSwagger | 

eval { 
    $api_instance->updateCluster(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->updateCluster: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateCluster-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
body =  # ClusterRequestSwagger |  (optional)

try: 
    # Updates a cluster
    api_instance.updateCluster(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->updateCluster: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateCluster_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateCluster_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateCluster_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateCluster_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-updateClusterArtifact">
                      <article id="api-Clusters-updateClusterArtifact-0" data-group="User" data-name="updateClusterArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>updateClusterArtifact</h1>
                          <p>Updates a single artifact</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-updateClusterArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateClusterArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateClusterArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-updateClusterArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts/{artifactName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.updateClusterArtifact(clusterName, artifactName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        String artifactName = artifactName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.updateClusterArtifact(clusterName, artifactName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateClusterArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *artifactName = artifactName_example; // 
ClusterArtifactRequest *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Updates a single artifact
[apiInstance updateClusterArtifactWith:clusterName
    artifactName:artifactName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'body':  // {ClusterArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateClusterArtifact(clusterName, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateClusterArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var body = new ClusterArtifactRequest(); // ClusterArtifactRequest |  (optional) 

            try
            {
                // Updates a single artifact
                apiInstance.updateClusterArtifact(clusterName, artifactName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.updateClusterArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$artifactName = artifactName_example; // String | 
$body = ; // ClusterArtifactRequest | 

try {
    $api_instance->updateClusterArtifact($clusterName, $artifactName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->updateClusterArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterArtifactRequest->new(); # ClusterArtifactRequest | 

eval { 
    $api_instance->updateClusterArtifact(clusterName => $clusterName, artifactName => $artifactName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->updateClusterArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
artifactName = artifactName_example # String | 
body =  # ClusterArtifactRequest |  (optional)

try: 
    # Updates a single artifact
    api_instance.updateClusterArtifact(clusterName, artifactName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->updateClusterArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateClusterArtifact_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateClusterArtifact_clusterName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateClusterArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateClusterArtifact_artifactName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateClusterArtifact_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateClusterArtifact_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Clusters-updateClusterArtifacts">
                      <article id="api-Clusters-updateClusterArtifacts-0" data-group="User" data-name="updateClusterArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>updateClusterArtifacts</h1>
                          <p>Updates multiple artifacts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Clusters-updateClusterArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Clusters-updateClusterArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Clusters-updateClusterArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/artifacts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ClustersApi;

import java.io.File;
import java.util.*;

public class ClustersApiExample {

    public static void main(String[] args) {
        
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.updateClusterArtifacts(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ClustersApi;

public class ClustersApiExample {

    public static void main(String[] args) {
        ClustersApi apiInstance = new ClustersApi();
        String clusterName = clusterName_example; // String | 
        ClusterArtifactRequest body = ; // ClusterArtifactRequest | 
        try {
            apiInstance.updateClusterArtifacts(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ClustersApi#updateClusterArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ClusterArtifactRequest *body = ; //  (optional)

ClustersApi *apiInstance = [[ClustersApi alloc] init];

// Updates multiple artifacts
[apiInstance updateClusterArtifactsWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ClustersApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ClusterArtifactRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateClusterArtifacts(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateClusterArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new ClustersApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ClusterArtifactRequest(); // ClusterArtifactRequest |  (optional) 

            try
            {
                // Updates multiple artifacts
                apiInstance.updateClusterArtifacts(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ClustersApi.updateClusterArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ClustersApi();
$clusterName = clusterName_example; // String | 
$body = ; // ClusterArtifactRequest | 

try {
    $api_instance->updateClusterArtifacts($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ClustersApi->updateClusterArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ClustersApi;

my $api_instance = WWW::SwaggerClient::ClustersApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ClusterArtifactRequest->new(); # ClusterArtifactRequest | 

eval { 
    $api_instance->updateClusterArtifacts(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ClustersApi->updateClusterArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Clusters-updateClusterArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ClustersApi()
clusterName = clusterName_example # String | 
body =  # ClusterArtifactRequest |  (optional)

try: 
    # Updates multiple artifacts
    api_instance.updateClusterArtifacts(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ClustersApi->updateClusterArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateClusterArtifacts_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateClusterArtifacts_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ClusterArtifactRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateClusterArtifacts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateClusterArtifacts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-ConfigGroups">
                  <h1>ConfigGroups</h1>
                    <div id="api-ConfigGroups-createConfigGroup">
                      <article id="api-ConfigGroups-createConfigGroup-0" data-group="User" data-name="createConfigGroup" data-version="0">
                        <div class="pull-left">
                          <h1>createConfigGroup</h1>
                          <p>Creates a config group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/config_groups</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-createConfigGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-createConfigGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-createConfigGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String clusterName = clusterName_example; // String | 
        ConfigGroupRequest body = ; // ConfigGroupRequest | 
        try {
            apiInstance.createConfigGroup(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#createConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String clusterName = clusterName_example; // String | 
        ConfigGroupRequest body = ; // ConfigGroupRequest | 
        try {
            apiInstance.createConfigGroup(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#createConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ConfigGroupRequest *body = ; //  (optional)

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Creates a config group
[apiInstance createConfigGroupWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ConfigGroupRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createConfigGroup(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createConfigGroupExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ConfigGroupRequest(); // ConfigGroupRequest |  (optional) 

            try
            {
                // Creates a config group
                apiInstance.createConfigGroup(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.createConfigGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$clusterName = clusterName_example; // String | 
$body = ; // ConfigGroupRequest | 

try {
    $api_instance->createConfigGroup($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->createConfigGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ConfigGroupRequest->new(); # ConfigGroupRequest | 

eval { 
    $api_instance->createConfigGroup(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->createConfigGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-createConfigGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
clusterName = clusterName_example # String | 
body =  # ConfigGroupRequest |  (optional)

try: 
    # Creates a config group
    api_instance.createConfigGroup(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->createConfigGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createConfigGroup_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createConfigGroup_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ConfigGroupRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createConfigGroup_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createConfigGroup_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ConfigGroups-deleteConfigGroup">
                      <article id="api-ConfigGroups-deleteConfigGroup-0" data-group="User" data-name="deleteConfigGroup" data-version="0">
                        <div class="pull-left">
                          <h1>deleteConfigGroup</h1>
                          <p>Deletes a config group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/config_groups/{groupId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-deleteConfigGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-deleteConfigGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-deleteConfigGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups/{groupId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteConfigGroup(groupId, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#deleteConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteConfigGroup(groupId, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#deleteConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupId = groupId_example; // 
String *clusterName = clusterName_example; // 

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Deletes a config group
[apiInstance deleteConfigGroupWith:groupId
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var groupId = groupId_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteConfigGroup(groupId, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteConfigGroupExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var groupId = groupId_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Deletes a config group
                apiInstance.deleteConfigGroup(groupId, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.deleteConfigGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$groupId = groupId_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteConfigGroup($groupId, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->deleteConfigGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $groupId = groupId_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteConfigGroup(groupId => $groupId, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->deleteConfigGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-deleteConfigGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
groupId = groupId_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Deletes a config group
    api_instance.deleteConfigGroup(groupId, clusterName)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->deleteConfigGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteConfigGroup_groupId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteConfigGroup_groupId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteConfigGroup_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteConfigGroup_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ConfigGroups-getConfigGroup">
                      <article id="api-ConfigGroups-getConfigGroup-0" data-group="User" data-name="getConfigGroup" data-version="0">
                        <div class="pull-left">
                          <h1>getConfigGroup</h1>
                          <p>Returns a single config group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/config_groups/{groupId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-getConfigGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-getConfigGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups/{groupId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ConfigGroupWrapper result = apiInstance.getConfigGroup(groupId, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#getConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ConfigGroupWrapper result = apiInstance.getConfigGroup(groupId, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#getConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupId = groupId_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ConfigGroup/*)

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Returns a single config group
[apiInstance getConfigGroupWith:groupId
    clusterName:clusterName
    fields:fields
              completionHandler: ^(ConfigGroupWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var groupId = groupId_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getConfigGroup(groupId, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getConfigGroupExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var groupId = groupId_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ConfigGroup/*)

            try
            {
                // Returns a single config group
                ConfigGroupWrapper result = apiInstance.getConfigGroup(groupId, clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.getConfigGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$groupId = groupId_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getConfigGroup($groupId, $clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->getConfigGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $groupId = groupId_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getConfigGroup(groupId => $groupId, clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->getConfigGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
groupId = groupId_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ConfigGroup/*)

try: 
    # Returns a single config group
    api_response = api_instance.getConfigGroup(groupId, clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->getConfigGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroup_groupId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroup_groupId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroup_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroup_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ConfigGroup/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroup_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroup_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getConfigGroup-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getConfigGroup-200-schema">
                                  <div id='responses-getConfigGroup-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ConfigGroupWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getConfigGroup-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getConfigGroup-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getConfigGroup-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ConfigGroups-getConfigGroups">
                      <article id="api-ConfigGroups-getConfigGroups-0" data-group="User" data-name="getConfigGroups" data-version="0">
                        <div class="pull-left">
                          <h1>getConfigGroups</h1>
                          <p>Returns all config groups</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/config_groups</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-getConfigGroups-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-getConfigGroups-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-getConfigGroups-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ConfigGroupWrapper] result = apiInstance.getConfigGroups(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#getConfigGroups");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ConfigGroupWrapper] result = apiInstance.getConfigGroups(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#getConfigGroups");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ConfigGroup/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Returns all config groups
[apiInstance getConfigGroupsWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ConfigGroupWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getConfigGroups(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getConfigGroupsExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ConfigGroup/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all config groups
                array[ConfigGroupWrapper] result = apiInstance.getConfigGroups(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.getConfigGroups: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getConfigGroups($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->getConfigGroups: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getConfigGroups(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->getConfigGroups: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-getConfigGroups-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ConfigGroup/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all config groups
    api_response = api_instance.getConfigGroups(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->getConfigGroups: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ConfigGroup/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigGroups_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigGroups_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getConfigGroups-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getConfigGroups-200-schema">
                                  <div id='responses-getConfigGroups-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ConfigGroupWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getConfigGroups-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getConfigGroups-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getConfigGroups-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-ConfigGroups-updateConfigGroup">
                      <article id="api-ConfigGroups-updateConfigGroup-0" data-group="User" data-name="updateConfigGroup" data-version="0">
                        <div class="pull-left">
                          <h1>updateConfigGroup</h1>
                          <p>Updates a config group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/config_groups/{groupId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-ConfigGroups-updateConfigGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-ConfigGroups-updateConfigGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-ConfigGroups-updateConfigGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/config_groups/{groupId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigGroupsApi;

import java.io.File;
import java.util.*;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        ConfigGroupRequest body = ; // ConfigGroupRequest | 
        try {
            apiInstance.updateConfigGroup(groupId, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#updateConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigGroupsApi;

public class ConfigGroupsApiExample {

    public static void main(String[] args) {
        ConfigGroupsApi apiInstance = new ConfigGroupsApi();
        String groupId = groupId_example; // String | 
        String clusterName = clusterName_example; // String | 
        ConfigGroupRequest body = ; // ConfigGroupRequest | 
        try {
            apiInstance.updateConfigGroup(groupId, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigGroupsApi#updateConfigGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupId = groupId_example; // 
String *clusterName = clusterName_example; // 
ConfigGroupRequest *body = ; //  (optional)

ConfigGroupsApi *apiInstance = [[ConfigGroupsApi alloc] init];

// Updates a config group
[apiInstance updateConfigGroupWith:groupId
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigGroupsApi()

var groupId = groupId_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ConfigGroupRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateConfigGroup(groupId, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateConfigGroupExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigGroupsApi();
            var groupId = groupId_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ConfigGroupRequest(); // ConfigGroupRequest |  (optional) 

            try
            {
                // Updates a config group
                apiInstance.updateConfigGroup(groupId, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigGroupsApi.updateConfigGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigGroupsApi();
$groupId = groupId_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ConfigGroupRequest | 

try {
    $api_instance->updateConfigGroup($groupId, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ConfigGroupsApi->updateConfigGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigGroupsApi;

my $api_instance = WWW::SwaggerClient::ConfigGroupsApi->new();
my $groupId = groupId_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ConfigGroupRequest->new(); # ConfigGroupRequest | 

eval { 
    $api_instance->updateConfigGroup(groupId => $groupId, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ConfigGroupsApi->updateConfigGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-ConfigGroups-updateConfigGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigGroupsApi()
groupId = groupId_example # String | 
clusterName = clusterName_example # String | 
body =  # ConfigGroupRequest |  (optional)

try: 
    # Updates a config group
    api_instance.updateConfigGroup(groupId, clusterName, body=body)
except ApiException as e:
    print("Exception when calling ConfigGroupsApi->updateConfigGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateConfigGroup_groupId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateConfigGroup_groupId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateConfigGroup_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateConfigGroup_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ConfigGroupRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateConfigGroup_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateConfigGroup_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Configurations">
                  <h1>Configurations</h1>
                    <div id="api-Configurations-createConfigurations">
                      <article id="api-Configurations-createConfigurations-0" data-group="User" data-name="createConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>createConfigurations</h1>
                          <p>Create new configurations</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/configurations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Configurations-createConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Configurations-createConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Configurations-createConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Configurations-createConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Configurations-createConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/configurations"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Configurations-createConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigurationsApi;

import java.io.File;
import java.util.*;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        ConfigurationRequest body = ; // ConfigurationRequest | 
        try {
            apiInstance.createConfigurations(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#createConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Configurations-createConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigurationsApi;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        ConfigurationRequest body = ; // ConfigurationRequest | 
        try {
            apiInstance.createConfigurations(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#createConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Configurations-createConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
ConfigurationRequest *body = ; //  (optional)

ConfigurationsApi *apiInstance = [[ConfigurationsApi alloc] init];

// Create new configurations
[apiInstance createConfigurationsWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigurationsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ConfigurationRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createConfigurations(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Configurations-createConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigurationsApi();
            var clusterName = clusterName_example;  // String | 
            var body = new ConfigurationRequest(); // ConfigurationRequest |  (optional) 

            try
            {
                // Create new configurations
                apiInstance.createConfigurations(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigurationsApi.createConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigurationsApi();
$clusterName = clusterName_example; // String | 
$body = ; // ConfigurationRequest | 

try {
    $api_instance->createConfigurations($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ConfigurationsApi->createConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigurationsApi;

my $api_instance = WWW::SwaggerClient::ConfigurationsApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ConfigurationRequest->new(); # ConfigurationRequest | 

eval { 
    $api_instance->createConfigurations(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling ConfigurationsApi->createConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-createConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigurationsApi()
clusterName = clusterName_example # String | 
body =  # ConfigurationRequest |  (optional)

try: 
    # Create new configurations
    api_instance.createConfigurations(clusterName, body=body)
except ApiException as e:
    print("Exception when calling ConfigurationsApi->createConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createConfigurations_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createConfigurations_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ConfigurationRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createConfigurations_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createConfigurations_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Configurations-getConfigurations">
                      <article id="api-Configurations-getConfigurations-0" data-group="User" data-name="getConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>getConfigurations</h1>
                          <p>Get all configurations</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/configurations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Configurations-getConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Configurations-getConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Configurations-getConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Configurations-getConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Configurations-getConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/configurations?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Configurations-getConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigurationsApi;

import java.io.File;
import java.util.*;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ConfigurationResponse] result = apiInstance.getConfigurations(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#getConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Configurations-getConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigurationsApi;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ConfigurationResponse] result = apiInstance.getConfigurations(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#getConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Configurations-getConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ConfigurationsApi *apiInstance = [[ConfigurationsApi alloc] init];

// Get all configurations
[apiInstance getConfigurationsWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ConfigurationResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigurationsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getConfigurations(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Configurations-getConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigurationsApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all configurations
                array[ConfigurationResponse] result = apiInstance.getConfigurations(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigurationsApi.getConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigurationsApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getConfigurations($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConfigurationsApi->getConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigurationsApi;

my $api_instance = WWW::SwaggerClient::ConfigurationsApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getConfigurations(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ConfigurationsApi->getConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigurationsApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all configurations
    api_response = api_instance.getConfigurations(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ConfigurationsApi->getConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getConfigurations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getConfigurations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getConfigurations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getConfigurations-200-schema">
                                  <div id='responses-getConfigurations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ConfigurationResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getConfigurations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getConfigurations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getConfigurations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Configurations-getServiceConfigVersions">
                      <article id="api-Configurations-getServiceConfigVersions-0" data-group="User" data-name="getServiceConfigVersions" data-version="0">
                        <div class="pull-left">
                          <h1>getServiceConfigVersions</h1>
                          <p>Get all service config versions</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/configurations/service_config_versions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Configurations-getServiceConfigVersions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Configurations-getServiceConfigVersions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Configurations-getServiceConfigVersions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/configurations/service_config_versions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ConfigurationsApi;

import java.io.File;
import java.util.*;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ServiceConfigVersionResponse] result = apiInstance.getServiceConfigVersions(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#getServiceConfigVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ConfigurationsApi;

public class ConfigurationsApiExample {

    public static void main(String[] args) {
        ConfigurationsApi apiInstance = new ConfigurationsApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ServiceConfigVersionResponse] result = apiInstance.getServiceConfigVersions(clusterName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ConfigurationsApi#getServiceConfigVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ConfigurationsApi *apiInstance = [[ConfigurationsApi alloc] init];

// Get all service config versions
[apiInstance getServiceConfigVersionsWith:clusterName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ServiceConfigVersionResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ConfigurationsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getServiceConfigVersions(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getServiceConfigVersionsExample
    {
        public void main()
        {
            
            var apiInstance = new ConfigurationsApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all service config versions
                array[ServiceConfigVersionResponse] result = apiInstance.getServiceConfigVersions(clusterName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ConfigurationsApi.getServiceConfigVersions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ConfigurationsApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getServiceConfigVersions($clusterName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ConfigurationsApi->getServiceConfigVersions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ConfigurationsApi;

my $api_instance = WWW::SwaggerClient::ConfigurationsApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getServiceConfigVersions(clusterName => $clusterName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ConfigurationsApi->getServiceConfigVersions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Configurations-getServiceConfigVersions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ConfigurationsApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all service config versions
    api_response = api_instance.getServiceConfigVersions(clusterName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ConfigurationsApi->getServiceConfigVersions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServiceConfigVersions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServiceConfigVersions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getServiceConfigVersions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getServiceConfigVersions-200-schema">
                                  <div id='responses-getServiceConfigVersions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ServiceConfigVersionResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getServiceConfigVersions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getServiceConfigVersions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getServiceConfigVersions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Groups">
                  <h1>Groups</h1>
                    <div id="api-Groups-groupPrivilegeServiceGetPrivilege">
                      <article id="api-Groups-groupPrivilegeServiceGetPrivilege-0" data-group="User" data-name="groupPrivilegeServiceGetPrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>groupPrivilegeServiceGetPrivilege</h1>
                          <p>Get group privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns group privilege details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}/privileges/{privilegeId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}/privileges/{privilegeId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter group privilege details
        try {
            PrivilegeResponse result = apiInstance.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupPrivilegeServiceGetPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter group privilege details
        try {
            PrivilegeResponse result = apiInstance.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupPrivilegeServiceGetPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *privilegeId = privilegeId_example; // privilege id
String *fields = fields_example; // Filter group privilege details (optional) (default to PrivilegeInfo/*)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get group privilege
[apiInstance groupPrivilegeServiceGetPrivilegeWith:groupName
    privilegeId:privilegeId
    fields:fields
              completionHandler: ^(PrivilegeResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var privilegeId = privilegeId_example; // {String} privilege id

var opts = { 
  'fields': fields_example // {String} Filter group privilege details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupPrivilegeServiceGetPrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var privilegeId = privilegeId_example;  // String | privilege id
            var fields = fields_example;  // String | Filter group privilege details (optional)  (default to PrivilegeInfo/*)

            try
            {
                // Get group privilege
                PrivilegeResponse result = apiInstance.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupPrivilegeServiceGetPrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$privilegeId = privilegeId_example; // String | privilege id
$fields = fields_example; // String | Filter group privilege details

try {
    $result = $api_instance->groupPrivilegeServiceGetPrivilege($groupName, $privilegeId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupPrivilegeServiceGetPrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $privilegeId = privilegeId_example; # String | privilege id
my $fields = fields_example; # String | Filter group privilege details

eval { 
    my $result = $api_instance->groupPrivilegeServiceGetPrivilege(groupName => $groupName, privilegeId => $privilegeId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupPrivilegeServiceGetPrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
privilegeId = privilegeId_example # String | privilege id
fields = fields_example # String | Filter group privilege details (optional) (default to PrivilegeInfo/*)

try: 
    # Get group privilege
    api_response = api_instance.groupPrivilegeServiceGetPrivilege(groupName, privilegeId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->groupPrivilegeServiceGetPrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivilege_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivilege_groupName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">privilegeId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "privilegeId",
  "in" : "path",
  "description" : "privilege id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivilege_privilegeId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivilege_privilegeId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter group privilege details",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivilege_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivilege_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-groupPrivilegeServiceGetPrivilege-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-groupPrivilegeServiceGetPrivilege-200-schema">
                                  <div id='responses-groupPrivilegeServiceGetPrivilege-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/PrivilegeResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-groupPrivilegeServiceGetPrivilege-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-groupPrivilegeServiceGetPrivilege-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-groupPrivilegeServiceGetPrivilege-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupPrivilegeServiceGetPrivileges">
                      <article id="api-Groups-groupPrivilegeServiceGetPrivileges-0" data-group="User" data-name="groupPrivilegeServiceGetPrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>groupPrivilegeServiceGetPrivileges</h1>
                          <p>Get all privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all privileges for group.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupPrivilegeServiceGetPrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}/privileges?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter user privileges
        String sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[GroupPrivilegeResponse] result = apiInstance.groupPrivilegeServiceGetPrivileges(groupName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupPrivilegeServiceGetPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter user privileges
        String sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[GroupPrivilegeResponse] result = apiInstance.groupPrivilegeServiceGetPrivileges(groupName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupPrivilegeServiceGetPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *fields = fields_example; // Filter user privileges (optional) (default to PrivilegeInfo/*)
String *sortBy = sortBy_example; // Sort user privileges (asc | desc) (optional) (default to PrivilegeInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get all privileges
[apiInstance groupPrivilegeServiceGetPrivilegesWith:groupName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[GroupPrivilegeResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var opts = { 
  'fields': fields_example, // {String} Filter user privileges
  'sortBy': sortBy_example, // {String} Sort user privileges (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.groupPrivilegeServiceGetPrivileges(groupName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupPrivilegeServiceGetPrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var fields = fields_example;  // String | Filter user privileges (optional)  (default to PrivilegeInfo/*)
            var sortBy = sortBy_example;  // String | Sort user privileges (asc | desc) (optional)  (default to PrivilegeInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all privileges
                array[GroupPrivilegeResponse] result = apiInstance.groupPrivilegeServiceGetPrivileges(groupName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupPrivilegeServiceGetPrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$fields = fields_example; // String | Filter user privileges
$sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->groupPrivilegeServiceGetPrivileges($groupName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupPrivilegeServiceGetPrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $fields = fields_example; # String | Filter user privileges
my $sortBy = sortBy_example; # String | Sort user privileges (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->groupPrivilegeServiceGetPrivileges(groupName => $groupName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupPrivilegeServiceGetPrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupPrivilegeServiceGetPrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
fields = fields_example # String | Filter user privileges (optional) (default to PrivilegeInfo/*)
sortBy = sortBy_example # String | Sort user privileges (asc | desc) (optional) (default to PrivilegeInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all privileges
    api_response = api_instance.groupPrivilegeServiceGetPrivileges(groupName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->groupPrivilegeServiceGetPrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_groupName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user privileges",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort user privileges (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupPrivilegeServiceGetPrivileges_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupPrivilegeServiceGetPrivileges_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-groupPrivilegeServiceGetPrivileges-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-groupPrivilegeServiceGetPrivileges-200-schema">
                                  <div id='responses-groupPrivilegeServiceGetPrivileges-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/GroupPrivilegeResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-groupPrivilegeServiceGetPrivileges-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-groupPrivilegeServiceGetPrivileges-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-groupPrivilegeServiceGetPrivileges-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupServiceCreateGroup">
                      <article id="api-Groups-groupServiceCreateGroup-0" data-group="User" data-name="groupServiceCreateGroup" data-version="0">
                        <div class="pull-left">
                          <h1>groupServiceCreateGroup</h1>
                          <p>Create new group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Creates group resource.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/groups</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupServiceCreateGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceCreateGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupServiceCreateGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/groups"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        GroupRequest body = ; // GroupRequest | input parameters in json form
        try {
            apiInstance.groupServiceCreateGroup(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceCreateGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        GroupRequest body = ; // GroupRequest | input parameters in json form
        try {
            apiInstance.groupServiceCreateGroup(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceCreateGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">GroupRequest *body = ; // input parameters in json form

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Create new group
[apiInstance groupServiceCreateGroupWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var body = ; // {GroupRequest} input parameters in json form


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.groupServiceCreateGroup(body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupServiceCreateGroupExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var body = new GroupRequest(); // GroupRequest | input parameters in json form

            try
            {
                // Create new group
                apiInstance.groupServiceCreateGroup(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupServiceCreateGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$body = ; // GroupRequest | input parameters in json form

try {
    $api_instance->groupServiceCreateGroup($body);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupServiceCreateGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $body = WWW::SwaggerClient::Object::GroupRequest->new(); # GroupRequest | input parameters in json form

eval { 
    $api_instance->groupServiceCreateGroup(body => $body);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupServiceCreateGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceCreateGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
body =  # GroupRequest | input parameters in json form

try: 
    # Create new group
    api_instance.groupServiceCreateGroup(body)
except ApiException as e:
    print("Exception when calling GroupsApi->groupServiceCreateGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "description" : "input parameters in json form",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/GroupRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_groupServiceCreateGroup_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_groupServiceCreateGroup_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupServiceDeleteGroup">
                      <article id="api-Groups-groupServiceDeleteGroup-0" data-group="User" data-name="groupServiceDeleteGroup" data-version="0">
                        <div class="pull-left">
                          <h1>groupServiceDeleteGroup</h1>
                          <p>Delete group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Delete group resource.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/groups/{groupName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupServiceDeleteGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceDeleteGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupServiceDeleteGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/groups/{groupName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        try {
            apiInstance.groupServiceDeleteGroup(groupName);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceDeleteGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        try {
            apiInstance.groupServiceDeleteGroup(groupName);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceDeleteGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Delete group
[apiInstance groupServiceDeleteGroupWith:groupName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.groupServiceDeleteGroup(groupName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupServiceDeleteGroupExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name

            try
            {
                // Delete group
                apiInstance.groupServiceDeleteGroup(groupName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupServiceDeleteGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name

try {
    $api_instance->groupServiceDeleteGroup($groupName);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupServiceDeleteGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name

eval { 
    $api_instance->groupServiceDeleteGroup(groupName => $groupName);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupServiceDeleteGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceDeleteGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name

try: 
    # Delete group
    api_instance.groupServiceDeleteGroup(groupName)
except ApiException as e:
    print("Exception when calling GroupsApi->groupServiceDeleteGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceDeleteGroup_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceDeleteGroup_groupName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupServiceGetGroup">
                      <article id="api-Groups-groupServiceGetGroup-0" data-group="User" data-name="groupServiceGetGroup" data-version="0">
                        <div class="pull-left">
                          <h1>groupServiceGetGroup</h1>
                          <p>Get group</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns group details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupServiceGetGroup-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceGetGroup-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceGetGroup-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroup-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupServiceGetGroup-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter group details
        try {
            GroupResponse result = apiInstance.groupServiceGetGroup(groupName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceGetGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter group details
        try {
            GroupResponse result = apiInstance.groupServiceGetGroup(groupName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceGetGroup");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *fields = fields_example; // Filter group details (optional) (default to Groups)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get group
[apiInstance groupServiceGetGroupWith:groupName
    fields:fields
              completionHandler: ^(GroupResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var opts = { 
  'fields': fields_example // {String} Filter group details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.groupServiceGetGroup(groupName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupServiceGetGroupExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var fields = fields_example;  // String | Filter group details (optional)  (default to Groups)

            try
            {
                // Get group
                GroupResponse result = apiInstance.groupServiceGetGroup(groupName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupServiceGetGroup: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$fields = fields_example; // String | Filter group details

try {
    $result = $api_instance->groupServiceGetGroup($groupName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupServiceGetGroup: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $fields = fields_example; # String | Filter group details

eval { 
    my $result = $api_instance->groupServiceGetGroup(groupName => $groupName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupServiceGetGroup: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroup-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
fields = fields_example # String | Filter group details (optional) (default to Groups)

try: 
    # Get group
    api_response = api_instance.groupServiceGetGroup(groupName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->groupServiceGetGroup: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroup_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroup_groupName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter group details",
  "required" : false,
  "type" : "string",
  "default" : "Groups"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroup_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroup_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful retrieval of group resource </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-groupServiceGetGroup-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-groupServiceGetGroup-200-schema">
                                  <div id='responses-groupServiceGetGroup-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful retrieval of group resource",
  "schema" : {
    "$ref" : "#/definitions/GroupResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-groupServiceGetGroup-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-groupServiceGetGroup-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-groupServiceGetGroup-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-groupServiceGetGroups">
                      <article id="api-Groups-groupServiceGetGroups-0" data-group="User" data-name="groupServiceGetGroups" data-version="0">
                        <div class="pull-left">
                          <h1>groupServiceGetGroups</h1>
                          <p>Get all groups</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns details of all groups.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-groupServiceGetGroups-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceGetGroups-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-groupServiceGetGroups-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-groupServiceGetGroups-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-groupServiceGetGroups-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String fields = fields_example; // String | Filter group details
        String sortBy = sortBy_example; // String | Sort groups (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[GroupResponse] result = apiInstance.groupServiceGetGroups(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceGetGroups");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String fields = fields_example; // String | Filter group details
        String sortBy = sortBy_example; // String | Sort groups (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[GroupResponse] result = apiInstance.groupServiceGetGroups(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#groupServiceGetGroups");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter group details (optional) (default to Groups/*)
String *sortBy = sortBy_example; // Sort groups (asc | desc) (optional) (default to Groups/group_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get all groups
[apiInstance groupServiceGetGroupsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[GroupResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var opts = { 
  'fields': fields_example, // {String} Filter group details
  'sortBy': sortBy_example, // {String} Sort groups (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.groupServiceGetGroups(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class groupServiceGetGroupsExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var fields = fields_example;  // String | Filter group details (optional)  (default to Groups/*)
            var sortBy = sortBy_example;  // String | Sort groups (asc | desc) (optional)  (default to Groups/group_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all groups
                array[GroupResponse] result = apiInstance.groupServiceGetGroups(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.groupServiceGetGroups: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$fields = fields_example; // String | Filter group details
$sortBy = sortBy_example; // String | Sort groups (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->groupServiceGetGroups($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->groupServiceGetGroups: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $fields = fields_example; # String | Filter group details
my $sortBy = sortBy_example; # String | Sort groups (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->groupServiceGetGroups(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->groupServiceGetGroups: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-groupServiceGetGroups-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
fields = fields_example # String | Filter group details (optional) (default to Groups/*)
sortBy = sortBy_example # String | Sort groups (asc | desc) (optional) (default to Groups/group_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all groups
    api_response = api_instance.groupServiceGetGroups(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->groupServiceGetGroups: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter group details",
  "required" : false,
  "type" : "string",
  "default" : "Groups/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort groups (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Groups/group_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_groupServiceGetGroups_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_groupServiceGetGroups_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful retrieval of all group entries </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-groupServiceGetGroups-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-groupServiceGetGroups-200-schema">
                                  <div id='responses-groupServiceGetGroups-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful retrieval of all group entries",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/GroupResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-groupServiceGetGroups-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-groupServiceGetGroups-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-groupServiceGetGroups-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-memberServiceDeleteMember">
                      <article id="api-Groups-memberServiceDeleteMember-0" data-group="User" data-name="memberServiceDeleteMember" data-version="0">
                        <div class="pull-left">
                          <h1>memberServiceDeleteMember</h1>
                          <p>Delete group member</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Delete member resource.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/groups/{groupName}/members/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-memberServiceDeleteMember-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceDeleteMember-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-memberServiceDeleteMember-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/groups/{groupName}/members/{userName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String userName = userName_example; // String | user name
        try {
            apiInstance.memberServiceDeleteMember(groupName, userName);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceDeleteMember");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String userName = userName_example; // String | user name
        try {
            apiInstance.memberServiceDeleteMember(groupName, userName);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceDeleteMember");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *userName = userName_example; // user name

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Delete group member
[apiInstance memberServiceDeleteMemberWith:groupName
    userName:userName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var userName = userName_example; // {String} user name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.memberServiceDeleteMember(groupName, userName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class memberServiceDeleteMemberExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var userName = userName_example;  // String | user name

            try
            {
                // Delete group member
                apiInstance.memberServiceDeleteMember(groupName, userName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.memberServiceDeleteMember: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$userName = userName_example; // String | user name

try {
    $api_instance->memberServiceDeleteMember($groupName, $userName);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->memberServiceDeleteMember: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $userName = userName_example; # String | user name

eval { 
    $api_instance->memberServiceDeleteMember(groupName => $groupName, userName => $userName);
};
if ($@) {
    warn "Exception when calling GroupsApi->memberServiceDeleteMember: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceDeleteMember-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
userName = userName_example # String | user name

try: 
    # Delete group member
    api_instance.memberServiceDeleteMember(groupName, userName)
except ApiException as e:
    print("Exception when calling GroupsApi->memberServiceDeleteMember: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceDeleteMember_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceDeleteMember_groupName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceDeleteMember_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceDeleteMember_userName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-memberServiceGetMember">
                      <article id="api-Groups-memberServiceGetMember-0" data-group="User" data-name="memberServiceGetMember" data-version="0">
                        <div class="pull-left">
                          <h1>memberServiceGetMember</h1>
                          <p>Get group member</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns member details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}/members/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-memberServiceGetMember-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceGetMember-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceGetMember-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMember-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-memberServiceGetMember-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}/members/{userName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter member details
        try {
            MemberResponse result = apiInstance.memberServiceGetMember(groupName, userName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceGetMember");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter member details
        try {
            MemberResponse result = apiInstance.memberServiceGetMember(groupName, userName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceGetMember");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *userName = userName_example; // user name
String *fields = fields_example; // Filter member details (optional) (default to MemberInfo)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get group member
[apiInstance memberServiceGetMemberWith:groupName
    userName:userName
    fields:fields
              completionHandler: ^(MemberResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example // {String} Filter member details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.memberServiceGetMember(groupName, userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class memberServiceGetMemberExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter member details (optional)  (default to MemberInfo)

            try
            {
                // Get group member
                MemberResponse result = apiInstance.memberServiceGetMember(groupName, userName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.memberServiceGetMember: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter member details

try {
    $result = $api_instance->memberServiceGetMember($groupName, $userName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->memberServiceGetMember: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter member details

eval { 
    my $result = $api_instance->memberServiceGetMember(groupName => $groupName, userName => $userName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->memberServiceGetMember: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMember-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
userName = userName_example # String | user name
fields = fields_example # String | Filter member details (optional) (default to MemberInfo)

try: 
    # Get group member
    api_response = api_instance.memberServiceGetMember(groupName, userName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->memberServiceGetMember: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMember_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMember_groupName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMember_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMember_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter member details",
  "required" : false,
  "type" : "string",
  "default" : "MemberInfo"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMember_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMember_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-memberServiceGetMember-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-memberServiceGetMember-200-schema">
                                  <div id='responses-memberServiceGetMember-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/MemberResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-memberServiceGetMember-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-memberServiceGetMember-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-memberServiceGetMember-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-memberServiceGetMembers">
                      <article id="api-Groups-memberServiceGetMembers-0" data-group="User" data-name="memberServiceGetMembers" data-version="0">
                        <div class="pull-left">
                          <h1>memberServiceGetMembers</h1>
                          <p>Get all group members</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns details of all members.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/groups/{groupName}/members</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-memberServiceGetMembers-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceGetMembers-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceGetMembers-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceGetMembers-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-memberServiceGetMembers-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/groups/{groupName}/members?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter member details
        String sortBy = sortBy_example; // String | Sort members (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[MemberResponse] result = apiInstance.memberServiceGetMembers(groupName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceGetMembers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        String fields = fields_example; // String | Filter member details
        String sortBy = sortBy_example; // String | Sort members (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[MemberResponse] result = apiInstance.memberServiceGetMembers(groupName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceGetMembers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
String *fields = fields_example; // Filter member details (optional) (default to MemberInfo/*)
String *sortBy = sortBy_example; // Sort members (asc | desc) (optional) (default to MemberInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Get all group members
[apiInstance memberServiceGetMembersWith:groupName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[MemberResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var opts = { 
  'fields': fields_example, // {String} Filter member details
  'sortBy': sortBy_example, // {String} Sort members (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.memberServiceGetMembers(groupName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class memberServiceGetMembersExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var fields = fields_example;  // String | Filter member details (optional)  (default to MemberInfo/*)
            var sortBy = sortBy_example;  // String | Sort members (asc | desc) (optional)  (default to MemberInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all group members
                array[MemberResponse] result = apiInstance.memberServiceGetMembers(groupName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.memberServiceGetMembers: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$fields = fields_example; // String | Filter member details
$sortBy = sortBy_example; // String | Sort members (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->memberServiceGetMembers($groupName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->memberServiceGetMembers: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $fields = fields_example; # String | Filter member details
my $sortBy = sortBy_example; # String | Sort members (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->memberServiceGetMembers(groupName => $groupName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling GroupsApi->memberServiceGetMembers: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceGetMembers-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
fields = fields_example # String | Filter member details (optional) (default to MemberInfo/*)
sortBy = sortBy_example # String | Sort members (asc | desc) (optional) (default to MemberInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all group members
    api_response = api_instance.memberServiceGetMembers(groupName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling GroupsApi->memberServiceGetMembers: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_groupName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter member details",
  "required" : false,
  "type" : "string",
  "default" : "MemberInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort members (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "MemberInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceGetMembers_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceGetMembers_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-memberServiceGetMembers-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-memberServiceGetMembers-200-schema">
                                  <div id='responses-memberServiceGetMembers-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/MemberResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-memberServiceGetMembers-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-memberServiceGetMembers-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-memberServiceGetMembers-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Groups-memberServiceUpdateMembers">
                      <article id="api-Groups-memberServiceUpdateMembers-0" data-group="User" data-name="memberServiceUpdateMembers" data-version="0">
                        <div class="pull-left">
                          <h1>memberServiceUpdateMembers</h1>
                          <p>Update group members</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Updates group member resources.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/groups/{groupName}/members</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Groups-memberServiceUpdateMembers-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-java">Java</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Groups-memberServiceUpdateMembers-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Groups-memberServiceUpdateMembers-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/groups/{groupName}/members"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.GroupsApi;

import java.io.File;
import java.util.*;

public class GroupsApiExample {

    public static void main(String[] args) {
        
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        MemberRequest body = ; // MemberRequest | input parameters in json form
        try {
            apiInstance.memberServiceUpdateMembers(groupName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceUpdateMembers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.GroupsApi;

public class GroupsApiExample {

    public static void main(String[] args) {
        GroupsApi apiInstance = new GroupsApi();
        String groupName = groupName_example; // String | group name
        MemberRequest body = ; // MemberRequest | input parameters in json form
        try {
            apiInstance.memberServiceUpdateMembers(groupName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling GroupsApi#memberServiceUpdateMembers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *groupName = groupName_example; // group name
MemberRequest *body = ; // input parameters in json form

GroupsApi *apiInstance = [[GroupsApi alloc] init];

// Update group members
[apiInstance memberServiceUpdateMembersWith:groupName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.GroupsApi()

var groupName = groupName_example; // {String} group name

var body = ; // {MemberRequest} input parameters in json form


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.memberServiceUpdateMembers(groupName, body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class memberServiceUpdateMembersExample
    {
        public void main()
        {
            
            var apiInstance = new GroupsApi();
            var groupName = groupName_example;  // String | group name
            var body = new MemberRequest(); // MemberRequest | input parameters in json form

            try
            {
                // Update group members
                apiInstance.memberServiceUpdateMembers(groupName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling GroupsApi.memberServiceUpdateMembers: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\GroupsApi();
$groupName = groupName_example; // String | group name
$body = ; // MemberRequest | input parameters in json form

try {
    $api_instance->memberServiceUpdateMembers($groupName, $body);
} catch (Exception $e) {
    echo 'Exception when calling GroupsApi->memberServiceUpdateMembers: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::GroupsApi;

my $api_instance = WWW::SwaggerClient::GroupsApi->new();
my $groupName = groupName_example; # String | group name
my $body = WWW::SwaggerClient::Object::MemberRequest->new(); # MemberRequest | input parameters in json form

eval { 
    $api_instance->memberServiceUpdateMembers(groupName => $groupName, body => $body);
};
if ($@) {
    warn "Exception when calling GroupsApi->memberServiceUpdateMembers: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Groups-memberServiceUpdateMembers-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.GroupsApi()
groupName = groupName_example # String | group name
body =  # MemberRequest | input parameters in json form

try: 
    # Update group members
    api_instance.memberServiceUpdateMembers(groupName, body)
except ApiException as e:
    print("Exception when calling GroupsApi->memberServiceUpdateMembers: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">groupName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "groupName",
  "in" : "path",
  "description" : "group name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_memberServiceUpdateMembers_groupName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_memberServiceUpdateMembers_groupName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "description" : "input parameters in json form",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/MemberRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_memberServiceUpdateMembers_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_memberServiceUpdateMembers_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-HostComponents">
                  <h1>HostComponents</h1>
                    <div id="api-HostComponents-createHostComponent">
                      <article id="api-HostComponents-createHostComponent-0" data-group="User" data-name="createHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>createHostComponent</h1>
                          <p>Create new host component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-createHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-createHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-createHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-createHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-createHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceComponentHostResponse body = ; // ServiceComponentHostResponse | 
        try {
            apiInstance.createHostComponent(hostComponentName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#createHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceComponentHostResponse body = ; // ServiceComponentHostResponse | 
        try {
            apiInstance.createHostComponent(hostComponentName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#createHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 
ServiceComponentHostResponse *body = ; //  (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Create new host component
[apiInstance createHostComponentWith:hostComponentName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ServiceComponentHostResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createHostComponent(hostComponentName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-createHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ServiceComponentHostResponse(); // ServiceComponentHostResponse |  (optional) 

            try
            {
                // Create new host component
                apiInstance.createHostComponent(hostComponentName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.createHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ServiceComponentHostResponse | 

try {
    $api_instance->createHostComponent($hostComponentName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->createHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ServiceComponentHostResponse->new(); # ServiceComponentHostResponse | 

eval { 
    $api_instance->createHostComponent(hostComponentName => $hostComponentName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->createHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-createHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 
body =  # ServiceComponentHostResponse |  (optional)

try: 
    # Create new host component
    api_instance.createHostComponent(hostComponentName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling HostComponentsApi->createHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createHostComponent_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createHostComponent_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createHostComponent_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createHostComponent_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ServiceComponentHostResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createHostComponent_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createHostComponent_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-deleteHostComponent">
                      <article id="api-HostComponents-deleteHostComponent-0" data-group="User" data-name="deleteHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>deleteHostComponent</h1>
                          <p>Delete host component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-deleteHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-deleteHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-deleteHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-deleteHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteHostComponent(hostComponentName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#deleteHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteHostComponent(hostComponentName, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#deleteHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Delete host component
[apiInstance deleteHostComponentWith:hostComponentName
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteHostComponent(hostComponentName, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Delete host component
                apiInstance.deleteHostComponent(hostComponentName, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.deleteHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteHostComponent($hostComponentName, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->deleteHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteHostComponent(hostComponentName => $hostComponentName, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->deleteHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Delete host component
    api_instance.deleteHostComponent(hostComponentName, clusterName)
except ApiException as e:
    print("Exception when calling HostComponentsApi->deleteHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteHostComponent_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteHostComponent_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteHostComponent_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteHostComponent_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-deleteHostComponents">
                      <article id="api-HostComponents-deleteHostComponents-0" data-group="User" data-name="deleteHostComponents" data-version="0">
                        <div class="pull-left">
                          <h1>deleteHostComponents</h1>
                          <p>Delete host components</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/host_components</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-deleteHostComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-deleteHostComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-deleteHostComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-deleteHostComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-deleteHostComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/host_components"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteHostComponents(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#deleteHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteHostComponents(clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#deleteHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Delete host components
[apiInstance deleteHostComponentsWith:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteHostComponents(clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteHostComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Delete host components
                apiInstance.deleteHostComponents(clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.deleteHostComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteHostComponents($clusterName);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->deleteHostComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteHostComponents(clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->deleteHostComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-deleteHostComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
clusterName = clusterName_example # String | 

try: 
    # Delete host components
    api_instance.deleteHostComponents(clusterName)
except ApiException as e:
    print("Exception when calling HostComponentsApi->deleteHostComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteHostComponents_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteHostComponents_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-getHostComponent">
                      <article id="api-HostComponents-getHostComponent-0" data-group="User" data-name="getHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>getHostComponent</h1>
                          <p>Get single host component for a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-getHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-getHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}?format=&fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String format = format_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostComponentSwagger result = apiInstance.getHostComponent(hostComponentName, clusterName, format, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String format = format_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostComponentSwagger result = apiInstance.getHostComponent(hostComponentName, clusterName, format, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 
String *format = format_example; //  (optional)
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Get single host component for a host
[apiInstance getHostComponentWith:hostComponentName
    clusterName:clusterName
    format:format
    fields:fields
              completionHandler: ^(HostComponentSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'format': format_example, // {String} 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getHostComponent(hostComponentName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-getHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var format = format_example;  // String |  (optional) 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 

            try
            {
                // Get single host component for a host
                HostComponentSwagger result = apiInstance.getHostComponent(hostComponentName, clusterName, format, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.getHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 
$format = format_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getHostComponent($hostComponentName, $clusterName, $format, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->getHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $format = format_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getHostComponent(hostComponentName => $hostComponentName, clusterName => $clusterName, format => $format, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->getHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 
format = format_example # String |  (optional)
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)

try: 
    # Get single host component for a host
    api_response = api_instance.getHostComponent(hostComponentName, clusterName, format=format, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostComponentsApi->getHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponent_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponent_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponent_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponent_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">format</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "format",
  "in" : "query",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponent_format');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponent_format"></div>
</td>
</tr>

                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponent_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponent_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getHostComponent-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getHostComponent-200-schema">
                                  <div id='responses-getHostComponent-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/HostComponentSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getHostComponent-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getHostComponent-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getHostComponent-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-getHostComponents">
                      <article id="api-HostComponents-getHostComponents-0" data-group="User" data-name="getHostComponents" data-version="0">
                        <div class="pull-left">
                          <h1>getHostComponents</h1>
                          <p>Get all host components for a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/host_components</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-getHostComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getHostComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getHostComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-getHostComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-getHostComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/host_components?format=&fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String clusterName = clusterName_example; // String | 
        String format = format_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[HostComponentSwagger] result = apiInstance.getHostComponents(clusterName, format, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String clusterName = clusterName_example; // String | 
        String format = format_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[HostComponentSwagger] result = apiInstance.getHostComponents(clusterName, format, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *format = format_example; //  (optional)
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Get all host components for a host
[apiInstance getHostComponentsWith:clusterName
    format:format
    fields:fields
              completionHandler: ^(array[HostComponentSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'format': format_example, // {String} 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getHostComponents(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-getHostComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getHostComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var clusterName = clusterName_example;  // String | 
            var format = format_example;  // String |  (optional) 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 

            try
            {
                // Get all host components for a host
                array[HostComponentSwagger] result = apiInstance.getHostComponents(clusterName, format, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.getHostComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$clusterName = clusterName_example; // String | 
$format = format_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getHostComponents($clusterName, $format, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->getHostComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $clusterName = clusterName_example; # String | 
my $format = format_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getHostComponents(clusterName => $clusterName, format => $format, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->getHostComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getHostComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
clusterName = clusterName_example # String | 
format = format_example # String |  (optional)
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)

try: 
    # Get all host components for a host
    api_response = api_instance.getHostComponents(clusterName, format=format, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostComponentsApi->getHostComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponents_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponents_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">format</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "format",
  "in" : "query",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponents_format');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponents_format"></div>
</td>
</tr>

                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHostComponents_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHostComponents_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getHostComponents-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getHostComponents-200-schema">
                                  <div id='responses-getHostComponents-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/HostComponentSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getHostComponents-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getHostComponents-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getHostComponents-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-getProcesses">
                      <article id="api-HostComponents-getProcesses-0" data-group="User" data-name="getProcesses" data-version="0">
                        <div class="pull-left">
                          <h1>getProcesses</h1>
                          <p>Get processes of a specific host component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}/processes</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-getProcesses-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getProcesses-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-getProcesses-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-getProcesses-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-getProcesses-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}/processes?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-getProcesses-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostComponentProcessResponse result = apiInstance.getProcesses(hostComponentName, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getProcesses");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-getProcesses-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostComponentProcessResponse result = apiInstance.getProcesses(hostComponentName, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#getProcesses");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-getProcesses-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Get processes of a specific host component
[apiInstance getProcessesWith:hostComponentName
    clusterName:clusterName
    fields:fields
              completionHandler: ^(HostComponentProcessResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getProcesses(hostComponentName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-getProcesses-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getProcessesExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 

            try
            {
                // Get processes of a specific host component
                HostComponentProcessResponse result = apiInstance.getProcesses(hostComponentName, clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.getProcesses: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getProcesses($hostComponentName, $clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->getProcesses: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getProcesses(hostComponentName => $hostComponentName, clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->getProcesses: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-getProcesses-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)

try: 
    # Get processes of a specific host component
    api_response = api_instance.getProcesses(hostComponentName, clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostComponentsApi->getProcesses: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getProcesses_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getProcesses_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getProcesses_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getProcesses_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getProcesses_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getProcesses_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getProcesses-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getProcesses-200-schema">
                                  <div id='responses-getProcesses-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/HostComponentProcessResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getProcesses-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getProcesses-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getProcesses-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-HostComponents-updateHostComponent">
                      <article id="api-HostComponents-updateHostComponent-0" data-group="User" data-name="updateHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>updateHostComponent</h1>
                          <p>Update host component detail</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/clusters/{clusterName}/host_components/{hostComponentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-HostComponents-updateHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-updateHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-HostComponents-updateHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-HostComponents-updateHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-HostComponents-updateHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/clusters/{clusterName}/host_components/{hostComponentName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostComponentsApi;

import java.io.File;
import java.util.*;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceComponentHostResponse body = ; // ServiceComponentHostResponse | 
        try {
            apiInstance.updateHostComponent(hostComponentName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#updateHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostComponentsApi;

public class HostComponentsApiExample {

    public static void main(String[] args) {
        HostComponentsApi apiInstance = new HostComponentsApi();
        String hostComponentName = hostComponentName_example; // String | 
        String clusterName = clusterName_example; // String | 
        ServiceComponentHostResponse body = ; // ServiceComponentHostResponse | 
        try {
            apiInstance.updateHostComponent(hostComponentName, clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostComponentsApi#updateHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostComponentName = hostComponentName_example; // 
String *clusterName = clusterName_example; // 
ServiceComponentHostResponse *body = ; //  (optional)

HostComponentsApi *apiInstance = [[HostComponentsApi alloc] init];

// Update host component detail
[apiInstance updateHostComponentWith:hostComponentName
    clusterName:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostComponentsApi()

var hostComponentName = hostComponentName_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {ServiceComponentHostResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateHostComponent(hostComponentName, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new HostComponentsApi();
            var hostComponentName = hostComponentName_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var body = new ServiceComponentHostResponse(); // ServiceComponentHostResponse |  (optional) 

            try
            {
                // Update host component detail
                apiInstance.updateHostComponent(hostComponentName, clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostComponentsApi.updateHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostComponentsApi();
$hostComponentName = hostComponentName_example; // String | 
$clusterName = clusterName_example; // String | 
$body = ; // ServiceComponentHostResponse | 

try {
    $api_instance->updateHostComponent($hostComponentName, $clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling HostComponentsApi->updateHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostComponentsApi;

my $api_instance = WWW::SwaggerClient::HostComponentsApi->new();
my $hostComponentName = hostComponentName_example; # String | 
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::ServiceComponentHostResponse->new(); # ServiceComponentHostResponse | 

eval { 
    $api_instance->updateHostComponent(hostComponentName => $hostComponentName, clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling HostComponentsApi->updateHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-HostComponents-updateHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostComponentsApi()
hostComponentName = hostComponentName_example # String | 
clusterName = clusterName_example # String | 
body =  # ServiceComponentHostResponse |  (optional)

try: 
    # Update host component detail
    api_instance.updateHostComponent(hostComponentName, clusterName, body=body)
except ApiException as e:
    print("Exception when calling HostComponentsApi->updateHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostComponentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateHostComponent_hostComponentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateHostComponent_hostComponentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateHostComponent_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateHostComponent_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ServiceComponentHostResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateHostComponent_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateHostComponent_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Hosts">
                  <h1>Hosts</h1>
                    <div id="api-Hosts-createHost">
                      <article id="api-Hosts-createHost-0" data-group="User" data-name="createHost" data-version="0">
                        <div class="pull-left">
                          <h1>createHost</h1>
                          <p>Creates a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-createHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-createHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-createHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-createHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-createHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-createHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-createHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/hosts/{hostName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-createHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.createHost(hostName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#createHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-createHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.createHost(hostName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#createHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-createHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-createHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name
HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Creates a host
[apiInstance createHostWith:hostName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var hostName = hostName_example; // {String} host name

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createHost(hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-createHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-createHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createHostExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var hostName = hostName_example;  // String | host name
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Creates a host
                apiInstance.createHost(hostName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.createHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$hostName = hostName_example; // String | host name
$body = ; // HostRequest | 

try {
    $api_instance->createHost($hostName, $body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->createHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $hostName = hostName_example; # String | host name
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->createHost(hostName => $hostName, body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->createHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
hostName = hostName_example # String | host name
body =  # HostRequest |  (optional)

try: 
    # Creates a host
    api_instance.createHost(hostName, body=body)
except ApiException as e:
    print("Exception when calling HostsApi->createHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createHost_hostName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createHost_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createHost_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - Attempt to create a host which already exists </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-createHosts">
                      <article id="api-Hosts-createHosts-0" data-group="User" data-name="createHosts" data-version="0">
                        <div class="pull-left">
                          <h1>createHosts</h1>
                          <p>Creates multiple hosts in a single request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-createHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-createHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-createHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-createHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-createHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-createHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-createHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/hosts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-createHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.createHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#createHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-createHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.createHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#createHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-createHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-createHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Creates multiple hosts in a single request
[apiInstance createHostsWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-createHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-createHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createHostsExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Creates multiple hosts in a single request
                apiInstance.createHosts(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.createHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$body = ; // HostRequest | 

try {
    $api_instance->createHosts($body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->createHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->createHosts(body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->createHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-createHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
body =  # HostRequest |  (optional)

try: 
    # Creates multiple hosts in a single request
    api_instance.createHosts(body=body)
except ApiException as e:
    print("Exception when calling HostsApi->createHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createHosts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createHosts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Attempt to add hosts that have not been registered </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - Attempt to create a host which already exists </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-deleteHost">
                      <article id="api-Hosts-deleteHost-0" data-group="User" data-name="deleteHost" data-version="0">
                        <div class="pull-left">
                          <h1>deleteHost</h1>
                          <p>Deletes a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-deleteHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-deleteHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-deleteHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-deleteHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-deleteHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-deleteHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/hosts/{hostName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-deleteHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        try {
            apiInstance.deleteHost(hostName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#deleteHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-deleteHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        try {
            apiInstance.deleteHost(hostName);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#deleteHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-deleteHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name

HostsApi *apiInstance = [[HostsApi alloc] init];

// Deletes a host
[apiInstance deleteHostWith:hostName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var hostName = hostName_example; // {String} host name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteHost(hostName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-deleteHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteHostExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var hostName = hostName_example;  // String | host name

            try
            {
                // Deletes a host
                apiInstance.deleteHost(hostName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.deleteHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$hostName = hostName_example; // String | host name

try {
    $api_instance->deleteHost($hostName);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->deleteHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $hostName = hostName_example; # String | host name

eval { 
    $api_instance->deleteHost(hostName => $hostName);
};
if ($@) {
    warn "Exception when calling HostsApi->deleteHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
hostName = hostName_example # String | host name

try: 
    # Deletes a host
    api_instance.deleteHost(hostName)
except ApiException as e:
    print("Exception when calling HostsApi->deleteHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteHost_hostName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-deleteHosts">
                      <article id="api-Hosts-deleteHosts-0" data-group="User" data-name="deleteHosts" data-version="0">
                        <div class="pull-left">
                          <h1>deleteHosts</h1>
                          <p>Deletes multiple hosts in a single request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-deleteHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-deleteHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-deleteHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-deleteHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-deleteHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/hosts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-deleteHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.deleteHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#deleteHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-deleteHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.deleteHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#deleteHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-deleteHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Deletes multiple hosts in a single request
[apiInstance deleteHostsWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-deleteHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteHostsExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Deletes multiple hosts in a single request
                apiInstance.deleteHosts(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.deleteHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$body = ; // HostRequest | 

try {
    $api_instance->deleteHosts($body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->deleteHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->deleteHosts(body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->deleteHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-deleteHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
body =  # HostRequest |  (optional)

try: 
    # Deletes multiple hosts in a single request
    api_instance.deleteHosts(body=body)
except ApiException as e:
    print("Exception when calling HostsApi->deleteHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_deleteHosts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_deleteHosts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-getHost">
                      <article id="api-Hosts-getHost-0" data-group="User" data-name="getHost" data-version="0">
                        <div class="pull-left">
                          <h1>getHost</h1>
                          <p>Returns information about a single host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-getHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-getHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-getHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-getHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-getHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-getHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-getHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/hosts/{hostName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-getHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostResponseWrapper result = apiInstance.getHost(hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#getHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-getHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostResponseWrapper result = apiInstance.getHost(hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#getHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-getHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-getHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Returns information about a single host
[apiInstance getHostWith:hostName
    fields:fields
              completionHandler: ^(HostResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var hostName = hostName_example; // {String} host name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getHost(hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-getHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-getHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getHostExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var hostName = hostName_example;  // String | host name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional) 

            try
            {
                // Returns information about a single host
                HostResponseWrapper result = apiInstance.getHost(hostName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.getHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$hostName = hostName_example; // String | host name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getHost($hostName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->getHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $hostName = hostName_example; # String | host name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getHost(hostName => $hostName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostsApi->getHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
hostName = hostName_example # String | host name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional)

try: 
    # Returns information about a single host
    api_response = api_instance.getHost(hostName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostsApi->getHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHost_hostName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHost_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHost_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getHost-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getHost-200-schema">
                                  <div id='responses-getHost-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/HostResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getHost-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getHost-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getHost-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-getHosts">
                      <article id="api-Hosts-getHosts-0" data-group="User" data-name="getHosts" data-version="0">
                        <div class="pull-left">
                          <h1>getHosts</h1>
                          <p>Returns a collection of all hosts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-getHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-getHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-getHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-getHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-getHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-getHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-getHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/hosts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-getHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[HostResponseWrapper] result = apiInstance.getHosts(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#getHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-getHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[HostResponseWrapper] result = apiInstance.getHosts(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#getHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-getHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-getHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Hosts/host_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Returns a collection of all hosts
[apiInstance getHostsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[HostResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-getHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-getHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getHostsExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Hosts/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Hosts/host_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns a collection of all hosts
                array[HostResponseWrapper] result = apiInstance.getHosts(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.getHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getHosts($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->getHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getHosts(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling HostsApi->getHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-getHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Hosts/host_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns a collection of all hosts
    api_response = api_instance.getHosts(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling HostsApi->getHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Hosts/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Hosts/host_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getHosts_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getHosts_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getHosts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getHosts-200-schema">
                                  <div id='responses-getHosts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/HostResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getHosts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getHosts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getHosts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-updateHost">
                      <article id="api-Hosts-updateHost-0" data-group="User" data-name="updateHost" data-version="0">
                        <div class="pull-left">
                          <h1>updateHost</h1>
                          <p>Updates a host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-updateHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-updateHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-updateHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-updateHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-updateHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-updateHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-updateHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/hosts/{hostName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-updateHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.updateHost(hostName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#updateHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-updateHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        String hostName = hostName_example; // String | host name
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.updateHost(hostName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#updateHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-updateHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-updateHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name
HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Updates a host
[apiInstance updateHostWith:hostName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var hostName = hostName_example; // {String} host name

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateHost(hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-updateHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-updateHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateHostExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var hostName = hostName_example;  // String | host name
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Updates a host
                apiInstance.updateHost(hostName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.updateHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$hostName = hostName_example; // String | host name
$body = ; // HostRequest | 

try {
    $api_instance->updateHost($hostName, $body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->updateHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $hostName = hostName_example; # String | host name
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->updateHost(hostName => $hostName, body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->updateHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
hostName = hostName_example # String | host name
body =  # HostRequest |  (optional)

try: 
    # Updates a host
    api_instance.updateHost(hostName, body=body)
except ApiException as e:
    print("Exception when calling HostsApi->updateHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateHost_hostName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateHost_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateHost_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Hosts-updateHosts">
                      <article id="api-Hosts-updateHosts-0" data-group="User" data-name="updateHosts" data-version="0">
                        <div class="pull-left">
                          <h1>updateHosts</h1>
                          <p>Updates multiple hosts in a single request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Hosts-updateHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Hosts-updateHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Hosts-updateHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Hosts-updateHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Hosts-updateHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Hosts-updateHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Hosts-updateHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/hosts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Hosts-updateHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.HostsApi;

import java.io.File;
import java.util.*;

public class HostsApiExample {

    public static void main(String[] args) {
        
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.updateHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#updateHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Hosts-updateHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.HostsApi;

public class HostsApiExample {

    public static void main(String[] args) {
        HostsApi apiInstance = new HostsApi();
        HostRequest body = ; // HostRequest | 
        try {
            apiInstance.updateHosts(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling HostsApi#updateHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Hosts-updateHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">HostRequest *body = ; //  (optional)

HostsApi *apiInstance = [[HostsApi alloc] init];

// Updates multiple hosts in a single request
[apiInstance updateHostsWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.HostsApi()

var opts = { 
  'body':  // {HostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Hosts-updateHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateHostsExample
    {
        public void main()
        {
            
            var apiInstance = new HostsApi();
            var body = new HostRequest(); // HostRequest |  (optional) 

            try
            {
                // Updates multiple hosts in a single request
                apiInstance.updateHosts(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling HostsApi.updateHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\HostsApi();
$body = ; // HostRequest | 

try {
    $api_instance->updateHosts($body);
} catch (Exception $e) {
    echo 'Exception when calling HostsApi->updateHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::HostsApi;

my $api_instance = WWW::SwaggerClient::HostsApi->new();
my $body = WWW::SwaggerClient::Object::HostRequest->new(); # HostRequest | 

eval { 
    $api_instance->updateHosts(body => $body);
};
if ($@) {
    warn "Exception when calling HostsApi->updateHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Hosts-updateHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.HostsApi()
body =  # HostRequest |  (optional)

try: 
    # Updates multiple hosts in a single request
    api_instance.updateHosts(body=body)
except ApiException as e:
    print("Exception when calling HostsApi->updateHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/HostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateHosts_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateHosts_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-RequestSchedules">
                  <h1>RequestSchedules</h1>
                    <div id="api-RequestSchedules-createRequestSchedule">
                      <article id="api-RequestSchedules-createRequestSchedule-0" data-group="User" data-name="createRequestSchedule" data-version="0">
                        <div class="pull-left">
                          <h1>createRequestSchedule</h1>
                          <p>Create new request schedule</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/clusters/{clusterName}/request_schedules</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RequestSchedules-createRequestSchedule-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-java">Java</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-createRequestSchedule-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RequestSchedules-createRequestSchedule-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/clusters/{clusterName}/request_schedules"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestSchedulesApi;

import java.io.File;
import java.util.*;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String clusterName = clusterName_example; // String | 
        RequestScheduleRequestSwagger body = ; // RequestScheduleRequestSwagger | 
        try {
            apiInstance.createRequestSchedule(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#createRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestSchedulesApi;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String clusterName = clusterName_example; // String | 
        RequestScheduleRequestSwagger body = ; // RequestScheduleRequestSwagger | 
        try {
            apiInstance.createRequestSchedule(clusterName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#createRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
RequestScheduleRequestSwagger *body = ; //  (optional)

RequestSchedulesApi *apiInstance = [[RequestSchedulesApi alloc] init];

// Create new request schedule
[apiInstance createRequestScheduleWith:clusterName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestSchedulesApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'body':  // {RequestScheduleRequestSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createRequestSchedule(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createRequestScheduleExample
    {
        public void main()
        {
            
            var apiInstance = new RequestSchedulesApi();
            var clusterName = clusterName_example;  // String | 
            var body = new RequestScheduleRequestSwagger(); // RequestScheduleRequestSwagger |  (optional) 

            try
            {
                // Create new request schedule
                apiInstance.createRequestSchedule(clusterName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestSchedulesApi.createRequestSchedule: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestSchedulesApi();
$clusterName = clusterName_example; // String | 
$body = ; // RequestScheduleRequestSwagger | 

try {
    $api_instance->createRequestSchedule($clusterName, $body);
} catch (Exception $e) {
    echo 'Exception when calling RequestSchedulesApi->createRequestSchedule: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestSchedulesApi;

my $api_instance = WWW::SwaggerClient::RequestSchedulesApi->new();
my $clusterName = clusterName_example; # String | 
my $body = WWW::SwaggerClient::Object::RequestScheduleRequestSwagger->new(); # RequestScheduleRequestSwagger | 

eval { 
    $api_instance->createRequestSchedule(clusterName => $clusterName, body => $body);
};
if ($@) {
    warn "Exception when calling RequestSchedulesApi->createRequestSchedule: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-createRequestSchedule-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestSchedulesApi()
clusterName = clusterName_example # String | 
body =  # RequestScheduleRequestSwagger |  (optional)

try: 
    # Create new request schedule
    api_instance.createRequestSchedule(clusterName, body=body)
except ApiException as e:
    print("Exception when calling RequestSchedulesApi->createRequestSchedule: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createRequestSchedule_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createRequestSchedule_clusterName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/RequestScheduleRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createRequestSchedule_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createRequestSchedule_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RequestSchedules-deleteRequestSchedule">
                      <article id="api-RequestSchedules-deleteRequestSchedule-0" data-group="User" data-name="deleteRequestSchedule" data-version="0">
                        <div class="pull-left">
                          <h1>deleteRequestSchedule</h1>
                          <p>Delete a request schedule</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Changes status from COMPLETED to DISABLED</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/clusters/{clusterName}/request_schedules/{requestScheduleId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RequestSchedules-deleteRequestSchedule-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-java">Java</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-deleteRequestSchedule-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RequestSchedules-deleteRequestSchedule-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/clusters/{clusterName}/request_schedules/{requestScheduleId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestSchedulesApi;

import java.io.File;
import java.util.*;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String requestScheduleId = requestScheduleId_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteRequestSchedule(requestScheduleId, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#deleteRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestSchedulesApi;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String requestScheduleId = requestScheduleId_example; // String | 
        String clusterName = clusterName_example; // String | 
        try {
            apiInstance.deleteRequestSchedule(requestScheduleId, clusterName);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#deleteRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *requestScheduleId = requestScheduleId_example; // 
String *clusterName = clusterName_example; // 

RequestSchedulesApi *apiInstance = [[RequestSchedulesApi alloc] init];

// Delete a request schedule
[apiInstance deleteRequestScheduleWith:requestScheduleId
    clusterName:clusterName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestSchedulesApi()

var requestScheduleId = requestScheduleId_example; // {String} 

var clusterName = clusterName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteRequestSchedule(requestScheduleId, clusterName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteRequestScheduleExample
    {
        public void main()
        {
            
            var apiInstance = new RequestSchedulesApi();
            var requestScheduleId = requestScheduleId_example;  // String | 
            var clusterName = clusterName_example;  // String | 

            try
            {
                // Delete a request schedule
                apiInstance.deleteRequestSchedule(requestScheduleId, clusterName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestSchedulesApi.deleteRequestSchedule: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestSchedulesApi();
$requestScheduleId = requestScheduleId_example; // String | 
$clusterName = clusterName_example; // String | 

try {
    $api_instance->deleteRequestSchedule($requestScheduleId, $clusterName);
} catch (Exception $e) {
    echo 'Exception when calling RequestSchedulesApi->deleteRequestSchedule: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestSchedulesApi;

my $api_instance = WWW::SwaggerClient::RequestSchedulesApi->new();
my $requestScheduleId = requestScheduleId_example; # String | 
my $clusterName = clusterName_example; # String | 

eval { 
    $api_instance->deleteRequestSchedule(requestScheduleId => $requestScheduleId, clusterName => $clusterName);
};
if ($@) {
    warn "Exception when calling RequestSchedulesApi->deleteRequestSchedule: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-deleteRequestSchedule-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestSchedulesApi()
requestScheduleId = requestScheduleId_example # String | 
clusterName = clusterName_example # String | 

try: 
    # Delete a request schedule
    api_instance.deleteRequestSchedule(requestScheduleId, clusterName)
except ApiException as e:
    print("Exception when calling RequestSchedulesApi->deleteRequestSchedule: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">requestScheduleId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "requestScheduleId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteRequestSchedule_requestScheduleId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteRequestSchedule_requestScheduleId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteRequestSchedule_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteRequestSchedule_clusterName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RequestSchedules-getRequestSchedule">
                      <article id="api-RequestSchedules-getRequestSchedule-0" data-group="User" data-name="getRequestSchedule" data-version="0">
                        <div class="pull-left">
                          <h1>getRequestSchedule</h1>
                          <p>Get request schedule</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/request_schedules/{requestScheduleId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RequestSchedules-getRequestSchedule-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-java">Java</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedule-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RequestSchedules-getRequestSchedule-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/request_schedules/{requestScheduleId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestSchedulesApi;

import java.io.File;
import java.util.*;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String requestScheduleId = requestScheduleId_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RequestScheduleResponseSwagger result = apiInstance.getRequestSchedule(requestScheduleId, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#getRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestSchedulesApi;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String requestScheduleId = requestScheduleId_example; // String | 
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RequestScheduleResponseSwagger result = apiInstance.getRequestSchedule(requestScheduleId, clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#getRequestSchedule");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *requestScheduleId = requestScheduleId_example; // 
String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RequestSchedule/*)

RequestSchedulesApi *apiInstance = [[RequestSchedulesApi alloc] init];

// Get request schedule
[apiInstance getRequestScheduleWith:requestScheduleId
    clusterName:clusterName
    fields:fields
              completionHandler: ^(RequestScheduleResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestSchedulesApi()

var requestScheduleId = requestScheduleId_example; // {String} 

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRequestSchedule(requestScheduleId, clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRequestScheduleExample
    {
        public void main()
        {
            
            var apiInstance = new RequestSchedulesApi();
            var requestScheduleId = requestScheduleId_example;  // String | 
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RequestSchedule/*)

            try
            {
                // Get request schedule
                RequestScheduleResponseSwagger result = apiInstance.getRequestSchedule(requestScheduleId, clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestSchedulesApi.getRequestSchedule: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestSchedulesApi();
$requestScheduleId = requestScheduleId_example; // String | 
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRequestSchedule($requestScheduleId, $clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RequestSchedulesApi->getRequestSchedule: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestSchedulesApi;

my $api_instance = WWW::SwaggerClient::RequestSchedulesApi->new();
my $requestScheduleId = requestScheduleId_example; # String | 
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRequestSchedule(requestScheduleId => $requestScheduleId, clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RequestSchedulesApi->getRequestSchedule: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedule-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestSchedulesApi()
requestScheduleId = requestScheduleId_example # String | 
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RequestSchedule/*)

try: 
    # Get request schedule
    api_response = api_instance.getRequestSchedule(requestScheduleId, clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RequestSchedulesApi->getRequestSchedule: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">requestScheduleId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "requestScheduleId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedule_requestScheduleId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedule_requestScheduleId"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedule_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedule_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RequestSchedule/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedule_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedule_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRequestSchedule-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRequestSchedule-200-schema">
                                  <div id='responses-getRequestSchedule-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RequestScheduleResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRequestSchedule-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRequestSchedule-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRequestSchedule-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RequestSchedules-getRequestSchedules">
                      <article id="api-RequestSchedules-getRequestSchedules-0" data-group="User" data-name="getRequestSchedules" data-version="0">
                        <div class="pull-left">
                          <h1>getRequestSchedules</h1>
                          <p>Get all request schedules</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/clusters/{clusterName}/request_schedules</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RequestSchedules-getRequestSchedules-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-java">Java</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RequestSchedules-getRequestSchedules-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RequestSchedules-getRequestSchedules-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/clusters/{clusterName}/request_schedules?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestSchedulesApi;

import java.io.File;
import java.util.*;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RequestScheduleResponseSwagger] result = apiInstance.getRequestSchedules(clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#getRequestSchedules");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestSchedulesApi;

public class RequestSchedulesApiExample {

    public static void main(String[] args) {
        RequestSchedulesApi apiInstance = new RequestSchedulesApi();
        String clusterName = clusterName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RequestScheduleResponseSwagger] result = apiInstance.getRequestSchedules(clusterName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestSchedulesApi#getRequestSchedules");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *clusterName = clusterName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RequestSchedule/*)

RequestSchedulesApi *apiInstance = [[RequestSchedulesApi alloc] init];

// Get all request schedules
[apiInstance getRequestSchedulesWith:clusterName
    fields:fields
              completionHandler: ^(array[RequestScheduleResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestSchedulesApi()

var clusterName = clusterName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRequestSchedules(clusterName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRequestSchedulesExample
    {
        public void main()
        {
            
            var apiInstance = new RequestSchedulesApi();
            var clusterName = clusterName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RequestSchedule/*)

            try
            {
                // Get all request schedules
                array[RequestScheduleResponseSwagger] result = apiInstance.getRequestSchedules(clusterName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestSchedulesApi.getRequestSchedules: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestSchedulesApi();
$clusterName = clusterName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRequestSchedules($clusterName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RequestSchedulesApi->getRequestSchedules: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestSchedulesApi;

my $api_instance = WWW::SwaggerClient::RequestSchedulesApi->new();
my $clusterName = clusterName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRequestSchedules(clusterName => $clusterName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RequestSchedulesApi->getRequestSchedules: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RequestSchedules-getRequestSchedules-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestSchedulesApi()
clusterName = clusterName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RequestSchedule/*)

try: 
    # Get all request schedules
    api_response = api_instance.getRequestSchedules(clusterName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RequestSchedulesApi->getRequestSchedules: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">clusterName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "clusterName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedules_clusterName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedules_clusterName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RequestSchedule/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRequestSchedules_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRequestSchedules_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRequestSchedules-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRequestSchedules-200-schema">
                                  <div id='responses-getRequestSchedules-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RequestScheduleResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRequestSchedules-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRequestSchedules-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRequestSchedules-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Requests">
                  <h1>Requests</h1>
                    <div id="api-Requests-requestServiceCreateRequests">
                      <article id="api-Requests-requestServiceCreateRequests-0" data-group="User" data-name="requestServiceCreateRequests" data-version="0">
                        <div class="pull-left">
                          <h1>requestServiceCreateRequests</h1>
                          <p>Creates one or more Requests</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/requests</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Requests-requestServiceCreateRequests-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-java">Java</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceCreateRequests-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Requests-requestServiceCreateRequests-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/requests"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestsApi;

import java.io.File;
import java.util.*;

public class RequestsApiExample {

    public static void main(String[] args) {
        
        RequestsApi apiInstance = new RequestsApi();
        RequestPostRequest body = ; // RequestPostRequest | 
        try {
            apiInstance.requestServiceCreateRequests(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceCreateRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestsApi;

public class RequestsApiExample {

    public static void main(String[] args) {
        RequestsApi apiInstance = new RequestsApi();
        RequestPostRequest body = ; // RequestPostRequest | 
        try {
            apiInstance.requestServiceCreateRequests(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceCreateRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">RequestPostRequest *body = ; //  (optional)

RequestsApi *apiInstance = [[RequestsApi alloc] init];

// Creates one or more Requests
[apiInstance requestServiceCreateRequestsWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestsApi()

var opts = { 
  'body':  // {RequestPostRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.requestServiceCreateRequests(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class requestServiceCreateRequestsExample
    {
        public void main()
        {
            
            var apiInstance = new RequestsApi();
            var body = new RequestPostRequest(); // RequestPostRequest |  (optional) 

            try
            {
                // Creates one or more Requests
                apiInstance.requestServiceCreateRequests(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestsApi.requestServiceCreateRequests: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestsApi();
$body = ; // RequestPostRequest | 

try {
    $api_instance->requestServiceCreateRequests($body);
} catch (Exception $e) {
    echo 'Exception when calling RequestsApi->requestServiceCreateRequests: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestsApi;

my $api_instance = WWW::SwaggerClient::RequestsApi->new();
my $body = WWW::SwaggerClient::Object::RequestPostRequest->new(); # RequestPostRequest | 

eval { 
    $api_instance->requestServiceCreateRequests(body => $body);
};
if ($@) {
    warn "Exception when calling RequestsApi->requestServiceCreateRequests: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceCreateRequests-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestsApi()
body =  # RequestPostRequest |  (optional)

try: 
    # Creates one or more Requests
    api_instance.requestServiceCreateRequests(body=body)
except ApiException as e:
    print("Exception when calling RequestsApi->requestServiceCreateRequests: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/RequestPostRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_requestServiceCreateRequests_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_requestServiceCreateRequests_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-requestServiceCreateRequests-202-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-requestServiceCreateRequests-202-schema">
                                  <div id='responses-requestServiceCreateRequests-202-schema-202' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Request is accepted, but not completely processed yet",
  "schema" : {
    "$ref" : "#/definitions/RequestPostResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-requestServiceCreateRequests-202-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-requestServiceCreateRequests-202-schema-202');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-requestServiceCreateRequests-202-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Requests-requestServiceGetRequest">
                      <article id="api-Requests-requestServiceGetRequest-0" data-group="User" data-name="requestServiceGetRequest" data-version="0">
                        <div class="pull-left">
                          <h1>requestServiceGetRequest</h1>
                          <p>Get the details of a request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/requests/{requestId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Requests-requestServiceGetRequest-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-java">Java</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceGetRequest-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceGetRequest-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequest-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Requests-requestServiceGetRequest-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/requests/{requestId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestsApi;

import java.io.File;
import java.util.*;

public class RequestsApiExample {

    public static void main(String[] args) {
        
        RequestsApi apiInstance = new RequestsApi();
        String requestId = requestId_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RequestResponse result = apiInstance.requestServiceGetRequest(requestId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceGetRequest");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestsApi;

public class RequestsApiExample {

    public static void main(String[] args) {
        RequestsApi apiInstance = new RequestsApi();
        String requestId = requestId_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RequestResponse result = apiInstance.requestServiceGetRequest(requestId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceGetRequest");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *requestId = requestId_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Requests/*)

RequestsApi *apiInstance = [[RequestsApi alloc] init];

// Get the details of a request
[apiInstance requestServiceGetRequestWith:requestId
    fields:fields
              completionHandler: ^(RequestResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestsApi()

var requestId = requestId_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.requestServiceGetRequest(requestId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class requestServiceGetRequestExample
    {
        public void main()
        {
            
            var apiInstance = new RequestsApi();
            var requestId = requestId_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Requests/*)

            try
            {
                // Get the details of a request
                RequestResponse result = apiInstance.requestServiceGetRequest(requestId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestsApi.requestServiceGetRequest: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestsApi();
$requestId = requestId_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->requestServiceGetRequest($requestId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RequestsApi->requestServiceGetRequest: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestsApi;

my $api_instance = WWW::SwaggerClient::RequestsApi->new();
my $requestId = requestId_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->requestServiceGetRequest(requestId => $requestId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RequestsApi->requestServiceGetRequest: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequest-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestsApi()
requestId = requestId_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Requests/*)

try: 
    # Get the details of a request
    api_response = api_instance.requestServiceGetRequest(requestId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RequestsApi->requestServiceGetRequest: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">requestId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "requestId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequest_requestId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequest_requestId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Requests/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequest_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequest_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-requestServiceGetRequest-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-requestServiceGetRequest-200-schema">
                                  <div id='responses-requestServiceGetRequest-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RequestResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-requestServiceGetRequest-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-requestServiceGetRequest-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-requestServiceGetRequest-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Requests-requestServiceGetRequests">
                      <article id="api-Requests-requestServiceGetRequests-0" data-group="User" data-name="requestServiceGetRequests" data-version="0">
                        <div class="pull-left">
                          <h1>requestServiceGetRequests</h1>
                          <p>Get all requests. A predicate can be given to filter results.</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/requests</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Requests-requestServiceGetRequests-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-java">Java</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceGetRequests-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceGetRequests-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceGetRequests-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Requests-requestServiceGetRequests-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/requests?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestsApi;

import java.io.File;
import java.util.*;

public class RequestsApiExample {

    public static void main(String[] args) {
        
        RequestsApi apiInstance = new RequestsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[RequestResponse] result = apiInstance.requestServiceGetRequests(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceGetRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestsApi;

public class RequestsApiExample {

    public static void main(String[] args) {
        RequestsApi apiInstance = new RequestsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[RequestResponse] result = apiInstance.requestServiceGetRequests(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceGetRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Requests/id)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Requests/id.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

RequestsApi *apiInstance = [[RequestsApi alloc] init];

// Get all requests. A predicate can be given to filter results.
[apiInstance requestServiceGetRequestsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[RequestResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.requestServiceGetRequests(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class requestServiceGetRequestsExample
    {
        public void main()
        {
            
            var apiInstance = new RequestsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Requests/id)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Requests/id.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all requests. A predicate can be given to filter results.
                array[RequestResponse] result = apiInstance.requestServiceGetRequests(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestsApi.requestServiceGetRequests: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->requestServiceGetRequests($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RequestsApi->requestServiceGetRequests: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestsApi;

my $api_instance = WWW::SwaggerClient::RequestsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->requestServiceGetRequests(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RequestsApi->requestServiceGetRequests: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceGetRequests-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Requests/id)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Requests/id.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all requests. A predicate can be given to filter results.
    api_response = api_instance.requestServiceGetRequests(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RequestsApi->requestServiceGetRequests: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Requests/id"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Requests/id.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceGetRequests_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceGetRequests_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-requestServiceGetRequests-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-requestServiceGetRequests-200-schema">
                                  <div id='responses-requestServiceGetRequests-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RequestResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-requestServiceGetRequests-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-requestServiceGetRequests-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-requestServiceGetRequests-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Requests-requestServiceUpdateRequests">
                      <article id="api-Requests-requestServiceUpdateRequests-0" data-group="User" data-name="requestServiceUpdateRequests" data-version="0">
                        <div class="pull-left">
                          <h1>requestServiceUpdateRequests</h1>
                          <p>Updates a request, usually used to cancel running requests.</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Changes the state of an existing request. Usually used to cancel running requests.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/requests/{requestId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Requests-requestServiceUpdateRequests-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-java">Java</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Requests-requestServiceUpdateRequests-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Requests-requestServiceUpdateRequests-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/requests/{requestId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RequestsApi;

import java.io.File;
import java.util.*;

public class RequestsApiExample {

    public static void main(String[] args) {
        
        RequestsApi apiInstance = new RequestsApi();
        String requestId = requestId_example; // String | 
        RequestPutRequest body = ; // RequestPutRequest | 
        try {
            apiInstance.requestServiceUpdateRequests(requestId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceUpdateRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RequestsApi;

public class RequestsApiExample {

    public static void main(String[] args) {
        RequestsApi apiInstance = new RequestsApi();
        String requestId = requestId_example; // String | 
        RequestPutRequest body = ; // RequestPutRequest | 
        try {
            apiInstance.requestServiceUpdateRequests(requestId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling RequestsApi#requestServiceUpdateRequests");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *requestId = requestId_example; // 
RequestPutRequest *body = ; //  (optional)

RequestsApi *apiInstance = [[RequestsApi alloc] init];

// Updates a request, usually used to cancel running requests.
[apiInstance requestServiceUpdateRequestsWith:requestId
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RequestsApi()

var requestId = requestId_example; // {String} 

var opts = { 
  'body':  // {RequestPutRequest} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.requestServiceUpdateRequests(requestId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class requestServiceUpdateRequestsExample
    {
        public void main()
        {
            
            var apiInstance = new RequestsApi();
            var requestId = requestId_example;  // String | 
            var body = new RequestPutRequest(); // RequestPutRequest |  (optional) 

            try
            {
                // Updates a request, usually used to cancel running requests.
                apiInstance.requestServiceUpdateRequests(requestId, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RequestsApi.requestServiceUpdateRequests: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RequestsApi();
$requestId = requestId_example; // String | 
$body = ; // RequestPutRequest | 

try {
    $api_instance->requestServiceUpdateRequests($requestId, $body);
} catch (Exception $e) {
    echo 'Exception when calling RequestsApi->requestServiceUpdateRequests: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RequestsApi;

my $api_instance = WWW::SwaggerClient::RequestsApi->new();
my $requestId = requestId_example; # String | 
my $body = WWW::SwaggerClient::Object::RequestPutRequest->new(); # RequestPutRequest | 

eval { 
    $api_instance->requestServiceUpdateRequests(requestId => $requestId, body => $body);
};
if ($@) {
    warn "Exception when calling RequestsApi->requestServiceUpdateRequests: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Requests-requestServiceUpdateRequests-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RequestsApi()
requestId = requestId_example # String | 
body =  # RequestPutRequest |  (optional)

try: 
    # Updates a request, usually used to cancel running requests.
    api_instance.requestServiceUpdateRequests(requestId, body=body)
except ApiException as e:
    print("Exception when calling RequestsApi->requestServiceUpdateRequests: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">requestId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "requestId",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_requestServiceUpdateRequests_requestId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_requestServiceUpdateRequests_requestId"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/RequestPutRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_requestServiceUpdateRequests_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_requestServiceUpdateRequests_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-RootServiceConfigurations">
                  <h1>RootServiceConfigurations</h1>
                    <div id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration">
                      <article id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0" data-group="User" data-name="rootServiceComponentConfigurationServiceDeleteConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>rootServiceComponentConfigurationServiceDeleteConfiguration</h1>
                          <p>Deletes a root service component configuration resource</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/services/{serviceName}/components/{componentName}/configurations/{category}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}/configurations/{category}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RootServiceConfigurationsApi;

import java.io.File;
import java.util.*;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        try {
            apiInstance.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceDeleteConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RootServiceConfigurationsApi;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        try {
            apiInstance.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceDeleteConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *category = category_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 

RootServiceConfigurationsApi *apiInstance = [[RootServiceConfigurationsApi alloc] init];

// Deletes a root service component configuration resource
[apiInstance rootServiceComponentConfigurationServiceDeleteConfigurationWith:category
    serviceName:serviceName
    componentName:componentName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RootServiceConfigurationsApi()

var category = category_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class rootServiceComponentConfigurationServiceDeleteConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new RootServiceConfigurationsApi();
            var category = category_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 

            try
            {
                // Deletes a root service component configuration resource
                apiInstance.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RootServiceConfigurationsApi.rootServiceComponentConfigurationServiceDeleteConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RootServiceConfigurationsApi();
$category = category_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 

try {
    $api_instance->rootServiceComponentConfigurationServiceDeleteConfiguration($category, $serviceName, $componentName);
} catch (Exception $e) {
    echo 'Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceDeleteConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RootServiceConfigurationsApi;

my $api_instance = WWW::SwaggerClient::RootServiceConfigurationsApi->new();
my $category = category_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 

eval { 
    $api_instance->rootServiceComponentConfigurationServiceDeleteConfiguration(category => $category, serviceName => $serviceName, componentName => $componentName);
};
if ($@) {
    warn "Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceDeleteConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceDeleteConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RootServiceConfigurationsApi()
category = category_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 

try: 
    # Deletes a root service component configuration resource
    api_instance.rootServiceComponentConfigurationServiceDeleteConfiguration(category, serviceName, componentName)
except ApiException as e:
    print("Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceDeleteConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">category*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "category",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_category');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_category"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceDeleteConfiguration_componentName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration">
                      <article id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0" data-group="User" data-name="rootServiceComponentConfigurationServiceGetConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>rootServiceComponentConfigurationServiceGetConfiguration</h1>
                          <p>Retrieve the details of a root service component configuration resource</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/components/{componentName}/configurations/{category}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}/configurations/{category}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RootServiceConfigurationsApi;

import java.io.File;
import java.util.*;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceComponentConfigurationResponseSwagger result = apiInstance.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceGetConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RootServiceConfigurationsApi;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceComponentConfigurationResponseSwagger result = apiInstance.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceGetConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *category = category_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Configuration/*)

RootServiceConfigurationsApi *apiInstance = [[RootServiceConfigurationsApi alloc] init];

// Retrieve the details of a root service component configuration resource
[apiInstance rootServiceComponentConfigurationServiceGetConfigurationWith:category
    serviceName:serviceName
    componentName:componentName
    fields:fields
              completionHandler: ^(RootServiceComponentConfigurationResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RootServiceConfigurationsApi()

var category = category_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class rootServiceComponentConfigurationServiceGetConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new RootServiceConfigurationsApi();
            var category = category_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Configuration/*)

            try
            {
                // Retrieve the details of a root service component configuration resource
                RootServiceComponentConfigurationResponseSwagger result = apiInstance.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RootServiceConfigurationsApi.rootServiceComponentConfigurationServiceGetConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RootServiceConfigurationsApi();
$category = category_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->rootServiceComponentConfigurationServiceGetConfiguration($category, $serviceName, $componentName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceGetConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RootServiceConfigurationsApi;

my $api_instance = WWW::SwaggerClient::RootServiceConfigurationsApi->new();
my $category = category_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->rootServiceComponentConfigurationServiceGetConfiguration(category => $category, serviceName => $serviceName, componentName => $componentName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceGetConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceGetConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RootServiceConfigurationsApi()
category = category_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Configuration/*)

try: 
    # Retrieve the details of a root service component configuration resource
    api_response = api_instance.rootServiceComponentConfigurationServiceGetConfiguration(category, serviceName, componentName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceGetConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">category*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "category",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceGetConfiguration_category');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceGetConfiguration_category"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceGetConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceGetConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceGetConfiguration_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceGetConfiguration_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Configuration/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceGetConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceGetConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema">
                                  <div id='responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RootServiceComponentConfigurationResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-rootServiceComponentConfigurationServiceGetConfiguration-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration">
                      <article id="api-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0" data-group="User" data-name="rootServiceComponentConfigurationServiceUpdateConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>rootServiceComponentConfigurationServiceUpdateConfiguration</h1>
                          <p>Updates root service component configuration resources </p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/services/{serviceName}/components/{componentName}/configurations/{category}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}/configurations/{category}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.RootServiceConfigurationsApi;

import java.io.File;
import java.util.*;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        RootServiceComponentConfigurationRequestSwagger body = ; // RootServiceComponentConfigurationRequestSwagger | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            apiInstance.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, body, fields);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceUpdateConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.RootServiceConfigurationsApi;

public class RootServiceConfigurationsApiExample {

    public static void main(String[] args) {
        RootServiceConfigurationsApi apiInstance = new RootServiceConfigurationsApi();
        String category = category_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        RootServiceComponentConfigurationRequestSwagger body = ; // RootServiceComponentConfigurationRequestSwagger | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            apiInstance.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, body, fields);
        } catch (ApiException e) {
            System.err.println("Exception when calling RootServiceConfigurationsApi#rootServiceComponentConfigurationServiceUpdateConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *category = category_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
RootServiceComponentConfigurationRequestSwagger *body = ; //  (optional)
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Configuration/*)

RootServiceConfigurationsApi *apiInstance = [[RootServiceConfigurationsApi alloc] init];

// Updates root service component configuration resources 
[apiInstance rootServiceComponentConfigurationServiceUpdateConfigurationWith:category
    serviceName:serviceName
    componentName:componentName
    body:body
    fields:fields
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.RootServiceConfigurationsApi()

var category = category_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var opts = { 
  'body': , // {RootServiceComponentConfigurationRequestSwagger} 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class rootServiceComponentConfigurationServiceUpdateConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new RootServiceConfigurationsApi();
            var category = category_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var body = new RootServiceComponentConfigurationRequestSwagger(); // RootServiceComponentConfigurationRequestSwagger |  (optional) 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Configuration/*)

            try
            {
                // Updates root service component configuration resources 
                apiInstance.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, body, fields);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling RootServiceConfigurationsApi.rootServiceComponentConfigurationServiceUpdateConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\RootServiceConfigurationsApi();
$category = category_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$body = ; // RootServiceComponentConfigurationRequestSwagger | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $api_instance->rootServiceComponentConfigurationServiceUpdateConfiguration($category, $serviceName, $componentName, $body, $fields);
} catch (Exception $e) {
    echo 'Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceUpdateConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::RootServiceConfigurationsApi;

my $api_instance = WWW::SwaggerClient::RootServiceConfigurationsApi->new();
my $category = category_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $body = WWW::SwaggerClient::Object::RootServiceComponentConfigurationRequestSwagger->new(); # RootServiceComponentConfigurationRequestSwagger | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    $api_instance->rootServiceComponentConfigurationServiceUpdateConfiguration(category => $category, serviceName => $serviceName, componentName => $componentName, body => $body, fields => $fields);
};
if ($@) {
    warn "Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceUpdateConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-RootServiceConfigurations-rootServiceComponentConfigurationServiceUpdateConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.RootServiceConfigurationsApi()
category = category_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
body =  # RootServiceComponentConfigurationRequestSwagger |  (optional)
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Configuration/*)

try: 
    # Updates root service component configuration resources 
    api_instance.rootServiceComponentConfigurationServiceUpdateConfiguration(category, serviceName, componentName, body=body, fields=fields)
except ApiException as e:
    print("Exception when calling RootServiceConfigurationsApi->rootServiceComponentConfigurationServiceUpdateConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">category*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "category",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_category');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_category"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_componentName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/RootServiceComponentConfigurationRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_body"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Configuration/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_rootServiceComponentConfigurationServiceUpdateConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Services">
                  <h1>Services</h1>
                    <div id="api-Services-getRootHost">
                      <article id="api-Services-getRootHost-0" data-group="User" data-name="getRootHost" data-version="0">
                        <div class="pull-left">
                          <h1>getRootHost</h1>
                          <p>Returns information about the given host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/hosts/{hostName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootHost-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootHost-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootHost-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootHost-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootHost-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootHost-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootHost-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/hosts/{hostName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootHost-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostResponseWrapper result = apiInstance.getRootHost(hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootHost-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            HostResponseWrapper result = apiInstance.getRootHost(hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootHost");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootHost-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootHost-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *hostName = hostName_example; // host name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/*)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns information about the given host
[apiInstance getRootHostWith:hostName
    fields:fields
              completionHandler: ^(HostResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHost-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var hostName = hostName_example; // {String} host name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootHost(hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootHost-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootHost-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootHostExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var hostName = hostName_example;  // String | host name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Hosts/*)

            try
            {
                // Returns information about the given host
                HostResponseWrapper result = apiInstance.getRootHost(hostName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootHost: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHost-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$hostName = hostName_example; // String | host name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootHost($hostName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootHost: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHost-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $hostName = hostName_example; # String | host name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootHost(hostName => $hostName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootHost: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHost-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
hostName = hostName_example # String | host name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/*)

try: 
    # Returns information about the given host
    api_response = api_instance.getRootHost(hostName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootHost: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootHost_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootHost_hostName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Hosts/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootHost_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootHost_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootHost-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootHost-200-schema">
                                  <div id='responses-getRootHost-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/HostResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootHost-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootHost-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootHost-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootHosts">
                      <article id="api-Services-getRootHosts-0" data-group="User" data-name="getRootHosts" data-version="0">
                        <div class="pull-left">
                          <h1>getRootHosts</h1>
                          <p>Returns the list of hosts for the given root-level service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/hosts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/hosts?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[HostResponseWrapper] result = apiInstance.getRootHosts(fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[HostResponseWrapper] result = apiInstance.getRootHosts(fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/host_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of hosts for the given root-level service
[apiInstance getRootHostsWith:fields
              completionHandler: ^(array[HostResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootHosts(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootHostsExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Hosts/host_name)

            try
            {
                // Returns the list of hosts for the given root-level service
                array[HostResponseWrapper] result = apiInstance.getRootHosts(fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootHosts($fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootHosts(fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Hosts/host_name)

try: 
    # Returns the list of hosts for the given root-level service
    api_response = api_instance.getRootHosts(fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Hosts/host_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootHosts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootHosts_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootHosts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootHosts-200-schema">
                                  <div id='responses-getRootHosts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/HostResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootHosts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootHosts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootHosts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootService">
                      <article id="api-Services-getRootService-0" data-group="User" data-name="getRootService" data-version="0">
                        <div class="pull-left">
                          <h1>getRootService</h1>
                          <p>Returns information about the given root-level service, including a list of its components</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceResponseWithComponentList result = apiInstance.getRootService(serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceResponseWithComponentList result = apiInstance.getRootService(serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootService/service_name, components/RootServiceComponents/component_name, components/RootServiceComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns information about the given root-level service, including a list of its components
[apiInstance getRootServiceWith:serviceName
    fields:fields
              completionHandler: ^(RootServiceResponseWithComponentList output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootService(serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootService/service_name, components/RootServiceComponents/component_name, components/RootServiceComponents/service_name)

            try
            {
                // Returns information about the given root-level service, including a list of its components
                RootServiceResponseWithComponentList result = apiInstance.getRootService(serviceName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootService($serviceName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootService(serviceName => $serviceName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootService/service_name, components/RootServiceComponents/component_name, components/RootServiceComponents/service_name)

try: 
    # Returns information about the given root-level service, including a list of its components
    api_response = api_instance.getRootService(serviceName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootService_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootService/service_name, components/RootServiceComponents/component_name, components/RootServiceComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootService_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootService_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootService-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootService-200-schema">
                                  <div id='responses-getRootService-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RootServiceResponseWithComponentList"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootService-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootService-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootService-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceComponent">
                      <article id="api-Services-getRootServiceComponent-0" data-group="User" data-name="getRootServiceComponent" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceComponent</h1>
                          <p>Returns information about the given component for the given root-level service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/components/{componentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String componentName = componentName_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceComponentWithHostComponentList result = apiInstance.getRootServiceComponent(serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String componentName = componentName_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceComponentWithHostComponentList result = apiInstance.getRootServiceComponent(serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *componentName = componentName_example; // component name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceComponents/*, hostComponents/RootServiceHostComponents/component_name, hostComponents/RootServiceHostComponents/host_name, hostComponents/RootServiceHostComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns information about the given component for the given root-level service
[apiInstance getRootServiceComponentWith:serviceName
    componentName:componentName
    fields:fields
              completionHandler: ^(RootServiceComponentWithHostComponentList output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var componentName = componentName_example; // {String} component name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceComponent(serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceComponentExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var componentName = componentName_example;  // String | component name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceComponents/*, hostComponents/RootServiceHostComponents/component_name, hostComponents/RootServiceHostComponents/host_name, hostComponents/RootServiceHostComponents/service_name)

            try
            {
                // Returns information about the given component for the given root-level service
                RootServiceComponentWithHostComponentList result = apiInstance.getRootServiceComponent(serviceName, componentName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$componentName = componentName_example; // String | component name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceComponent($serviceName, $componentName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $componentName = componentName_example; # String | component name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceComponent(serviceName => $serviceName, componentName => $componentName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
componentName = componentName_example # String | component name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceComponents/*, hostComponents/RootServiceHostComponents/component_name, hostComponents/RootServiceHostComponents/host_name, hostComponents/RootServiceHostComponents/service_name)

try: 
    # Returns information about the given component for the given root-level service
    api_response = api_instance.getRootServiceComponent(serviceName, componentName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponent_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponent_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "description" : "component name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponent_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponent_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceComponents/*, hostComponents/RootServiceHostComponents/component_name, hostComponents/RootServiceHostComponents/host_name, hostComponents/RootServiceHostComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponent_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponent_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceComponent-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceComponent-200-schema">
                                  <div id='responses-getRootServiceComponent-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RootServiceComponentWithHostComponentList"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceComponent-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceComponent-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceComponent-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceComponentHosts">
                      <article id="api-Services-getRootServiceComponentHosts-0" data-group="User" data-name="getRootServiceComponentHosts" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceComponentHosts</h1>
                          <p>Returns the list of hosts for the given root-level service component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/components/{componentName}/hostComponents</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceComponentHosts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponentHosts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceComponentHosts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/components/{componentName}/hostComponents?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String componentName = componentName_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceComponentHosts(serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponentHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String componentName = componentName_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceComponentHosts(serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponentHosts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *componentName = componentName_example; // component name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of hosts for the given root-level service component
[apiInstance getRootServiceComponentHostsWith:serviceName
    componentName:componentName
    fields:fields
              completionHandler: ^(array[RootServiceHostComponentResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var componentName = componentName_example; // {String} component name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceComponentHosts(serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceComponentHostsExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var componentName = componentName_example;  // String | component name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

            try
            {
                // Returns the list of hosts for the given root-level service component
                array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceComponentHosts(serviceName, componentName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceComponentHosts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$componentName = componentName_example; // String | component name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceComponentHosts($serviceName, $componentName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceComponentHosts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $componentName = componentName_example; # String | component name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceComponentHosts(serviceName => $serviceName, componentName => $componentName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceComponentHosts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponentHosts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
componentName = componentName_example # String | component name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

try: 
    # Returns the list of hosts for the given root-level service component
    api_response = api_instance.getRootServiceComponentHosts(serviceName, componentName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceComponentHosts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponentHosts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponentHosts_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "description" : "component name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponentHosts_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponentHosts_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponentHosts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponentHosts_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceComponentHosts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceComponentHosts-200-schema">
                                  <div id='responses-getRootServiceComponentHosts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RootServiceHostComponentResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceComponentHosts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceComponentHosts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceComponentHosts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceComponents">
                      <article id="api-Services-getRootServiceComponents-0" data-group="User" data-name="getRootServiceComponents" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceComponents</h1>
                          <p>Returns the list of components for the given root-level service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/components</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/components?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceComponentResponseWrapper] result = apiInstance.getRootServiceComponents(serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceComponentResponseWrapper] result = apiInstance.getRootServiceComponents(serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceComponents/component_name, RootServiceComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of components for the given root-level service
[apiInstance getRootServiceComponentsWith:serviceName
    fields:fields
              completionHandler: ^(array[RootServiceComponentResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceComponents(serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceComponents/component_name, RootServiceComponents/service_name)

            try
            {
                // Returns the list of components for the given root-level service
                array[RootServiceComponentResponseWrapper] result = apiInstance.getRootServiceComponents(serviceName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceComponents($serviceName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceComponents(serviceName => $serviceName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceComponents/component_name, RootServiceComponents/service_name)

try: 
    # Returns the list of components for the given root-level service
    api_response = api_instance.getRootServiceComponents(serviceName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponents_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponents_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceComponents/component_name, RootServiceComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceComponents_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceComponents_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceComponents-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceComponents-200-schema">
                                  <div id='responses-getRootServiceComponents-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RootServiceComponentResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceComponents-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceComponents-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceComponents-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceHostComponent">
                      <article id="api-Services-getRootServiceHostComponent-0" data-group="User" data-name="getRootServiceHostComponent" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceHostComponent</h1>
                          <p>Returns information about the given component for the given root-level service on the given host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/hosts/{hostName}/hostComponents/{hostComponent}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceHostComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceHostComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceHostComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceHostComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/hosts/{hostName}/hostComponents/{hostComponent}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String hostName = hostName_example; // String | host name
        String hostComponent = hostComponent_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceHostComponentResponseWrapper result = apiInstance.getRootServiceHostComponent(serviceName, hostName, hostComponent, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String hostName = hostName_example; // String | host name
        String hostComponent = hostComponent_example; // String | component name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            RootServiceHostComponentResponseWrapper result = apiInstance.getRootServiceHostComponent(serviceName, hostName, hostComponent, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceHostComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *hostName = hostName_example; // host name
String *hostComponent = hostComponent_example; // component name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns information about the given component for the given root-level service on the given host
[apiInstance getRootServiceHostComponentWith:serviceName
    hostName:hostName
    hostComponent:hostComponent
    fields:fields
              completionHandler: ^(RootServiceHostComponentResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var hostName = hostName_example; // {String} host name

var hostComponent = hostComponent_example; // {String} component name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceHostComponent(serviceName, hostName, hostComponent, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceHostComponentExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var hostName = hostName_example;  // String | host name
            var hostComponent = hostComponent_example;  // String | component name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

            try
            {
                // Returns information about the given component for the given root-level service on the given host
                RootServiceHostComponentResponseWrapper result = apiInstance.getRootServiceHostComponent(serviceName, hostName, hostComponent, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceHostComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$hostName = hostName_example; // String | host name
$hostComponent = hostComponent_example; // String | component name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceHostComponent($serviceName, $hostName, $hostComponent, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceHostComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $hostName = hostName_example; # String | host name
my $hostComponent = hostComponent_example; # String | component name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceHostComponent(serviceName => $serviceName, hostName => $hostName, hostComponent => $hostComponent, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceHostComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
hostName = hostName_example # String | host name
hostComponent = hostComponent_example # String | component name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

try: 
    # Returns information about the given component for the given root-level service on the given host
    api_response = api_instance.getRootServiceHostComponent(serviceName, hostName, hostComponent, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceHostComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponent_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponent_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponent_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponent_hostName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">hostComponent*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostComponent",
  "in" : "path",
  "description" : "component name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponent_hostComponent');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponent_hostComponent"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponent_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponent_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceHostComponent-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceHostComponent-200-schema">
                                  <div id='responses-getRootServiceHostComponent-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/RootServiceHostComponentResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceHostComponent-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceHostComponent-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceHostComponent-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServiceHostComponents">
                      <article id="api-Services-getRootServiceHostComponents-0" data-group="User" data-name="getRootServiceHostComponents" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServiceHostComponents</h1>
                          <p>Returns the list of components for the given root-level service on the given host</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services/{serviceName}/hosts/{hostName}/hostComponents</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServiceHostComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceHostComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServiceHostComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServiceHostComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServiceHostComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services/{serviceName}/hosts/{hostName}/hostComponents?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceHostComponents(serviceName, hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String serviceName = serviceName_example; // String | service name
        String hostName = hostName_example; // String | host name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceHostComponents(serviceName, hostName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServiceHostComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *serviceName = serviceName_example; // service name
String *hostName = hostName_example; // host name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of components for the given root-level service on the given host
[apiInstance getRootServiceHostComponentsWith:serviceName
    hostName:hostName
    fields:fields
              completionHandler: ^(array[RootServiceHostComponentResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var serviceName = serviceName_example; // {String} service name

var hostName = hostName_example; // {String} host name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServiceHostComponents(serviceName, hostName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServiceHostComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var serviceName = serviceName_example;  // String | service name
            var hostName = hostName_example;  // String | host name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

            try
            {
                // Returns the list of components for the given root-level service on the given host
                array[RootServiceHostComponentResponseWrapper] result = apiInstance.getRootServiceHostComponents(serviceName, hostName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServiceHostComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$serviceName = serviceName_example; // String | service name
$hostName = hostName_example; // String | host name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServiceHostComponents($serviceName, $hostName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServiceHostComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $serviceName = serviceName_example; # String | service name
my $hostName = hostName_example; # String | host name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServiceHostComponents(serviceName => $serviceName, hostName => $hostName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServiceHostComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServiceHostComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
serviceName = serviceName_example # String | service name
hostName = hostName_example # String | host name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name)

try: 
    # Returns the list of components for the given root-level service on the given host
    api_response = api_instance.getRootServiceHostComponents(serviceName, hostName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServiceHostComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "description" : "service name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponents_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponents_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">hostName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "hostName",
  "in" : "path",
  "description" : "host name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponents_hostName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponents_hostName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootServiceHostComponents/component_name, RootServiceHostComponents/host_name, RootServiceHostComponents/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServiceHostComponents_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServiceHostComponents_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServiceHostComponents-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServiceHostComponents-200-schema">
                                  <div id='responses-getRootServiceHostComponents-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RootServiceHostComponentResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServiceHostComponents-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServiceHostComponents-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServiceHostComponents-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Services-getRootServices">
                      <article id="api-Services-getRootServices-0" data-group="User" data-name="getRootServices" data-version="0">
                        <div class="pull-left">
                          <h1>getRootServices</h1>
                          <p>Returns the list of root-level services</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/services</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Services-getRootServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Services-getRootServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Services-getRootServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Services-getRootServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Services-getRootServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/services?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Services-getRootServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ServicesApi;

import java.io.File;
import java.util.*;

public class ServicesApiExample {

    public static void main(String[] args) {
        
        ServicesApi apiInstance = new ServicesApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceResponseWrapper] result = apiInstance.getRootServices(fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Services-getRootServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ServicesApi;

public class ServicesApiExample {

    public static void main(String[] args) {
        ServicesApi apiInstance = new ServicesApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            array[RootServiceResponseWrapper] result = apiInstance.getRootServices(fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ServicesApi#getRootServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Services-getRootServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Services-getRootServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to RootService/service_name)

ServicesApi *apiInstance = [[ServicesApi alloc] init];

// Returns the list of root-level services
[apiInstance getRootServicesWith:fields
              completionHandler: ^(array[RootServiceResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ServicesApi()

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getRootServices(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Services-getRootServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Services-getRootServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getRootServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ServicesApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to RootService/service_name)

            try
            {
                // Returns the list of root-level services
                array[RootServiceResponseWrapper] result = apiInstance.getRootServices(fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ServicesApi.getRootServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ServicesApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getRootServices($fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ServicesApi->getRootServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ServicesApi;

my $api_instance = WWW::SwaggerClient::ServicesApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getRootServices(fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ServicesApi->getRootServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Services-getRootServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ServicesApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to RootService/service_name)

try: 
    # Returns the list of root-level services
    api_response = api_instance.getRootServices(fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ServicesApi->getRootServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "RootService/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getRootServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getRootServices_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getRootServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getRootServices-200-schema">
                                  <div id='responses-getRootServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/RootServiceResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getRootServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getRootServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getRootServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Settings">
                  <h1>Settings</h1>
                    <div id="api-Settings-createSetting">
                      <article id="api-Settings-createSetting-0" data-group="User" data-name="createSetting" data-version="0">
                        <div class="pull-left">
                          <h1>createSetting</h1>
                          <p>Creates a setting</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/settings</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-createSetting-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-createSetting-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-createSetting-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-createSetting-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-createSetting-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-createSetting-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-createSetting-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/settings"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-createSetting-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        SettingRequestSwagger body = ; // SettingRequestSwagger | 
        try {
            apiInstance.createSetting(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#createSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-createSetting-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        SettingRequestSwagger body = ; // SettingRequestSwagger | 
        try {
            apiInstance.createSetting(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#createSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-createSetting-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-createSetting-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">SettingRequestSwagger *body = ; // 

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Creates a setting
[apiInstance createSettingWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-createSetting-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var body = ; // {SettingRequestSwagger} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createSetting(body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-createSetting-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-createSetting-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createSettingExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var body = new SettingRequestSwagger(); // SettingRequestSwagger | 

            try
            {
                // Creates a setting
                apiInstance.createSetting(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.createSetting: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-createSetting-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$body = ; // SettingRequestSwagger | 

try {
    $api_instance->createSetting($body);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->createSetting: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-createSetting-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $body = WWW::SwaggerClient::Object::SettingRequestSwagger->new(); # SettingRequestSwagger | 

eval { 
    $api_instance->createSetting(body => $body);
};
if ($@) {
    warn "Exception when calling SettingsApi->createSetting: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-createSetting-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
body =  # SettingRequestSwagger | 

try: 
    # Creates a setting
    api_instance.createSetting(body)
except ApiException as e:
    print("Exception when calling SettingsApi->createSetting: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/SettingRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createSetting_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createSetting_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Settings-deleteSetting">
                      <article id="api-Settings-deleteSetting-0" data-group="User" data-name="deleteSetting" data-version="0">
                        <div class="pull-left">
                          <h1>deleteSetting</h1>
                          <p>Deletes a setting</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/settings/{settingName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-deleteSetting-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-deleteSetting-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-deleteSetting-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-deleteSetting-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-deleteSetting-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-deleteSetting-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-deleteSetting-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/settings/{settingName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-deleteSetting-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        try {
            apiInstance.deleteSetting(settingName);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#deleteSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-deleteSetting-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        try {
            apiInstance.deleteSetting(settingName);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#deleteSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-deleteSetting-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *settingName = settingName_example; // setting name

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Deletes a setting
[apiInstance deleteSettingWith:settingName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var settingName = settingName_example; // {String} setting name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteSetting(settingName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-deleteSetting-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteSettingExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var settingName = settingName_example;  // String | setting name

            try
            {
                // Deletes a setting
                apiInstance.deleteSetting(settingName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.deleteSetting: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$settingName = settingName_example; // String | setting name

try {
    $api_instance->deleteSetting($settingName);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->deleteSetting: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $settingName = settingName_example; # String | setting name

eval { 
    $api_instance->deleteSetting(settingName => $settingName);
};
if ($@) {
    warn "Exception when calling SettingsApi->deleteSetting: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-deleteSetting-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
settingName = settingName_example # String | setting name

try: 
    # Deletes a setting
    api_instance.deleteSetting(settingName)
except ApiException as e:
    print("Exception when calling SettingsApi->deleteSetting: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">settingName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "settingName",
  "in" : "path",
  "description" : "setting name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteSetting_settingName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteSetting_settingName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Settings-getSetting">
                      <article id="api-Settings-getSetting-0" data-group="User" data-name="getSetting" data-version="0">
                        <div class="pull-left">
                          <h1>getSetting</h1>
                          <p>Returns a specific setting</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/settings/{settingName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-getSetting-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-getSetting-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-getSetting-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-getSetting-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-getSetting-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-getSetting-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-getSetting-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/settings/{settingName}?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-getSetting-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            SettingResponseWrapper result = apiInstance.getSetting(settingName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#getSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-getSetting-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            SettingResponseWrapper result = apiInstance.getSetting(settingName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#getSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-getSetting-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-getSetting-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *settingName = settingName_example; // setting name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Settings/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Returns a specific setting
[apiInstance getSettingWith:settingName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(SettingResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSetting-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var settingName = settingName_example; // {String} setting name

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getSetting(settingName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-getSetting-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-getSetting-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getSettingExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var settingName = settingName_example;  // String | setting name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Settings/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns a specific setting
                SettingResponseWrapper result = apiInstance.getSetting(settingName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.getSetting: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSetting-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$settingName = settingName_example; // String | setting name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getSetting($settingName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->getSetting: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSetting-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $settingName = settingName_example; # String | setting name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getSetting(settingName => $settingName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling SettingsApi->getSetting: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSetting-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
settingName = settingName_example # String | setting name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Settings/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns a specific setting
    api_response = api_instance.getSetting(settingName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling SettingsApi->getSetting: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">settingName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "settingName",
  "in" : "path",
  "description" : "setting name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_settingName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_settingName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Settings/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSetting_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSetting_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getSetting-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getSetting-200-schema">
                                  <div id='responses-getSetting-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/SettingResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getSetting-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getSetting-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getSetting-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Settings-getSettings">
                      <article id="api-Settings-getSettings-0" data-group="User" data-name="getSettings" data-version="0">
                        <div class="pull-left">
                          <h1>getSettings</h1>
                          <p>Returns all settings</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/settings</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-getSettings-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-getSettings-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-getSettings-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-getSettings-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-getSettings-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-getSettings-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-getSettings-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/settings?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-getSettings-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[SettingResponseWrapper] result = apiInstance.getSettings(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#getSettings");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-getSettings-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[SettingResponseWrapper] result = apiInstance.getSettings(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#getSettings");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-getSettings-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-getSettings-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Settings/name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Returns all settings
[apiInstance getSettingsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[SettingResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSettings-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getSettings(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-getSettings-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-getSettings-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getSettingsExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Settings/name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Returns all settings
                array[SettingResponseWrapper] result = apiInstance.getSettings(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.getSettings: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSettings-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getSettings($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->getSettings: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSettings-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getSettings(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling SettingsApi->getSettings: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-getSettings-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Settings/name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Returns all settings
    api_response = api_instance.getSettings(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling SettingsApi->getSettings: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Settings/name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getSettings_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getSettings_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getSettings-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getSettings-200-schema">
                                  <div id='responses-getSettings-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/SettingResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getSettings-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getSettings-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getSettings-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Settings-updateSetting">
                      <article id="api-Settings-updateSetting-0" data-group="User" data-name="updateSetting" data-version="0">
                        <div class="pull-left">
                          <h1>updateSetting</h1>
                          <p>Updates a setting</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/settings/{settingName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Settings-updateSetting-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-java">Java</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Settings-updateSetting-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Settings-updateSetting-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Settings-updateSetting-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Settings-updateSetting-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Settings-updateSetting-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Settings-updateSetting-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/settings/{settingName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Settings-updateSetting-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.SettingsApi;

import java.io.File;
import java.util.*;

public class SettingsApiExample {

    public static void main(String[] args) {
        
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        SettingRequestSwagger body = ; // SettingRequestSwagger | 
        try {
            apiInstance.updateSetting(settingName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#updateSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Settings-updateSetting-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.SettingsApi;

public class SettingsApiExample {

    public static void main(String[] args) {
        SettingsApi apiInstance = new SettingsApi();
        String settingName = settingName_example; // String | setting name
        SettingRequestSwagger body = ; // SettingRequestSwagger | 
        try {
            apiInstance.updateSetting(settingName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling SettingsApi#updateSetting");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Settings-updateSetting-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Settings-updateSetting-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *settingName = settingName_example; // setting name
SettingRequestSwagger *body = ; // 

SettingsApi *apiInstance = [[SettingsApi alloc] init];

// Updates a setting
[apiInstance updateSettingWith:settingName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-updateSetting-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.SettingsApi()

var settingName = settingName_example; // {String} setting name

var body = ; // {SettingRequestSwagger} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateSetting(settingName, body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Settings-updateSetting-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Settings-updateSetting-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateSettingExample
    {
        public void main()
        {
            
            var apiInstance = new SettingsApi();
            var settingName = settingName_example;  // String | setting name
            var body = new SettingRequestSwagger(); // SettingRequestSwagger | 

            try
            {
                // Updates a setting
                apiInstance.updateSetting(settingName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling SettingsApi.updateSetting: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-updateSetting-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\SettingsApi();
$settingName = settingName_example; // String | setting name
$body = ; // SettingRequestSwagger | 

try {
    $api_instance->updateSetting($settingName, $body);
} catch (Exception $e) {
    echo 'Exception when calling SettingsApi->updateSetting: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-updateSetting-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::SettingsApi;

my $api_instance = WWW::SwaggerClient::SettingsApi->new();
my $settingName = settingName_example; # String | setting name
my $body = WWW::SwaggerClient::Object::SettingRequestSwagger->new(); # SettingRequestSwagger | 

eval { 
    $api_instance->updateSetting(settingName => $settingName, body => $body);
};
if ($@) {
    warn "Exception when calling SettingsApi->updateSetting: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Settings-updateSetting-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.SettingsApi()
settingName = settingName_example # String | setting name
body =  # SettingRequestSwagger | 

try: 
    # Updates a setting
    api_instance.updateSetting(settingName, body)
except ApiException as e:
    print("Exception when calling SettingsApi->updateSetting: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">settingName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "settingName",
  "in" : "path",
  "description" : "setting name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateSetting_settingName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateSetting_settingName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/SettingRequestSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateSetting_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateSetting_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Stacks">
                  <h1>Stacks</h1>
                    <div id="api-Stacks-stacksServiceGetServiceComponent">
                      <article id="api-Stacks-stacksServiceGetServiceComponent-0" data-group="User" data-name="stacksServiceGetServiceComponent" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetServiceComponent</h1>
                          <p>Get details for a stack service component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns details for a stack service component.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponent-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetServiceComponent-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackServiceComponentResponseSwagger result = apiInstance.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackServiceComponentResponseSwagger result = apiInstance.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponent");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackServiceComponents/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get details for a stack service component
[apiInstance stacksServiceGetServiceComponentWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    componentName:componentName
    fields:fields
              completionHandler: ^(StackServiceComponentResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetServiceComponentExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackServiceComponents/*)

            try
            {
                // Get details for a stack service component
                StackServiceComponentResponseSwagger result = apiInstance.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetServiceComponent: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetServiceComponent($stackName, $stackVersion, $serviceName, $componentName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetServiceComponent: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetServiceComponent(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, componentName => $componentName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetServiceComponent: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponent-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackServiceComponents/*)

try: 
    # Get details for a stack service component
    api_response = api_instance.stacksServiceGetServiceComponent(stackName, stackVersion, serviceName, componentName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetServiceComponent: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackServiceComponents/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponent_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponent_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetServiceComponent-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetServiceComponent-200-schema">
                                  <div id='responses-stacksServiceGetServiceComponent-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackServiceComponentResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetServiceComponent-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetServiceComponent-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetServiceComponent-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetServiceComponentDependencies">
                      <article id="api-Stacks-stacksServiceGetServiceComponentDependencies-0" data-group="User" data-name="stacksServiceGetServiceComponentDependencies" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetServiceComponentDependencies</h1>
                          <p>Get all dependencies for a stack service component</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all dependencies for a stack service component.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}/dependencies</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependencies-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}/dependencies?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort component dependencies (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ComponentDependencyResponse] result = apiInstance.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponentDependencies");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort component dependencies (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ComponentDependencyResponse] result = apiInstance.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponentDependencies");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Dependencies/stack_name,Dependencies/stack_version,Dependencies/dependent_service_name,Dependencies/dependent_component_name,Dependencies/component_name)
String *sortBy = sortBy_example; // Sort component dependencies (asc | desc) (optional) (default to Dependencies/stack_name.asc,Dependencies/stack_version.asc,Dependencies/dependent_service_name.asc,Dependencies/dependent_component_name.asc,Dependencies/component_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all dependencies for a stack service component
[apiInstance stacksServiceGetServiceComponentDependenciesWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    componentName:componentName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ComponentDependencyResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort component dependencies (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetServiceComponentDependenciesExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Dependencies/stack_name,Dependencies/stack_version,Dependencies/dependent_service_name,Dependencies/dependent_component_name,Dependencies/component_name)
            var sortBy = sortBy_example;  // String | Sort component dependencies (asc | desc) (optional)  (default to Dependencies/stack_name.asc,Dependencies/stack_version.asc,Dependencies/dependent_service_name.asc,Dependencies/dependent_component_name.asc,Dependencies/component_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all dependencies for a stack service component
                array[ComponentDependencyResponse] result = apiInstance.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetServiceComponentDependencies: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort component dependencies (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetServiceComponentDependencies($stackName, $stackVersion, $serviceName, $componentName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetServiceComponentDependencies: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort component dependencies (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetServiceComponentDependencies(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, componentName => $componentName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetServiceComponentDependencies: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependencies-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Dependencies/stack_name,Dependencies/stack_version,Dependencies/dependent_service_name,Dependencies/dependent_component_name,Dependencies/component_name)
sortBy = sortBy_example # String | Sort component dependencies (asc | desc) (optional) (default to Dependencies/stack_name.asc,Dependencies/stack_version.asc,Dependencies/dependent_service_name.asc,Dependencies/dependent_component_name.asc,Dependencies/component_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all dependencies for a stack service component
    api_response = api_instance.stacksServiceGetServiceComponentDependencies(stackName, stackVersion, serviceName, componentName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetServiceComponentDependencies: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_componentName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Dependencies/stack_name,Dependencies/stack_version,Dependencies/dependent_service_name,Dependencies/dependent_component_name,Dependencies/component_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort component dependencies (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Dependencies/stack_name.asc,Dependencies/stack_version.asc,Dependencies/dependent_service_name.asc,Dependencies/dependent_component_name.asc,Dependencies/component_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependencies_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependencies_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetServiceComponentDependencies-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetServiceComponentDependencies-200-schema">
                                  <div id='responses-stacksServiceGetServiceComponentDependencies-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ComponentDependencyResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetServiceComponentDependencies-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetServiceComponentDependencies-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetServiceComponentDependencies-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetServiceComponentDependency">
                      <article id="api-Stacks-stacksServiceGetServiceComponentDependency-0" data-group="User" data-name="stacksServiceGetServiceComponentDependency" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetServiceComponentDependency</h1>
                          <p>Get a stack service component dependency</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns a stack service component dependency.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}/dependencies/{dependencyName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponentDependency-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components/{componentName}/dependencies/{dependencyName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String dependencyName = dependencyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            ComponentDependencyResponse result = apiInstance.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponentDependency");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String componentName = componentName_example; // String | 
        String dependencyName = dependencyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            ComponentDependencyResponse result = apiInstance.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponentDependency");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *componentName = componentName_example; // 
String *dependencyName = dependencyName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Dependencies/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get a stack service component dependency
[apiInstance stacksServiceGetServiceComponentDependencyWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    componentName:componentName
    dependencyName:dependencyName
    fields:fields
              completionHandler: ^(ComponentDependencyResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var componentName = componentName_example; // {String} 

var dependencyName = dependencyName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetServiceComponentDependencyExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var componentName = componentName_example;  // String | 
            var dependencyName = dependencyName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Dependencies/*)

            try
            {
                // Get a stack service component dependency
                ComponentDependencyResponse result = apiInstance.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetServiceComponentDependency: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$componentName = componentName_example; // String | 
$dependencyName = dependencyName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetServiceComponentDependency($stackName, $stackVersion, $serviceName, $componentName, $dependencyName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetServiceComponentDependency: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $componentName = componentName_example; # String | 
my $dependencyName = dependencyName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetServiceComponentDependency(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, componentName => $componentName, dependencyName => $dependencyName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetServiceComponentDependency: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponentDependency-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
componentName = componentName_example # String | 
dependencyName = dependencyName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Dependencies/*)

try: 
    # Get a stack service component dependency
    api_response = api_instance.stacksServiceGetServiceComponentDependency(stackName, stackVersion, serviceName, componentName, dependencyName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetServiceComponentDependency: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">componentName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "componentName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_componentName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_componentName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">dependencyName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "dependencyName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_dependencyName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_dependencyName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Dependencies/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponentDependency_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponentDependency_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetServiceComponentDependency-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetServiceComponentDependency-200-schema">
                                  <div id='responses-stacksServiceGetServiceComponentDependency-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ComponentDependencyResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetServiceComponentDependency-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetServiceComponentDependency-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetServiceComponentDependency-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetServiceComponents">
                      <article id="api-Stacks-stacksServiceGetServiceComponents-0" data-group="User" data-name="stacksServiceGetServiceComponents" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetServiceComponents</h1>
                          <p>Get all components for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all components for a stack service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetServiceComponents-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetServiceComponents-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/components?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service components (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceComponentResponseSwagger] result = apiInstance.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service components (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceComponentResponseSwagger] result = apiInstance.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetServiceComponents");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackServiceComponents/component_name,StackServiceComponents/service_name,StackServiceComponents/stack_name,StackServiceComponents/stack_version)
String *sortBy = sortBy_example; // Sort service components (asc | desc) (optional) (default to StackServiceComponents/component_name.asc,StackServiceComponents/service_name.asc,StackServiceComponents/stack_name.asc,StackServiceComponents/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all components for a stack service
[apiInstance stacksServiceGetServiceComponentsWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackServiceComponentResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort service components (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetServiceComponentsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackServiceComponents/component_name,StackServiceComponents/service_name,StackServiceComponents/stack_name,StackServiceComponents/stack_version)
            var sortBy = sortBy_example;  // String | Sort service components (asc | desc) (optional)  (default to StackServiceComponents/component_name.asc,StackServiceComponents/service_name.asc,StackServiceComponents/stack_name.asc,StackServiceComponents/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all components for a stack service
                array[StackServiceComponentResponseSwagger] result = apiInstance.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetServiceComponents: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort service components (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetServiceComponents($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetServiceComponents: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort service components (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetServiceComponents(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetServiceComponents: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetServiceComponents-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackServiceComponents/component_name,StackServiceComponents/service_name,StackServiceComponents/stack_name,StackServiceComponents/stack_version)
sortBy = sortBy_example # String | Sort service components (asc | desc) (optional) (default to StackServiceComponents/component_name.asc,StackServiceComponents/service_name.asc,StackServiceComponents/stack_name.asc,StackServiceComponents/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all components for a stack service
    api_response = api_instance.stacksServiceGetServiceComponents(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetServiceComponents: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackServiceComponents/component_name,StackServiceComponents/service_name,StackServiceComponents/stack_name,StackServiceComponents/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort service components (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackServiceComponents/component_name.asc,StackServiceComponents/service_name.asc,StackServiceComponents/stack_name.asc,StackServiceComponents/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetServiceComponents_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetServiceComponents_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetServiceComponents-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetServiceComponents-200-schema">
                                  <div id='responses-stacksServiceGetServiceComponents-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackServiceComponentResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetServiceComponents-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetServiceComponents-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetServiceComponents-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStack">
                      <article id="api-Stacks-stacksServiceGetStack-0" data-group="User" data-name="stacksServiceGetStack" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStack</h1>
                          <p>Get a stack</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns stack details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStack-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStack-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStack-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String fields = fields_example; // String | Filter stack details
        try {
            array[StackResponseSwagger] result = apiInstance.stacksServiceGetStack(stackName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStack");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String fields = fields_example; // String | Filter stack details
        try {
            array[StackResponseSwagger] result = apiInstance.stacksServiceGetStack(stackName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStack");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *fields = fields_example; // Filter stack details (optional) (default to Stacks/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get a stack
[apiInstance stacksServiceGetStackWith:stackName
    fields:fields
              completionHandler: ^(array[StackResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter stack details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStack(stackName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var fields = fields_example;  // String | Filter stack details (optional)  (default to Stacks/*)

            try
            {
                // Get a stack
                array[StackResponseSwagger] result = apiInstance.stacksServiceGetStack(stackName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStack: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$fields = fields_example; // String | Filter stack details

try {
    $result = $api_instance->stacksServiceGetStack($stackName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStack: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $fields = fields_example; # String | Filter stack details

eval { 
    my $result = $api_instance->stacksServiceGetStack(stackName => $stackName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStack: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStack-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
fields = fields_example # String | Filter stack details (optional) (default to Stacks/*)

try: 
    # Get a stack
    api_response = api_instance.stacksServiceGetStack(stackName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStack: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStack_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStack_stackName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter stack details",
  "required" : false,
  "type" : "string",
  "default" : "Stacks/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStack_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStack_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStack-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStack-200-schema">
                                  <div id='responses-stacksServiceGetStack-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStack-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStack-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStack-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackArtifact">
                      <article id="api-Stacks-stacksServiceGetStackArtifact-0" data-group="User" data-name="stacksServiceGetStackArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackArtifact</h1>
                          <p>Get stack artifact details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a stack artifact</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/artifacts/{artifactName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackArtifactResponse result = apiInstance.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackArtifactResponse result = apiInstance.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *artifactName = artifactName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Artifacts/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get stack artifact details
[apiInstance stacksServiceGetStackArtifactWith:stackName
    stackVersion:stackVersion
    artifactName:artifactName
    fields:fields
              completionHandler: ^(StackArtifactResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Artifacts/*)

            try
            {
                // Get stack artifact details
                StackArtifactResponse result = apiInstance.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$artifactName = artifactName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackArtifact($stackName, $stackVersion, $artifactName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $artifactName = artifactName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackArtifact(stackName => $stackName, stackVersion => $stackVersion, artifactName => $artifactName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
artifactName = artifactName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Artifacts/*)

try: 
    # Get stack artifact details
    api_response = api_instance.stacksServiceGetStackArtifact(stackName, stackVersion, artifactName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifact_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifact_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifact_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifact_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifact_artifactName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifact_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifact_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackArtifact-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackArtifact-200-schema">
                                  <div id='responses-stacksServiceGetStackArtifact-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackArtifactResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackArtifact-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackArtifact-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackArtifact-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackArtifacts">
                      <article id="api-Stacks-stacksServiceGetStackArtifacts-0" data-group="User" data-name="stacksServiceGetStackArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackArtifacts</h1>
                          <p>Get all stack artifacts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all stack artifacts (e.g: kerberos descriptor, metrics descriptor)</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/artifacts?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            array[StackArtifactResponse] result = apiInstance.stacksServiceGetStackArtifacts(stackName, stackVersion, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            array[StackArtifactResponse] result = apiInstance.stacksServiceGetStackArtifacts(stackName, stackVersion, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all stack artifacts
[apiInstance stacksServiceGetStackArtifactsWith:stackName
    stackVersion:stackVersion
    fields:fields
              completionHandler: ^(array[StackArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackArtifacts(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)

            try
            {
                // Get all stack artifacts
                array[StackArtifactResponse] result = apiInstance.stacksServiceGetStackArtifacts(stackName, stackVersion, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackArtifacts($stackName, $stackVersion, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackArtifacts(stackName => $stackName, stackVersion => $stackVersion, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)

try: 
    # Get all stack artifacts
    api_response = api_instance.stacksServiceGetStackArtifacts(stackName, stackVersion, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifacts_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifacts_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifacts_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifacts_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackArtifacts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackArtifacts_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackArtifacts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackArtifacts-200-schema">
                                  <div id='responses-stacksServiceGetStackArtifacts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackArtifacts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackArtifacts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackArtifacts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackConfiguration">
                      <article id="api-Stacks-stacksServiceGetStackConfiguration-0" data-group="User" data-name="stacksServiceGetStackConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackConfiguration</h1>
                          <p>Get stack service configuration details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a stack service configuration.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations/{propertyName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations/{propertyName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *propertyName = propertyName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackConfigurations/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get stack service configuration details
[apiInstance stacksServiceGetStackConfigurationWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    propertyName:propertyName
    fields:fields
              completionHandler: ^(StackConfigurationResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var propertyName = propertyName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var propertyName = propertyName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackConfigurations/*)

            try
            {
                // Get stack service configuration details
                StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$propertyName = propertyName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackConfiguration($stackName, $stackVersion, $serviceName, $propertyName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $propertyName = propertyName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackConfiguration(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, propertyName => $propertyName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
propertyName = propertyName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackConfigurations/*)

try: 
    # Get stack service configuration details
    api_response = api_instance.stacksServiceGetStackConfiguration(stackName, stackVersion, serviceName, propertyName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">propertyName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "propertyName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_propertyName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_propertyName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurations/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackConfiguration-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackConfiguration-200-schema">
                                  <div id='responses-stacksServiceGetStackConfiguration-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackConfigurationResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackConfiguration-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackConfiguration-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackConfiguration-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackConfigurationDependencies">
                      <article id="api-Stacks-stacksServiceGetStackConfigurationDependencies-0" data-group="User" data-name="stacksServiceGetStackConfigurationDependencies" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackConfigurationDependencies</h1>
                          <p>Get all dependencies for a stack service configuration</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all dependencies for a stack service configuration.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations/{propertyName}/dependencies</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations/{propertyName}/dependencies?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort configuration dependencies (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationDependencyResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfigurationDependencies");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort configuration dependencies (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationDependencyResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfigurationDependencies");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *propertyName = propertyName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackConfigurationDependency/stack_name,StackConfigurationDependency/stack_version,StackConfigurationDependency/service_name,StackConfigurationDependency/property_name,StackConfigurationDependency/dependency_name)
String *sortBy = sortBy_example; // Sort configuration dependencies (asc | desc) (optional) (default to StackConfigurationDependency/stack_name.asc,StackConfigurationDependency/stack_version.asc,StackConfigurationDependency/service_name.asc,StackConfigurationDependency/property_name.asc,StackConfigurationDependency/dependency_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all dependencies for a stack service configuration
[apiInstance stacksServiceGetStackConfigurationDependenciesWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    propertyName:propertyName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackConfigurationDependencyResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var propertyName = propertyName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort configuration dependencies (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackConfigurationDependenciesExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var propertyName = propertyName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackConfigurationDependency/stack_name,StackConfigurationDependency/stack_version,StackConfigurationDependency/service_name,StackConfigurationDependency/property_name,StackConfigurationDependency/dependency_name)
            var sortBy = sortBy_example;  // String | Sort configuration dependencies (asc | desc) (optional)  (default to StackConfigurationDependency/stack_name.asc,StackConfigurationDependency/stack_version.asc,StackConfigurationDependency/service_name.asc,StackConfigurationDependency/property_name.asc,StackConfigurationDependency/dependency_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all dependencies for a stack service configuration
                array[StackConfigurationDependencyResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackConfigurationDependencies: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$propertyName = propertyName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort configuration dependencies (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackConfigurationDependencies($stackName, $stackVersion, $serviceName, $propertyName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackConfigurationDependencies: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $propertyName = propertyName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort configuration dependencies (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackConfigurationDependencies(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, propertyName => $propertyName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackConfigurationDependencies: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurationDependencies-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
propertyName = propertyName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackConfigurationDependency/stack_name,StackConfigurationDependency/stack_version,StackConfigurationDependency/service_name,StackConfigurationDependency/property_name,StackConfigurationDependency/dependency_name)
sortBy = sortBy_example # String | Sort configuration dependencies (asc | desc) (optional) (default to StackConfigurationDependency/stack_name.asc,StackConfigurationDependency/stack_version.asc,StackConfigurationDependency/service_name.asc,StackConfigurationDependency/property_name.asc,StackConfigurationDependency/dependency_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all dependencies for a stack service configuration
    api_response = api_instance.stacksServiceGetStackConfigurationDependencies(stackName, stackVersion, serviceName, propertyName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackConfigurationDependencies: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">propertyName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "propertyName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_propertyName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_propertyName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurationDependency/stack_name,StackConfigurationDependency/stack_version,StackConfigurationDependency/service_name,StackConfigurationDependency/property_name,StackConfigurationDependency/dependency_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort configuration dependencies (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurationDependency/stack_name.asc,StackConfigurationDependency/stack_version.asc,StackConfigurationDependency/service_name.asc,StackConfigurationDependency/property_name.asc,StackConfigurationDependency/dependency_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurationDependencies_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurationDependencies_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackConfigurationDependencies-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackConfigurationDependencies-200-schema">
                                  <div id='responses-stacksServiceGetStackConfigurationDependencies-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackConfigurationDependencyResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackConfigurationDependencies-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackConfigurationDependencies-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackConfigurationDependencies-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackConfigurations">
                      <article id="api-Stacks-stacksServiceGetStackConfigurations-0" data-group="User" data-name="stacksServiceGetStackConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackConfigurations</h1>
                          <p>Get all configurations for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all configurations for a stack service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/configurations?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service configurations (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service configurations (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackConfigurations/property_name,StackConfigurations/service_name,StackConfigurations/stack_nameStackConfigurations/stack_version)
String *sortBy = sortBy_example; // Sort service configurations (asc | desc) (optional) (default to StackConfigurations/property_name.asc,StackConfigurations/service_name.asc,StackConfigurations/stack_name.ascStackConfigurations/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all configurations for a stack service
[apiInstance stacksServiceGetStackConfigurationsWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackConfigurationResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort service configurations (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackConfigurations/property_name,StackConfigurations/service_name,StackConfigurations/stack_nameStackConfigurations/stack_version)
            var sortBy = sortBy_example;  // String | Sort service configurations (asc | desc) (optional)  (default to StackConfigurations/property_name.asc,StackConfigurations/service_name.asc,StackConfigurations/stack_name.ascStackConfigurations/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all configurations for a stack service
                array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort service configurations (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackConfigurations($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort service configurations (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackConfigurations(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackConfigurations/property_name,StackConfigurations/service_name,StackConfigurations/stack_nameStackConfigurations/stack_version)
sortBy = sortBy_example # String | Sort service configurations (asc | desc) (optional) (default to StackConfigurations/property_name.asc,StackConfigurations/service_name.asc,StackConfigurations/stack_name.ascStackConfigurations/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all configurations for a stack service
    api_response = api_instance.stacksServiceGetStackConfigurations(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurations/property_name,StackConfigurations/service_name,StackConfigurations/stack_nameStackConfigurations/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort service configurations (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackConfigurations/property_name.asc,StackConfigurations/service_name.asc,StackConfigurations/stack_name.ascStackConfigurations/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackConfigurations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackConfigurations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackConfigurations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackConfigurations-200-schema">
                                  <div id='responses-stacksServiceGetStackConfigurations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackConfigurationResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackConfigurations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackConfigurations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackConfigurations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackLevelConfiguration">
                      <article id="api-Stacks-stacksServiceGetStackLevelConfiguration-0" data-group="User" data-name="stacksServiceGetStackLevelConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackLevelConfiguration</h1>
                          <p>Get configuration details for a given property</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the configuration details for a given property.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/configurations/{propertyName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/configurations/{propertyName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackLevelConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String propertyName = propertyName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackLevelConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *propertyName = propertyName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackLevelConfigurations/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get configuration details for a given property
[apiInstance stacksServiceGetStackLevelConfigurationWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    propertyName:propertyName
    fields:fields
              completionHandler: ^(StackConfigurationResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var propertyName = propertyName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackLevelConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var propertyName = propertyName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackLevelConfigurations/*)

            try
            {
                // Get configuration details for a given property
                StackConfigurationResponseSwagger result = apiInstance.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackLevelConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$propertyName = propertyName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackLevelConfiguration($stackName, $stackVersion, $serviceName, $propertyName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackLevelConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $propertyName = propertyName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackLevelConfiguration(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, propertyName => $propertyName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackLevelConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
propertyName = propertyName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackLevelConfigurations/*)

try: 
    # Get configuration details for a given property
    api_response = api_instance.stacksServiceGetStackLevelConfiguration(stackName, stackVersion, serviceName, propertyName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackLevelConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">propertyName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "propertyName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_propertyName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_propertyName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackLevelConfigurations/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackLevelConfiguration-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackLevelConfiguration-200-schema">
                                  <div id='responses-stacksServiceGetStackLevelConfiguration-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackConfigurationResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackLevelConfiguration-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackLevelConfiguration-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackLevelConfiguration-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackLevelConfigurations">
                      <article id="api-Stacks-stacksServiceGetStackLevelConfigurations-0" data-group="User" data-name="stacksServiceGetStackLevelConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackLevelConfigurations</h1>
                          <p>Get all configurations for a stack version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all configurations for a stack version.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/configurations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackLevelConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/configurations?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort configuration (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackLevelConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort configuration (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackLevelConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackLevelConfigurations/stack_name,StackLevelConfigurations/stack_version,StackLevelConfigurations/property_name)
String *sortBy = sortBy_example; // Sort configuration (asc | desc) (optional) (default to StackLevelConfigurations/stack_name.asc,StackLevelConfigurations/stack_version.asc,StackLevelConfigurations/property_name.asc )
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all configurations for a stack version
[apiInstance stacksServiceGetStackLevelConfigurationsWith:stackName
    stackVersion:stackVersion
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackConfigurationResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort configuration (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackLevelConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackLevelConfigurations/stack_name,StackLevelConfigurations/stack_version,StackLevelConfigurations/property_name)
            var sortBy = sortBy_example;  // String | Sort configuration (asc | desc) (optional)  (default to StackLevelConfigurations/stack_name.asc,StackLevelConfigurations/stack_version.asc,StackLevelConfigurations/property_name.asc )
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all configurations for a stack version
                array[StackConfigurationResponseSwagger] result = apiInstance.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackLevelConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort configuration (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackLevelConfigurations($stackName, $stackVersion, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackLevelConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort configuration (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackLevelConfigurations(stackName => $stackName, stackVersion => $stackVersion, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackLevelConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackLevelConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackLevelConfigurations/stack_name,StackLevelConfigurations/stack_version,StackLevelConfigurations/property_name)
sortBy = sortBy_example # String | Sort configuration (asc | desc) (optional) (default to StackLevelConfigurations/stack_name.asc,StackLevelConfigurations/stack_version.asc,StackLevelConfigurations/property_name.asc )
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all configurations for a stack version
    api_response = api_instance.stacksServiceGetStackLevelConfigurations(stackName, stackVersion, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackLevelConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackLevelConfigurations/stack_name,StackLevelConfigurations/stack_version,StackLevelConfigurations/property_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort configuration (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackLevelConfigurations/stack_name.asc,StackLevelConfigurations/stack_version.asc,StackLevelConfigurations/property_name.asc "
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackLevelConfigurations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackLevelConfigurations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackLevelConfigurations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackLevelConfigurations-200-schema">
                                  <div id='responses-stacksServiceGetStackLevelConfigurations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackConfigurationResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackLevelConfigurations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackLevelConfigurations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackLevelConfigurations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackService">
                      <article id="api-Stacks-stacksServiceGetStackService-0" data-group="User" data-name="stacksServiceGetStackService" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackService</h1>
                          <p>Get stack service details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a stack service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackServiceResponseSwagger result = apiInstance.stacksServiceGetStackService(stackName, stackVersion, serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackServiceResponseSwagger result = apiInstance.stacksServiceGetStackService(stackName, stackVersion, serviceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackServices/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get stack service details
[apiInstance stacksServiceGetStackServiceWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
              completionHandler: ^(StackServiceResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackService(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackServices/*)

            try
            {
                // Get stack service details
                StackServiceResponseSwagger result = apiInstance.stacksServiceGetStackService(stackName, stackVersion, serviceName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackService($stackName, $stackVersion, $serviceName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackService(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackServices/*)

try: 
    # Get stack service details
    api_response = api_instance.stacksServiceGetStackService(stackName, stackVersion, serviceName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackService_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackService_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackService_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackService_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackService_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackService_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackServices/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackService_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackService_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackService-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackService-200-schema">
                                  <div id='responses-stacksServiceGetStackService-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackServiceResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackService-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackService-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackService-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceArtifact">
                      <article id="api-Stacks-stacksServiceGetStackServiceArtifact-0" data-group="User" data-name="stacksServiceGetStackServiceArtifact" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceArtifact</h1>
                          <p>Get stack service artifact details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a stack service artifact.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/artifacts/{artifactName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifact-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/artifacts/{artifactName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackArtifactResponse result = apiInstance.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String artifactName = artifactName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            StackArtifactResponse result = apiInstance.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceArtifact");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *artifactName = artifactName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Artifacts/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get stack service artifact details
[apiInstance stacksServiceGetStackServiceArtifactWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    artifactName:artifactName
    fields:fields
              completionHandler: ^(StackArtifactResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var artifactName = artifactName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceArtifactExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var artifactName = artifactName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Artifacts/*)

            try
            {
                // Get stack service artifact details
                StackArtifactResponse result = apiInstance.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceArtifact: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$artifactName = artifactName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackServiceArtifact($stackName, $stackVersion, $serviceName, $artifactName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceArtifact: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $artifactName = artifactName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceArtifact(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, artifactName => $artifactName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceArtifact: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifact-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
artifactName = artifactName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Artifacts/*)

try: 
    # Get stack service artifact details
    api_response = api_instance.stacksServiceGetStackServiceArtifact(stackName, stackVersion, serviceName, artifactName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceArtifact: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">artifactName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "artifactName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_artifactName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_artifactName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifact_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifact_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceArtifact-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceArtifact-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceArtifact-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackArtifactResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceArtifact-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceArtifact-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceArtifact-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceArtifacts">
                      <article id="api-Stacks-stacksServiceGetStackServiceArtifacts-0" data-group="User" data-name="stacksServiceGetStackServiceArtifacts" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceArtifacts</h1>
                          <p>Get all artifacts for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all stack service artifacts</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/artifacts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceArtifacts-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/artifacts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceArtifactResponse] result = apiInstance.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceArtifactResponse] result = apiInstance.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceArtifacts");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)
String *sortBy = sortBy_example; // Sort service artifacts (asc | desc) (optional) (default to Artifacts/artifact_name.asc,Artifacts/stack_name.asc,Artifacts/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all artifacts for a stack service
[apiInstance stacksServiceGetStackServiceArtifactsWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackServiceArtifactResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort service artifacts (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceArtifactsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)
            var sortBy = sortBy_example;  // String | Sort service artifacts (asc | desc) (optional)  (default to Artifacts/artifact_name.asc,Artifacts/stack_name.asc,Artifacts/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all artifacts for a stack service
                array[StackServiceArtifactResponse] result = apiInstance.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceArtifacts: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackServiceArtifacts($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceArtifacts: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort service artifacts (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceArtifacts(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceArtifacts: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceArtifacts-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version)
sortBy = sortBy_example # String | Sort service artifacts (asc | desc) (optional) (default to Artifacts/artifact_name.asc,Artifacts/stack_name.asc,Artifacts/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all artifacts for a stack service
    api_response = api_instance.stacksServiceGetStackServiceArtifacts(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceArtifacts: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name,Artifacts/stack_name,Artifacts/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort service artifacts (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Artifacts/artifact_name.asc,Artifacts/stack_name.asc,Artifacts/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceArtifacts_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceArtifacts_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceArtifacts-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceArtifacts-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceArtifacts-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackServiceArtifactResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceArtifacts-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceArtifacts-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceArtifacts-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration">
                      <article id="api-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0" data-group="User" data-name="stacksServiceGetStackServiceQuickLinksConfiguration" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceQuickLinksConfiguration</h1>
                          <p>Get quicklinks configuration details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details of a quicklinks configuration.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/quicklinks/{quickLinksConfigurationName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/quicklinks/{quickLinksConfigurationName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String quickLinksConfigurationName = quickLinksConfigurationName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceQuickLinksConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String quickLinksConfigurationName = quickLinksConfigurationName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceQuickLinksConfiguration");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *quickLinksConfigurationName = quickLinksConfigurationName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to QuickLinkInfo/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get quicklinks configuration details
[apiInstance stacksServiceGetStackServiceQuickLinksConfigurationWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    quickLinksConfigurationName:quickLinksConfigurationName
    fields:fields
              completionHandler: ^(array[QuickLinksResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var quickLinksConfigurationName = quickLinksConfigurationName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceQuickLinksConfigurationExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var quickLinksConfigurationName = quickLinksConfigurationName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to QuickLinkInfo/*)

            try
            {
                // Get quicklinks configuration details
                array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceQuickLinksConfiguration: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$quickLinksConfigurationName = quickLinksConfigurationName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackServiceQuickLinksConfiguration($stackName, $stackVersion, $serviceName, $quickLinksConfigurationName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfiguration: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $quickLinksConfigurationName = quickLinksConfigurationName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceQuickLinksConfiguration(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, quickLinksConfigurationName => $quickLinksConfigurationName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfiguration: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfiguration-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
quickLinksConfigurationName = quickLinksConfigurationName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to QuickLinkInfo/*)

try: 
    # Get quicklinks configuration details
    api_response = api_instance.stacksServiceGetStackServiceQuickLinksConfiguration(stackName, stackVersion, serviceName, quickLinksConfigurationName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfiguration: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">quickLinksConfigurationName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "quickLinksConfigurationName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_quickLinksConfigurationName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_quickLinksConfigurationName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "QuickLinkInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfiguration_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/QuickLinksResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceQuickLinksConfiguration-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations">
                      <article id="api-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0" data-group="User" data-name="stacksServiceGetStackServiceQuickLinksConfigurations" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceQuickLinksConfigurations</h1>
                          <p>Get all quicklinks configurations for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all quicklinks configurations for a stack service.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/quicklinks</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/quicklinks?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort quick links (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceQuickLinksConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort quick links (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceQuickLinksConfigurations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to QuickLinkInfo/file_name,QuickLinkInfo/service_name,QuickLinkInfo/stack_name,QuickLinkInfo/stack_version)
String *sortBy = sortBy_example; // Sort quick links (asc | desc) (optional) (default to QuickLinkInfo/file_name.asc,QuickLinkInfo/service_name.asc,QuickLinkInfo/stack_name.asc,QuickLinkInfo/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all quicklinks configurations for a stack service
[apiInstance stacksServiceGetStackServiceQuickLinksConfigurationsWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[QuickLinksResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort quick links (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceQuickLinksConfigurationsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to QuickLinkInfo/file_name,QuickLinkInfo/service_name,QuickLinkInfo/stack_name,QuickLinkInfo/stack_version)
            var sortBy = sortBy_example;  // String | Sort quick links (asc | desc) (optional)  (default to QuickLinkInfo/file_name.asc,QuickLinkInfo/service_name.asc,QuickLinkInfo/stack_name.asc,QuickLinkInfo/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all quicklinks configurations for a stack service
                array[QuickLinksResponse] result = apiInstance.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceQuickLinksConfigurations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort quick links (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackServiceQuickLinksConfigurations($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfigurations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort quick links (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceQuickLinksConfigurations(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfigurations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceQuickLinksConfigurations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to QuickLinkInfo/file_name,QuickLinkInfo/service_name,QuickLinkInfo/stack_name,QuickLinkInfo/stack_version)
sortBy = sortBy_example # String | Sort quick links (asc | desc) (optional) (default to QuickLinkInfo/file_name.asc,QuickLinkInfo/service_name.asc,QuickLinkInfo/stack_name.asc,QuickLinkInfo/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all quicklinks configurations for a stack service
    api_response = api_instance.stacksServiceGetStackServiceQuickLinksConfigurations(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceQuickLinksConfigurations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "QuickLinkInfo/file_name,QuickLinkInfo/service_name,QuickLinkInfo/stack_name,QuickLinkInfo/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort quick links (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "QuickLinkInfo/file_name.asc,QuickLinkInfo/service_name.asc,QuickLinkInfo/stack_name.asc,QuickLinkInfo/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceQuickLinksConfigurations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/QuickLinksResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceQuickLinksConfigurations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceTheme">
                      <article id="api-Stacks-stacksServiceGetStackServiceTheme-0" data-group="User" data-name="stacksServiceGetStackServiceTheme" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceTheme</h1>
                          <p>Get theme details for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns stack service theme details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/themes/{themeName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceTheme-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/themes/{themeName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String themeName = themeName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            ThemeResponse result = apiInstance.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceTheme");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String themeName = themeName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        try {
            ThemeResponse result = apiInstance.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceTheme");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *themeName = themeName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to ThemeInfo/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get theme details for a stack service
[apiInstance stacksServiceGetStackServiceThemeWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    themeName:themeName
    fields:fields
              completionHandler: ^(ThemeResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var themeName = themeName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter returned attributes
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceThemeExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var themeName = themeName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to ThemeInfo/*)

            try
            {
                // Get theme details for a stack service
                ThemeResponse result = apiInstance.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceTheme: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$themeName = themeName_example; // String | 
$fields = fields_example; // String | Filter returned attributes

try {
    $result = $api_instance->stacksServiceGetStackServiceTheme($stackName, $stackVersion, $serviceName, $themeName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceTheme: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $themeName = themeName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceTheme(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, themeName => $themeName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceTheme: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceTheme-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
themeName = themeName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to ThemeInfo/*)

try: 
    # Get theme details for a stack service
    api_response = api_instance.stacksServiceGetStackServiceTheme(stackName, stackVersion, serviceName, themeName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceTheme: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_serviceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">themeName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "themeName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_themeName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_themeName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "ThemeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceTheme_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceTheme_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceTheme-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceTheme-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceTheme-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ThemeResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceTheme-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceTheme-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceTheme-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServiceThemes">
                      <article id="api-Stacks-stacksServiceGetStackServiceThemes-0" data-group="User" data-name="stacksServiceGetStackServiceThemes" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServiceThemes</h1>
                          <p>Get all themes for a stack service</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all stack themes</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/themes</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServiceThemes-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services/{serviceName}/themes?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ThemeResponse] result = apiInstance.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceThemes");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String serviceName = serviceName_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ThemeResponse] result = apiInstance.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServiceThemes");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *serviceName = serviceName_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to ThemeInfo/file_name,ThemeInfo/service_name,ThemeInfo/stack_name,ThemeInfo/stack_version)
String *sortBy = sortBy_example; // Sort service artifacts (asc | desc) (optional) (default to ThemeInfo/file_name.asc,ThemeInfo/service_name.asc,ThemeInfo/stack_name.asc,ThemeInfo/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all themes for a stack service
[apiInstance stacksServiceGetStackServiceThemesWith:stackName
    stackVersion:stackVersion
    serviceName:serviceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ThemeResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var serviceName = serviceName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort service artifacts (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServiceThemesExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var serviceName = serviceName_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to ThemeInfo/file_name,ThemeInfo/service_name,ThemeInfo/stack_name,ThemeInfo/stack_version)
            var sortBy = sortBy_example;  // String | Sort service artifacts (asc | desc) (optional)  (default to ThemeInfo/file_name.asc,ThemeInfo/service_name.asc,ThemeInfo/stack_name.asc,ThemeInfo/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all themes for a stack service
                array[ThemeResponse] result = apiInstance.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServiceThemes: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$serviceName = serviceName_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort service artifacts (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackServiceThemes($stackName, $stackVersion, $serviceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServiceThemes: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $serviceName = serviceName_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort service artifacts (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackServiceThemes(stackName => $stackName, stackVersion => $stackVersion, serviceName => $serviceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServiceThemes: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServiceThemes-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
serviceName = serviceName_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to ThemeInfo/file_name,ThemeInfo/service_name,ThemeInfo/stack_name,ThemeInfo/stack_version)
sortBy = sortBy_example # String | Sort service artifacts (asc | desc) (optional) (default to ThemeInfo/file_name.asc,ThemeInfo/service_name.asc,ThemeInfo/stack_name.asc,ThemeInfo/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all themes for a stack service
    api_response = api_instance.stacksServiceGetStackServiceThemes(stackName, stackVersion, serviceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServiceThemes: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_stackVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">serviceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "serviceName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_serviceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_serviceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "ThemeInfo/file_name,ThemeInfo/service_name,ThemeInfo/stack_name,ThemeInfo/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort service artifacts (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "ThemeInfo/file_name.asc,ThemeInfo/service_name.asc,ThemeInfo/stack_name.asc,ThemeInfo/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServiceThemes_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServiceThemes_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServiceThemes-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServiceThemes-200-schema">
                                  <div id='responses-stacksServiceGetStackServiceThemes-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ThemeResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServiceThemes-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServiceThemes-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServiceThemes-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackServices">
                      <article id="api-Stacks-stacksServiceGetStackServices-0" data-group="User" data-name="stacksServiceGetStackServices" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackServices</h1>
                          <p>Get all services for a stack version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all services for a stack version.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/services</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/services?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort stack services (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceResponseSwagger] result = apiInstance.stacksServiceGetStackServices(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter returned attributes
        String sortBy = sortBy_example; // String | Sort stack services (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackServiceResponseSwagger] result = apiInstance.stacksServiceGetStackServices(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter returned attributes (optional) (default to StackServices/stack_name,StackServices/stack_version,StackServices/service_name)
String *sortBy = sortBy_example; // Sort stack services (asc | desc) (optional) (default to StackServices/stack_name.asc,StackServices/stack_version.asc,StackServices/service_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all services for a stack version
[apiInstance stacksServiceGetStackServicesWith:stackName
    stackVersion:stackVersion
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackServiceResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter returned attributes
  'sortBy': sortBy_example, // {String} Sort stack services (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackServices(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackServicesExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter returned attributes (optional)  (default to StackServices/stack_name,StackServices/stack_version,StackServices/service_name)
            var sortBy = sortBy_example;  // String | Sort stack services (asc | desc) (optional)  (default to StackServices/stack_name.asc,StackServices/stack_version.asc,StackServices/service_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all services for a stack version
                array[StackServiceResponseSwagger] result = apiInstance.stacksServiceGetStackServices(stackName, stackVersion, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter returned attributes
$sortBy = sortBy_example; // String | Sort stack services (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackServices($stackName, $stackVersion, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter returned attributes
my $sortBy = sortBy_example; # String | Sort stack services (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackServices(stackName => $stackName, stackVersion => $stackVersion, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter returned attributes (optional) (default to StackServices/stack_name,StackServices/stack_version,StackServices/service_name)
sortBy = sortBy_example # String | Sort stack services (asc | desc) (optional) (default to StackServices/stack_name.asc,StackServices/stack_version.asc,StackServices/service_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all services for a stack version
    api_response = api_instance.stacksServiceGetStackServices(stackName, stackVersion, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter returned attributes",
  "required" : false,
  "type" : "string",
  "default" : "StackServices/stack_name,StackServices/stack_version,StackServices/service_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort stack services (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "StackServices/stack_name.asc,StackServices/stack_version.asc,StackServices/service_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackServices_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackServices_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackServices-200-schema">
                                  <div id='responses-stacksServiceGetStackServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackServiceResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackVersion">
                      <article id="api-Stacks-stacksServiceGetStackVersion-0" data-group="User" data-name="stacksServiceGetStackVersion" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackVersion</h1>
                          <p>Get details for a stack version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the details for a stack version.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackVersion-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersion-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackVersion-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter stack version details
        try {
            StackVersionResponseSwagger result = apiInstance.stacksServiceGetStackVersion(stackName, stackVersion, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersion");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter stack version details
        try {
            StackVersionResponseSwagger result = apiInstance.stacksServiceGetStackVersion(stackName, stackVersion, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersion");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter stack version details (optional) (default to Versions/*)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get details for a stack version
[apiInstance stacksServiceGetStackVersionWith:stackName
    stackVersion:stackVersion
    fields:fields
              completionHandler: ^(StackVersionResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter stack version details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackVersion(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackVersionExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter stack version details (optional)  (default to Versions/*)

            try
            {
                // Get details for a stack version
                StackVersionResponseSwagger result = apiInstance.stacksServiceGetStackVersion(stackName, stackVersion, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackVersion: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter stack version details

try {
    $result = $api_instance->stacksServiceGetStackVersion($stackName, $stackVersion, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackVersion: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter stack version details

eval { 
    my $result = $api_instance->stacksServiceGetStackVersion(stackName => $stackName, stackVersion => $stackVersion, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackVersion: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersion-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter stack version details (optional) (default to Versions/*)

try: 
    # Get details for a stack version
    api_response = api_instance.stacksServiceGetStackVersion(stackName, stackVersion, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackVersion: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersion_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersion_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersion_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersion_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter stack version details",
  "required" : false,
  "type" : "string",
  "default" : "Versions/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersion_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersion_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackVersion-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackVersion-200-schema">
                                  <div id='responses-stacksServiceGetStackVersion-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/StackVersionResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackVersion-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackVersion-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackVersion-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackVersionLinks">
                      <article id="api-Stacks-stacksServiceGetStackVersionLinks-0" data-group="User" data-name="stacksServiceGetStackVersionLinks" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackVersionLinks</h1>
                          <p>Get extension links for a stack version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns the extension links for a stack version.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions/{stackVersion}/links</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersionLinks-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions/{stackVersion}/links?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter extension link attributes
        String sortBy = sortBy_example; // String | Sort extension links (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ExtensionLinkResponse] result = apiInstance.stacksServiceGetStackVersionLinks(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersionLinks");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String stackVersion = stackVersion_example; // String | 
        String fields = fields_example; // String | Filter extension link attributes
        String sortBy = sortBy_example; // String | Sort extension links (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ExtensionLinkResponse] result = apiInstance.stacksServiceGetStackVersionLinks(stackName, stackVersion, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersionLinks");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *stackVersion = stackVersion_example; // 
String *fields = fields_example; // Filter extension link attributes (optional) (default to ExtensionLink/link_id,ExtensionLink/stack_name,ExtensionLink/stack_version,ExtensionLink/extension_name,ExtensionLink/extension_version)
String *sortBy = sortBy_example; // Sort extension links (asc | desc) (optional) (default to ExtensionLink/link_id.asc,ExtensionLink/stack_name.asc,ExtensionLink/stack_version.asc,ExtensionLink/extension_name.asc,ExtensionLink/extension_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get extension links for a stack version
[apiInstance stacksServiceGetStackVersionLinksWith:stackName
    stackVersion:stackVersion
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ExtensionLinkResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var stackVersion = stackVersion_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter extension link attributes
  'sortBy': sortBy_example, // {String} Sort extension links (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackVersionLinks(stackName, stackVersion, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackVersionLinksExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var stackVersion = stackVersion_example;  // String | 
            var fields = fields_example;  // String | Filter extension link attributes (optional)  (default to ExtensionLink/link_id,ExtensionLink/stack_name,ExtensionLink/stack_version,ExtensionLink/extension_name,ExtensionLink/extension_version)
            var sortBy = sortBy_example;  // String | Sort extension links (asc | desc) (optional)  (default to ExtensionLink/link_id.asc,ExtensionLink/stack_name.asc,ExtensionLink/stack_version.asc,ExtensionLink/extension_name.asc,ExtensionLink/extension_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get extension links for a stack version
                array[ExtensionLinkResponse] result = apiInstance.stacksServiceGetStackVersionLinks(stackName, stackVersion, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackVersionLinks: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$stackVersion = stackVersion_example; // String | 
$fields = fields_example; // String | Filter extension link attributes
$sortBy = sortBy_example; // String | Sort extension links (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackVersionLinks($stackName, $stackVersion, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackVersionLinks: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $stackVersion = stackVersion_example; # String | 
my $fields = fields_example; # String | Filter extension link attributes
my $sortBy = sortBy_example; # String | Sort extension links (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackVersionLinks(stackName => $stackName, stackVersion => $stackVersion, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackVersionLinks: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersionLinks-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
stackVersion = stackVersion_example # String | 
fields = fields_example # String | Filter extension link attributes (optional) (default to ExtensionLink/link_id,ExtensionLink/stack_name,ExtensionLink/stack_version,ExtensionLink/extension_name,ExtensionLink/extension_version)
sortBy = sortBy_example # String | Sort extension links (asc | desc) (optional) (default to ExtensionLink/link_id.asc,ExtensionLink/stack_name.asc,ExtensionLink/stack_version.asc,ExtensionLink/extension_name.asc,ExtensionLink/extension_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get extension links for a stack version
    api_response = api_instance.stacksServiceGetStackVersionLinks(stackName, stackVersion, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackVersionLinks: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_stackName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">stackVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackVersion",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_stackVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_stackVersion"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter extension link attributes",
  "required" : false,
  "type" : "string",
  "default" : "ExtensionLink/link_id,ExtensionLink/stack_name,ExtensionLink/stack_version,ExtensionLink/extension_name,ExtensionLink/extension_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort extension links (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "ExtensionLink/link_id.asc,ExtensionLink/stack_name.asc,ExtensionLink/stack_version.asc,ExtensionLink/extension_name.asc,ExtensionLink/extension_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersionLinks_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersionLinks_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackVersionLinks-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackVersionLinks-200-schema">
                                  <div id='responses-stacksServiceGetStackVersionLinks-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ExtensionLinkResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackVersionLinks-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackVersionLinks-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackVersionLinks-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStackVersions">
                      <article id="api-Stacks-stacksServiceGetStackVersions-0" data-group="User" data-name="stacksServiceGetStackVersions" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStackVersions</h1>
                          <p>Get all versions for a stacks</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all versions for a stack.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks/{stackName}/versions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStackVersions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStackVersions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStackVersions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks/{stackName}/versions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String fields = fields_example; // String | Filter stack version details
        String sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackVersionResponseSwagger] result = apiInstance.stacksServiceGetStackVersions(stackName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String stackName = stackName_example; // String | 
        String fields = fields_example; // String | Filter stack version details
        String sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackVersionResponseSwagger] result = apiInstance.stacksServiceGetStackVersions(stackName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStackVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *stackName = stackName_example; // 
String *fields = fields_example; // Filter stack version details (optional) (default to Versions/stack_name,Versions/stack_version)
String *sortBy = sortBy_example; // Sort stack privileges (asc | desc) (optional) (default to Versions/stack_name.asc,Versions/stack_version.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all versions for a stacks
[apiInstance stacksServiceGetStackVersionsWith:stackName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackVersionResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var stackName = stackName_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter stack version details
  'sortBy': sortBy_example, // {String} Sort stack privileges (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStackVersions(stackName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStackVersionsExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var stackName = stackName_example;  // String | 
            var fields = fields_example;  // String | Filter stack version details (optional)  (default to Versions/stack_name,Versions/stack_version)
            var sortBy = sortBy_example;  // String | Sort stack privileges (asc | desc) (optional)  (default to Versions/stack_name.asc,Versions/stack_version.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all versions for a stacks
                array[StackVersionResponseSwagger] result = apiInstance.stacksServiceGetStackVersions(stackName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStackVersions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$stackName = stackName_example; // String | 
$fields = fields_example; // String | Filter stack version details
$sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStackVersions($stackName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStackVersions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $stackName = stackName_example; # String | 
my $fields = fields_example; # String | Filter stack version details
my $sortBy = sortBy_example; # String | Sort stack privileges (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStackVersions(stackName => $stackName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStackVersions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStackVersions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
stackName = stackName_example # String | 
fields = fields_example # String | Filter stack version details (optional) (default to Versions/stack_name,Versions/stack_version)
sortBy = sortBy_example # String | Sort stack privileges (asc | desc) (optional) (default to Versions/stack_name.asc,Versions/stack_version.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all versions for a stacks
    api_response = api_instance.stacksServiceGetStackVersions(stackName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStackVersions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">stackName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "stackName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_stackName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_stackName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter stack version details",
  "required" : false,
  "type" : "string",
  "default" : "Versions/stack_name,Versions/stack_version"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort stack privileges (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Versions/stack_name.asc,Versions/stack_version.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStackVersions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStackVersions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStackVersions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStackVersions-200-schema">
                                  <div id='responses-stacksServiceGetStackVersions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackVersionResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStackVersions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStackVersions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStackVersions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Stacks-stacksServiceGetStacks">
                      <article id="api-Stacks-stacksServiceGetStacks-0" data-group="User" data-name="stacksServiceGetStacks" data-version="0">
                        <div class="pull-left">
                          <h1>stacksServiceGetStacks</h1>
                          <p>Get all stacks</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all stacks.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/stacks</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Stacks-stacksServiceGetStacks-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-java">Java</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Stacks-stacksServiceGetStacks-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Stacks-stacksServiceGetStacks-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/stacks?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.StacksApi;

import java.io.File;
import java.util.*;

public class StacksApiExample {

    public static void main(String[] args) {
        
        StacksApi apiInstance = new StacksApi();
        String fields = fields_example; // String | Filter stack details
        String sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackResponseSwagger] result = apiInstance.stacksServiceGetStacks(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStacks");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.StacksApi;

public class StacksApiExample {

    public static void main(String[] args) {
        StacksApi apiInstance = new StacksApi();
        String fields = fields_example; // String | Filter stack details
        String sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
        String to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[StackResponseSwagger] result = apiInstance.stacksServiceGetStacks(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling StacksApi#stacksServiceGetStacks");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter stack details (optional) (default to Stacks/stack_name)
String *sortBy = sortBy_example; // Sort stack privileges (asc | desc) (optional) (default to Stacks/stack_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive).  "end" is also accepted. (optional)

StacksApi *apiInstance = [[StacksApi alloc] init];

// Get all stacks
[apiInstance stacksServiceGetStacksWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[StackResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.StacksApi()

var opts = { 
  'fields': fields_example, // {String} Filter stack details
  'sortBy': sortBy_example, // {String} Sort stack privileges (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive).  "start" is also accepted.
  'to': to_example // {String} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.stacksServiceGetStacks(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class stacksServiceGetStacksExample
    {
        public void main()
        {
            
            var apiInstance = new StacksApi();
            var fields = fields_example;  // String | Filter stack details (optional)  (default to Stacks/stack_name)
            var sortBy = sortBy_example;  // String | Sort stack privileges (asc | desc) (optional)  (default to Stacks/stack_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all stacks
                array[StackResponseSwagger] result = apiInstance.stacksServiceGetStacks(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling StacksApi.stacksServiceGetStacks: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\StacksApi();
$fields = fields_example; // String | Filter stack details
$sortBy = sortBy_example; // String | Sort stack privileges (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive).  "start" is also accepted.
$to = to_example; // String | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->stacksServiceGetStacks($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling StacksApi->stacksServiceGetStacks: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::StacksApi;

my $api_instance = WWW::SwaggerClient::StacksApi->new();
my $fields = fields_example; # String | Filter stack details
my $sortBy = sortBy_example; # String | Sort stack privileges (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive).  "start" is also accepted.
my $to = to_example; # String | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->stacksServiceGetStacks(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling StacksApi->stacksServiceGetStacks: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Stacks-stacksServiceGetStacks-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.StacksApi()
fields = fields_example # String | Filter stack details (optional) (default to Stacks/stack_name)
sortBy = sortBy_example # String | Sort stack privileges (asc | desc) (optional) (default to Stacks/stack_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all stacks
    api_response = api_instance.stacksServiceGetStacks(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling StacksApi->stacksServiceGetStacks: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter stack details",
  "required" : false,
  "type" : "string",
  "default" : "Stacks/stack_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort stack privileges (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Stacks/stack_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_stacksServiceGetStacks_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_stacksServiceGetStacks_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-stacksServiceGetStacks-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-stacksServiceGetStacks-200-schema">
                                  <div id='responses-stacksServiceGetStacks-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/StackResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-stacksServiceGetStacks-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-stacksServiceGetStacks-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-stacksServiceGetStacks-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-UserAuthenticationSources">
                  <h1>UserAuthenticationSources</h1>
                    <div id="api-UserAuthenticationSources-createAuthenticationSources">
                      <article id="api-UserAuthenticationSources-createAuthenticationSources-0" data-group="User" data-name="createAuthenticationSources" data-version="0">
                        <div class="pull-left">
                          <h1>createAuthenticationSources</h1>
                          <p>Create one or more new authentication sources for a user</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/users/{userName}/sources</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-createAuthenticationSources-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-createAuthenticationSources-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/users/{userName}/sources"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        UserAuthenticationSourceRequestCreateSwagger body = ; // UserAuthenticationSourceRequestCreateSwagger | 
        try {
            apiInstance.createAuthenticationSources(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#createAuthenticationSources");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        UserAuthenticationSourceRequestCreateSwagger body = ; // UserAuthenticationSourceRequestCreateSwagger | 
        try {
            apiInstance.createAuthenticationSources(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#createAuthenticationSources");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
UserAuthenticationSourceRequestCreateSwagger *body = ; //  (optional)

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Create one or more new authentication sources for a user
[apiInstance createAuthenticationSourcesWith:userName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var opts = { 
  'body':  // {UserAuthenticationSourceRequestCreateSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createAuthenticationSources(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createAuthenticationSourcesExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var body = new UserAuthenticationSourceRequestCreateSwagger(); // UserAuthenticationSourceRequestCreateSwagger |  (optional) 

            try
            {
                // Create one or more new authentication sources for a user
                apiInstance.createAuthenticationSources(userName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.createAuthenticationSources: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$body = ; // UserAuthenticationSourceRequestCreateSwagger | 

try {
    $api_instance->createAuthenticationSources($userName, $body);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->createAuthenticationSources: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $body = WWW::SwaggerClient::Object::UserAuthenticationSourceRequestCreateSwagger->new(); # UserAuthenticationSourceRequestCreateSwagger | 

eval { 
    $api_instance->createAuthenticationSources(userName => $userName, body => $body);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->createAuthenticationSources: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-createAuthenticationSources-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
body =  # UserAuthenticationSourceRequestCreateSwagger |  (optional)

try: 
    # Create one or more new authentication sources for a user
    api_instance.createAuthenticationSources(userName, body=body)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->createAuthenticationSources: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createAuthenticationSources_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createAuthenticationSources_userName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserAuthenticationSourceRequestCreateSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createAuthenticationSources_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createAuthenticationSources_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-UserAuthenticationSources-deleteAuthenticationSource">
                      <article id="api-UserAuthenticationSources-deleteAuthenticationSource-0" data-group="User" data-name="deleteAuthenticationSource" data-version="0">
                        <div class="pull-left">
                          <h1>deleteAuthenticationSource</h1>
                          <p>Deletes an existing authentication source</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/users/{userName}/sources/{sourceId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-deleteAuthenticationSource-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/users/{userName}/sources/{sourceId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        try {
            apiInstance.deleteAuthenticationSource(userName, sourceId);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#deleteAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        try {
            apiInstance.deleteAuthenticationSource(userName, sourceId);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#deleteAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *sourceId = sourceId_example; // source id

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Deletes an existing authentication source
[apiInstance deleteAuthenticationSourceWith:userName
    sourceId:sourceId
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var sourceId = sourceId_example; // {String} source id


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteAuthenticationSource(userName, sourceId, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteAuthenticationSourceExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var sourceId = sourceId_example;  // String | source id

            try
            {
                // Deletes an existing authentication source
                apiInstance.deleteAuthenticationSource(userName, sourceId);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.deleteAuthenticationSource: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$sourceId = sourceId_example; // String | source id

try {
    $api_instance->deleteAuthenticationSource($userName, $sourceId);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->deleteAuthenticationSource: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $sourceId = sourceId_example; # String | source id

eval { 
    $api_instance->deleteAuthenticationSource(userName => $userName, sourceId => $sourceId);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->deleteAuthenticationSource: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-deleteAuthenticationSource-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
sourceId = sourceId_example # String | source id

try: 
    # Deletes an existing authentication source
    api_instance.deleteAuthenticationSource(userName, sourceId)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->deleteAuthenticationSource: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteAuthenticationSource_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteAuthenticationSource_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">sourceId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sourceId",
  "in" : "path",
  "description" : "source id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteAuthenticationSource_sourceId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteAuthenticationSource_sourceId"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-UserAuthenticationSources-getAuthenticationSource">
                      <article id="api-UserAuthenticationSources-getAuthenticationSource-0" data-group="User" data-name="getAuthenticationSource" data-version="0">
                        <div class="pull-left">
                          <h1>getAuthenticationSource</h1>
                          <p>Get user authentication source</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/sources/{sourceId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSource-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-getAuthenticationSource-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/sources/{sourceId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            UserAuthenticationSourceResponseSwagger result = apiInstance.getAuthenticationSource(userName, sourceId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#getAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            UserAuthenticationSourceResponseSwagger result = apiInstance.getAuthenticationSource(userName, sourceId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#getAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *sourceId = sourceId_example; // source id
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to AuthenticationSourceInfo/*)

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Get user authentication source
[apiInstance getAuthenticationSourceWith:userName
    sourceId:sourceId
    fields:fields
              completionHandler: ^(UserAuthenticationSourceResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var sourceId = sourceId_example; // {String} source id

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getAuthenticationSource(userName, sourceId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getAuthenticationSourceExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var sourceId = sourceId_example;  // String | source id
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to AuthenticationSourceInfo/*)

            try
            {
                // Get user authentication source
                UserAuthenticationSourceResponseSwagger result = apiInstance.getAuthenticationSource(userName, sourceId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.getAuthenticationSource: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$sourceId = sourceId_example; // String | source id
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getAuthenticationSource($userName, $sourceId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->getAuthenticationSource: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $sourceId = sourceId_example; # String | source id
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getAuthenticationSource(userName => $userName, sourceId => $sourceId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->getAuthenticationSource: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSource-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
sourceId = sourceId_example # String | source id
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to AuthenticationSourceInfo/*)

try: 
    # Get user authentication source
    api_response = api_instance.getAuthenticationSource(userName, sourceId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->getAuthenticationSource: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSource_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSource_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">sourceId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sourceId",
  "in" : "path",
  "description" : "source id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSource_sourceId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSource_sourceId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "AuthenticationSourceInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSource_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSource_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getAuthenticationSource-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getAuthenticationSource-200-schema">
                                  <div id='responses-getAuthenticationSource-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/UserAuthenticationSourceResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getAuthenticationSource-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getAuthenticationSource-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getAuthenticationSource-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-UserAuthenticationSources-getAuthenticationSources">
                      <article id="api-UserAuthenticationSources-getAuthenticationSources-0" data-group="User" data-name="getAuthenticationSources" data-version="0">
                        <div class="pull-left">
                          <h1>getAuthenticationSources</h1>
                          <p>Get all authentication sources</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/sources</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-getAuthenticationSources-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-getAuthenticationSources-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/sources?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[UserAuthenticationSourceResponseSwagger] result = apiInstance.getAuthenticationSources(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#getAuthenticationSources");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[UserAuthenticationSourceResponseSwagger] result = apiInstance.getAuthenticationSources(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#getAuthenticationSources");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to AuthenticationSourceInfo/source_id,AuthenticationSourceInfo/user_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to AuthenticationSourceInfo/source_id.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Get all authentication sources
[apiInstance getAuthenticationSourcesWith:userName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[UserAuthenticationSourceResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getAuthenticationSources(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getAuthenticationSourcesExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to AuthenticationSourceInfo/source_id,AuthenticationSourceInfo/user_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to AuthenticationSourceInfo/source_id.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all authentication sources
                array[UserAuthenticationSourceResponseSwagger] result = apiInstance.getAuthenticationSources(userName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.getAuthenticationSources: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getAuthenticationSources($userName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->getAuthenticationSources: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getAuthenticationSources(userName => $userName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->getAuthenticationSources: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-getAuthenticationSources-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to AuthenticationSourceInfo/source_id,AuthenticationSourceInfo/user_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to AuthenticationSourceInfo/source_id.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all authentication sources
    api_response = api_instance.getAuthenticationSources(userName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->getAuthenticationSources: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "AuthenticationSourceInfo/source_id,AuthenticationSourceInfo/user_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "AuthenticationSourceInfo/source_id.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getAuthenticationSources_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getAuthenticationSources_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getAuthenticationSources-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getAuthenticationSources-200-schema">
                                  <div id='responses-getAuthenticationSources-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/UserAuthenticationSourceResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getAuthenticationSources-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getAuthenticationSources-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getAuthenticationSources-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-UserAuthenticationSources-updateAuthenticationSource">
                      <article id="api-UserAuthenticationSources-updateAuthenticationSource-0" data-group="User" data-name="updateAuthenticationSource" data-version="0">
                        <div class="pull-left">
                          <h1>updateAuthenticationSource</h1>
                          <p>Updates an existing authentication source</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/users/{userName}/sources/{sourceId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-java">Java</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-php">PHP</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-UserAuthenticationSources-updateAuthenticationSource-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/users/{userName}/sources/{sourceId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UserAuthenticationSourcesApi;

import java.io.File;
import java.util.*;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        UserAuthenticationSourceRequestUpdateSwagger body = ; // UserAuthenticationSourceRequestUpdateSwagger | 
        try {
            apiInstance.updateAuthenticationSource(userName, sourceId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#updateAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UserAuthenticationSourcesApi;

public class UserAuthenticationSourcesApiExample {

    public static void main(String[] args) {
        UserAuthenticationSourcesApi apiInstance = new UserAuthenticationSourcesApi();
        String userName = userName_example; // String | user name
        String sourceId = sourceId_example; // String | source id
        UserAuthenticationSourceRequestUpdateSwagger body = ; // UserAuthenticationSourceRequestUpdateSwagger | 
        try {
            apiInstance.updateAuthenticationSource(userName, sourceId, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UserAuthenticationSourcesApi#updateAuthenticationSource");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *sourceId = sourceId_example; // source id
UserAuthenticationSourceRequestUpdateSwagger *body = ; //  (optional)

UserAuthenticationSourcesApi *apiInstance = [[UserAuthenticationSourcesApi alloc] init];

// Updates an existing authentication source
[apiInstance updateAuthenticationSourceWith:userName
    sourceId:sourceId
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UserAuthenticationSourcesApi()

var userName = userName_example; // {String} user name

var sourceId = sourceId_example; // {String} source id

var opts = { 
  'body':  // {UserAuthenticationSourceRequestUpdateSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateAuthenticationSource(userName, sourceId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateAuthenticationSourceExample
    {
        public void main()
        {
            
            var apiInstance = new UserAuthenticationSourcesApi();
            var userName = userName_example;  // String | user name
            var sourceId = sourceId_example;  // String | source id
            var body = new UserAuthenticationSourceRequestUpdateSwagger(); // UserAuthenticationSourceRequestUpdateSwagger |  (optional) 

            try
            {
                // Updates an existing authentication source
                apiInstance.updateAuthenticationSource(userName, sourceId, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UserAuthenticationSourcesApi.updateAuthenticationSource: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UserAuthenticationSourcesApi();
$userName = userName_example; // String | user name
$sourceId = sourceId_example; // String | source id
$body = ; // UserAuthenticationSourceRequestUpdateSwagger | 

try {
    $api_instance->updateAuthenticationSource($userName, $sourceId, $body);
} catch (Exception $e) {
    echo 'Exception when calling UserAuthenticationSourcesApi->updateAuthenticationSource: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UserAuthenticationSourcesApi;

my $api_instance = WWW::SwaggerClient::UserAuthenticationSourcesApi->new();
my $userName = userName_example; # String | user name
my $sourceId = sourceId_example; # String | source id
my $body = WWW::SwaggerClient::Object::UserAuthenticationSourceRequestUpdateSwagger->new(); # UserAuthenticationSourceRequestUpdateSwagger | 

eval { 
    $api_instance->updateAuthenticationSource(userName => $userName, sourceId => $sourceId, body => $body);
};
if ($@) {
    warn "Exception when calling UserAuthenticationSourcesApi->updateAuthenticationSource: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-UserAuthenticationSources-updateAuthenticationSource-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UserAuthenticationSourcesApi()
userName = userName_example # String | user name
sourceId = sourceId_example # String | source id
body =  # UserAuthenticationSourceRequestUpdateSwagger |  (optional)

try: 
    # Updates an existing authentication source
    api_instance.updateAuthenticationSource(userName, sourceId, body=body)
except ApiException as e:
    print("Exception when calling UserAuthenticationSourcesApi->updateAuthenticationSource: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateAuthenticationSource_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateAuthenticationSource_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">sourceId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sourceId",
  "in" : "path",
  "description" : "source id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateAuthenticationSource_sourceId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateAuthenticationSource_sourceId"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserAuthenticationSourceRequestUpdateSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateAuthenticationSource_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateAuthenticationSource_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Users">
                  <h1>Users</h1>
                    <div id="api-Users-activeWidgetLayoutServiceGetServices">
                      <article id="api-Users-activeWidgetLayoutServiceGetServices-0" data-group="User" data-name="activeWidgetLayoutServiceGetServices" data-version="0">
                        <div class="pull-left">
                          <h1>activeWidgetLayoutServiceGetServices</h1>
                          <p>Get user widget layouts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all active widget layouts for user.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/activeWidgetLayouts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceGetServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-activeWidgetLayoutServiceGetServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/activeWidgetLayouts?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user layout details
        String sortBy = sortBy_example; // String | Sort layouts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[ActiveWidgetLayoutResponse] result = apiInstance.activeWidgetLayoutServiceGetServices(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#activeWidgetLayoutServiceGetServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user layout details
        String sortBy = sortBy_example; // String | Sort layouts (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[ActiveWidgetLayoutResponse] result = apiInstance.activeWidgetLayoutServiceGetServices(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#activeWidgetLayoutServiceGetServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter user layout details (optional) (default to WidgetLayoutInfo/*)
String *sortBy = sortBy_example; // Sort layouts (asc | desc) (optional) (default to WidgetLayoutInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get user widget layouts
[apiInstance activeWidgetLayoutServiceGetServicesWith:userName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ActiveWidgetLayoutResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example, // {String} Filter user layout details
  'sortBy': sortBy_example, // {String} Sort layouts (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.activeWidgetLayoutServiceGetServices(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class activeWidgetLayoutServiceGetServicesExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter user layout details (optional)  (default to WidgetLayoutInfo/*)
            var sortBy = sortBy_example;  // String | Sort layouts (asc | desc) (optional)  (default to WidgetLayoutInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get user widget layouts
                array[ActiveWidgetLayoutResponse] result = apiInstance.activeWidgetLayoutServiceGetServices(userName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.activeWidgetLayoutServiceGetServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter user layout details
$sortBy = sortBy_example; // String | Sort layouts (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->activeWidgetLayoutServiceGetServices($userName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->activeWidgetLayoutServiceGetServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter user layout details
my $sortBy = sortBy_example; # String | Sort layouts (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->activeWidgetLayoutServiceGetServices(userName => $userName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->activeWidgetLayoutServiceGetServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceGetServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter user layout details (optional) (default to WidgetLayoutInfo/*)
sortBy = sortBy_example # String | Sort layouts (asc | desc) (optional) (default to WidgetLayoutInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get user widget layouts
    api_response = api_instance.activeWidgetLayoutServiceGetServices(userName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->activeWidgetLayoutServiceGetServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user layout details",
  "required" : false,
  "type" : "string",
  "default" : "WidgetLayoutInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort layouts (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "WidgetLayoutInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceGetServices_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceGetServices_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-activeWidgetLayoutServiceGetServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-activeWidgetLayoutServiceGetServices-200-schema">
                                  <div id='responses-activeWidgetLayoutServiceGetServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ActiveWidgetLayoutResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-activeWidgetLayoutServiceGetServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-activeWidgetLayoutServiceGetServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-activeWidgetLayoutServiceGetServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-activeWidgetLayoutServiceUpdateServices">
                      <article id="api-Users-activeWidgetLayoutServiceUpdateServices-0" data-group="User" data-name="activeWidgetLayoutServiceUpdateServices" data-version="0">
                        <div class="pull-left">
                          <h1>activeWidgetLayoutServiceUpdateServices</h1>
                          <p>Update user widget layouts</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Updates user widget layout.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/users/{userName}/activeWidgetLayouts</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-activeWidgetLayoutServiceUpdateServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/users/{userName}/activeWidgetLayouts"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        ActiveWidgetLayoutRequest body = ; // ActiveWidgetLayoutRequest | input parameters in json form
        try {
            apiInstance.activeWidgetLayoutServiceUpdateServices(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#activeWidgetLayoutServiceUpdateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        ActiveWidgetLayoutRequest body = ; // ActiveWidgetLayoutRequest | input parameters in json form
        try {
            apiInstance.activeWidgetLayoutServiceUpdateServices(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#activeWidgetLayoutServiceUpdateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
ActiveWidgetLayoutRequest *body = ; // input parameters in json form

UsersApi *apiInstance = [[UsersApi alloc] init];

// Update user widget layouts
[apiInstance activeWidgetLayoutServiceUpdateServicesWith:userName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var body = ; // {ActiveWidgetLayoutRequest} input parameters in json form


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.activeWidgetLayoutServiceUpdateServices(userName, body, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class activeWidgetLayoutServiceUpdateServicesExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var body = new ActiveWidgetLayoutRequest(); // ActiveWidgetLayoutRequest | input parameters in json form

            try
            {
                // Update user widget layouts
                apiInstance.activeWidgetLayoutServiceUpdateServices(userName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.activeWidgetLayoutServiceUpdateServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$body = ; // ActiveWidgetLayoutRequest | input parameters in json form

try {
    $api_instance->activeWidgetLayoutServiceUpdateServices($userName, $body);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->activeWidgetLayoutServiceUpdateServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $body = WWW::SwaggerClient::Object::ActiveWidgetLayoutRequest->new(); # ActiveWidgetLayoutRequest | input parameters in json form

eval { 
    $api_instance->activeWidgetLayoutServiceUpdateServices(userName => $userName, body => $body);
};
if ($@) {
    warn "Exception when calling UsersApi->activeWidgetLayoutServiceUpdateServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-activeWidgetLayoutServiceUpdateServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
body =  # ActiveWidgetLayoutRequest | input parameters in json form

try: 
    # Update user widget layouts
    api_instance.activeWidgetLayoutServiceUpdateServices(userName, body)
except ApiException as e:
    print("Exception when calling UsersApi->activeWidgetLayoutServiceUpdateServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_activeWidgetLayoutServiceUpdateServices_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceUpdateServices_userName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body <span style="color:red;">*</span></td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "description" : "input parameters in json form",
  "required" : true,
  "schema" : {
    "$ref" : "#/definitions/ActiveWidgetLayoutRequest"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_activeWidgetLayoutServiceUpdateServices_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_activeWidgetLayoutServiceUpdateServices_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-createUser">
                      <article id="api-Users-createUser-0" data-group="User" data-name="createUser" data-version="0">
                        <div class="pull-left">
                          <h1>createUser</h1>
                          <p>Create new user</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/users/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-createUser-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-createUser-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-createUser-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-createUser-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-createUser-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-createUser-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-createUser-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/users/{userName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-createUser-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        UserRequestCreateUserSwagger body = ; // UserRequestCreateUserSwagger | 
        try {
            apiInstance.createUser(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#createUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-createUser-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        UserRequestCreateUserSwagger body = ; // UserRequestCreateUserSwagger | 
        try {
            apiInstance.createUser(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#createUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-createUser-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-createUser-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
UserRequestCreateUserSwagger *body = ; //  (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Create new user
[apiInstance createUserWith:userName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUser-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'body':  // {UserRequestCreateUserSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createUser(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-createUser-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-createUser-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createUserExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var body = new UserRequestCreateUserSwagger(); // UserRequestCreateUserSwagger |  (optional) 

            try
            {
                // Create new user
                apiInstance.createUser(userName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.createUser: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUser-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$body = ; // UserRequestCreateUserSwagger | 

try {
    $api_instance->createUser($userName, $body);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->createUser: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUser-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $body = WWW::SwaggerClient::Object::UserRequestCreateUserSwagger->new(); # UserRequestCreateUserSwagger | 

eval { 
    $api_instance->createUser(userName => $userName, body => $body);
};
if ($@) {
    warn "Exception when calling UsersApi->createUser: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUser-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
body =  # UserRequestCreateUserSwagger |  (optional)

try: 
    # Create new user
    api_instance.createUser(userName, body=body)
except ApiException as e:
    print("Exception when calling UsersApi->createUser: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createUser_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createUser_userName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserRequestCreateUserSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createUser_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createUser_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-createUsers">
                      <article id="api-Users-createUsers-0" data-group="User" data-name="createUsers" data-version="0">
                        <div class="pull-left">
                          <h1>createUsers</h1>
                          <p>Creates one or more users in a single request</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/users</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-createUsers-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-createUsers-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-createUsers-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-createUsers-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-createUsers-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-createUsers-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-createUsers-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/users"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-createUsers-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        UserRequestCreateUsersSwagger body = ; // UserRequestCreateUsersSwagger | 
        try {
            apiInstance.createUsers(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#createUsers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-createUsers-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        UserRequestCreateUsersSwagger body = ; // UserRequestCreateUsersSwagger | 
        try {
            apiInstance.createUsers(body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#createUsers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-createUsers-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-createUsers-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">UserRequestCreateUsersSwagger *body = ; //  (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Creates one or more users in a single request
[apiInstance createUsersWith:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUsers-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var opts = { 
  'body':  // {UserRequestCreateUsersSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createUsers(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-createUsers-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-createUsers-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createUsersExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var body = new UserRequestCreateUsersSwagger(); // UserRequestCreateUsersSwagger |  (optional) 

            try
            {
                // Creates one or more users in a single request
                apiInstance.createUsers(body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.createUsers: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUsers-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$body = ; // UserRequestCreateUsersSwagger | 

try {
    $api_instance->createUsers($body);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->createUsers: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUsers-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $body = WWW::SwaggerClient::Object::UserRequestCreateUsersSwagger->new(); # UserRequestCreateUsersSwagger | 

eval { 
    $api_instance->createUsers(body => $body);
};
if ($@) {
    warn "Exception when calling UsersApi->createUsers: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-createUsers-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
body =  # UserRequestCreateUsersSwagger |  (optional)

try: 
    # Creates one or more users in a single request
    api_instance.createUsers(body=body)
except ApiException as e:
    print("Exception when calling UsersApi->createUsers: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>



                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserRequestCreateUsersSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createUsers_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createUsers_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-deleteUser">
                      <article id="api-Users-deleteUser-0" data-group="User" data-name="deleteUser" data-version="0">
                        <div class="pull-left">
                          <h1>deleteUser</h1>
                          <p>Delete single user</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/users/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-deleteUser-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-deleteUser-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-deleteUser-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-deleteUser-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-deleteUser-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-deleteUser-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-deleteUser-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/users/{userName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-deleteUser-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        try {
            apiInstance.deleteUser(userName);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#deleteUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-deleteUser-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        try {
            apiInstance.deleteUser(userName);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#deleteUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-deleteUser-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-deleteUser-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name

UsersApi *apiInstance = [[UsersApi alloc] init];

// Delete single user
[apiInstance deleteUserWith:userName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-deleteUser-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteUser(userName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-deleteUser-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-deleteUser-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteUserExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name

            try
            {
                // Delete single user
                apiInstance.deleteUser(userName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.deleteUser: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-deleteUser-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name

try {
    $api_instance->deleteUser($userName);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->deleteUser: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-deleteUser-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name

eval { 
    $api_instance->deleteUser(userName => $userName);
};
if ($@) {
    warn "Exception when calling UsersApi->deleteUser: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-deleteUser-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name

try: 
    # Delete single user
    api_instance.deleteUser(userName)
except ApiException as e:
    print("Exception when calling UsersApi->deleteUser: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteUser_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteUser_userName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Server Error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-getUser">
                      <article id="api-Users-getUser-0" data-group="User" data-name="getUser" data-version="0">
                        <div class="pull-left">
                          <h1>getUser</h1>
                          <p>Get single user</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-getUser-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-getUser-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-getUser-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-getUser-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-getUser-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-getUser-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-getUser-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-getUser-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            UserResponseSwagger result = apiInstance.getUser(userName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#getUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-getUser-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            UserResponseSwagger result = apiInstance.getUser(userName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#getUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-getUser-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-getUser-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Users/*)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get single user
[apiInstance getUserWith:userName
    fields:fields
              completionHandler: ^(UserResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUser-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getUser(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-getUser-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-getUser-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getUserExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Users/*)

            try
            {
                // Get single user
                UserResponseSwagger result = apiInstance.getUser(userName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.getUser: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUser-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getUser($userName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->getUser: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUser-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getUser(userName => $userName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->getUser: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUser-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Users/*)

try: 
    # Get single user
    api_response = api_instance.getUser(userName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->getUser: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUser_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUser_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Users/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUser_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUser_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getUser-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getUser-200-schema">
                                  <div id='responses-getUser-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/UserResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getUser-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getUser-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getUser-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-getUsers">
                      <article id="api-Users-getUsers-0" data-group="User" data-name="getUsers" data-version="0">
                        <div class="pull-left">
                          <h1>getUsers</h1>
                          <p>Get all users</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-getUsers-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-getUsers-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-getUsers-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-getUsers-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-getUsers-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-getUsers-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-getUsers-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-getUsers-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[UserResponseSwagger] result = apiInstance.getUsers(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#getUsers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-getUsers-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[UserResponseSwagger] result = apiInstance.getUsers(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#getUsers");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-getUsers-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-getUsers-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Users/user_name)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Users/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get all users
[apiInstance getUsersWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[UserResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUsers-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getUsers(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-getUsers-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-getUsers-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getUsersExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Users/user_name)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Users/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all users
                array[UserResponseSwagger] result = apiInstance.getUsers(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.getUsers: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUsers-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getUsers($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->getUsers: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUsers-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getUsers(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->getUsers: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-getUsers-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Users/user_name)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Users/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all users
    api_response = api_instance.getUsers(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->getUsers: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Users/user_name"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Users/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getUsers_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getUsers_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getUsers-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getUsers-200-schema">
                                  <div id='responses-getUsers-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/UserResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getUsers-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getUsers-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getUsers-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-updateUser">
                      <article id="api-Users-updateUser-0" data-group="User" data-name="updateUser" data-version="0">
                        <div class="pull-left">
                          <h1>updateUser</h1>
                          <p>Update user details</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/users/{userName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-updateUser-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-updateUser-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-updateUser-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-updateUser-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-updateUser-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-updateUser-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-updateUser-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/users/{userName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-updateUser-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        UserRequestUpdateUserSwagger body = ; // UserRequestUpdateUserSwagger | 
        try {
            apiInstance.updateUser(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#updateUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-updateUser-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        UserRequestUpdateUserSwagger body = ; // UserRequestUpdateUserSwagger | 
        try {
            apiInstance.updateUser(userName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#updateUser");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-updateUser-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-updateUser-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
UserRequestUpdateUserSwagger *body = ; //  (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Update user details
[apiInstance updateUserWith:userName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-updateUser-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'body':  // {UserRequestUpdateUserSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateUser(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-updateUser-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-updateUser-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateUserExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var body = new UserRequestUpdateUserSwagger(); // UserRequestUpdateUserSwagger |  (optional) 

            try
            {
                // Update user details
                apiInstance.updateUser(userName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.updateUser: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-updateUser-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$body = ; // UserRequestUpdateUserSwagger | 

try {
    $api_instance->updateUser($userName, $body);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->updateUser: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-updateUser-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $body = WWW::SwaggerClient::Object::UserRequestUpdateUserSwagger->new(); # UserRequestUpdateUserSwagger | 

eval { 
    $api_instance->updateUser(userName => $userName, body => $body);
};
if ($@) {
    warn "Exception when calling UsersApi->updateUser: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-updateUser-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
body =  # UserRequestUpdateUserSwagger |  (optional)

try: 
    # Update user details
    api_instance.updateUser(userName, body=body)
except ApiException as e:
    print("Exception when calling UsersApi->updateUser: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateUser_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateUser_userName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/UserRequestUpdateUserSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateUser_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateUser_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - The requested resource doesn&#39;t exist. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 409 - The requested resource already exists. </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-userAuthorizationServiceGetAuthorization">
                      <article id="api-Users-userAuthorizationServiceGetAuthorization-0" data-group="User" data-name="userAuthorizationServiceGetAuthorization" data-version="0">
                        <div class="pull-left">
                          <h1>userAuthorizationServiceGetAuthorization</h1>
                          <p>Get user authorization</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns user authorization details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/authorizations/{authorization_id}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorization-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-userAuthorizationServiceGetAuthorization-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/authorizations/{authorization_id}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String authorizationId = authorizationId_example; // String | Authorization Id
        String fields = fields_example; // String | Filter user authorization details
        try {
            UserAuthorizationResponse result = apiInstance.userAuthorizationServiceGetAuthorization(userName, authorizationId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userAuthorizationServiceGetAuthorization");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String authorizationId = authorizationId_example; // String | Authorization Id
        String fields = fields_example; // String | Filter user authorization details
        try {
            UserAuthorizationResponse result = apiInstance.userAuthorizationServiceGetAuthorization(userName, authorizationId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userAuthorizationServiceGetAuthorization");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *authorizationId = authorizationId_example; // Authorization Id
String *fields = fields_example; // Filter user authorization details (optional) (default to AuthorizationInfo/*)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get user authorization
[apiInstance userAuthorizationServiceGetAuthorizationWith:userName
    authorizationId:authorizationId
    fields:fields
              completionHandler: ^(UserAuthorizationResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var authorizationId = authorizationId_example; // {String} Authorization Id

var opts = { 
  'fields': fields_example // {String} Filter user authorization details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.userAuthorizationServiceGetAuthorization(userName, authorizationId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class userAuthorizationServiceGetAuthorizationExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var authorizationId = authorizationId_example;  // String | Authorization Id
            var fields = fields_example;  // String | Filter user authorization details (optional)  (default to AuthorizationInfo/*)

            try
            {
                // Get user authorization
                UserAuthorizationResponse result = apiInstance.userAuthorizationServiceGetAuthorization(userName, authorizationId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.userAuthorizationServiceGetAuthorization: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$authorizationId = authorizationId_example; // String | Authorization Id
$fields = fields_example; // String | Filter user authorization details

try {
    $result = $api_instance->userAuthorizationServiceGetAuthorization($userName, $authorizationId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->userAuthorizationServiceGetAuthorization: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $authorizationId = authorizationId_example; # String | Authorization Id
my $fields = fields_example; # String | Filter user authorization details

eval { 
    my $result = $api_instance->userAuthorizationServiceGetAuthorization(userName => $userName, authorizationId => $authorizationId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->userAuthorizationServiceGetAuthorization: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorization-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
authorizationId = authorizationId_example # String | Authorization Id
fields = fields_example # String | Filter user authorization details (optional) (default to AuthorizationInfo/*)

try: 
    # Get user authorization
    api_response = api_instance.userAuthorizationServiceGetAuthorization(userName, authorizationId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->userAuthorizationServiceGetAuthorization: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorization_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorization_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">authorization_id*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "authorization_id",
  "in" : "path",
  "description" : "Authorization Id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorization_authorizationId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorization_authorizationId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user authorization details",
  "required" : false,
  "type" : "string",
  "default" : "AuthorizationInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorization_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorization_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-userAuthorizationServiceGetAuthorization-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-userAuthorizationServiceGetAuthorization-200-schema">
                                  <div id='responses-userAuthorizationServiceGetAuthorization-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/UserAuthorizationResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-userAuthorizationServiceGetAuthorization-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-userAuthorizationServiceGetAuthorization-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-userAuthorizationServiceGetAuthorization-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-userAuthorizationServiceGetAuthorizations">
                      <article id="api-Users-userAuthorizationServiceGetAuthorizations-0" data-group="User" data-name="userAuthorizationServiceGetAuthorizations" data-version="0">
                        <div class="pull-left">
                          <h1>userAuthorizationServiceGetAuthorizations</h1>
                          <p>Get all authorizations</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all authorization for user.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/authorizations</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-userAuthorizationServiceGetAuthorizations-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/authorizations?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user authorization details
        String sortBy = sortBy_example; // String | Sort user authorizations (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[UserAuthorizationResponse] result = apiInstance.userAuthorizationServiceGetAuthorizations(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userAuthorizationServiceGetAuthorizations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user authorization details
        String sortBy = sortBy_example; // String | Sort user authorizations (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[UserAuthorizationResponse] result = apiInstance.userAuthorizationServiceGetAuthorizations(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userAuthorizationServiceGetAuthorizations");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter user authorization details (optional) (default to AuthorizationInfo/*)
String *sortBy = sortBy_example; // Sort user authorizations (asc | desc) (optional) (default to AuthorizationInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get all authorizations
[apiInstance userAuthorizationServiceGetAuthorizationsWith:userName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[UserAuthorizationResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example, // {String} Filter user authorization details
  'sortBy': sortBy_example, // {String} Sort user authorizations (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.userAuthorizationServiceGetAuthorizations(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class userAuthorizationServiceGetAuthorizationsExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter user authorization details (optional)  (default to AuthorizationInfo/*)
            var sortBy = sortBy_example;  // String | Sort user authorizations (asc | desc) (optional)  (default to AuthorizationInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all authorizations
                array[UserAuthorizationResponse] result = apiInstance.userAuthorizationServiceGetAuthorizations(userName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.userAuthorizationServiceGetAuthorizations: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter user authorization details
$sortBy = sortBy_example; // String | Sort user authorizations (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->userAuthorizationServiceGetAuthorizations($userName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->userAuthorizationServiceGetAuthorizations: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter user authorization details
my $sortBy = sortBy_example; # String | Sort user authorizations (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->userAuthorizationServiceGetAuthorizations(userName => $userName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->userAuthorizationServiceGetAuthorizations: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userAuthorizationServiceGetAuthorizations-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter user authorization details (optional) (default to AuthorizationInfo/*)
sortBy = sortBy_example # String | Sort user authorizations (asc | desc) (optional) (default to AuthorizationInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all authorizations
    api_response = api_instance.userAuthorizationServiceGetAuthorizations(userName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->userAuthorizationServiceGetAuthorizations: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user authorization details",
  "required" : false,
  "type" : "string",
  "default" : "AuthorizationInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort user authorizations (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "AuthorizationInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userAuthorizationServiceGetAuthorizations_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userAuthorizationServiceGetAuthorizations_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-userAuthorizationServiceGetAuthorizations-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-userAuthorizationServiceGetAuthorizations-200-schema">
                                  <div id='responses-userAuthorizationServiceGetAuthorizations-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/UserAuthorizationResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-userAuthorizationServiceGetAuthorizations-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-userAuthorizationServiceGetAuthorizations-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-userAuthorizationServiceGetAuthorizations-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-userPrivilegeServiceGetPrivilege">
                      <article id="api-Users-userPrivilegeServiceGetPrivilege-0" data-group="User" data-name="userPrivilegeServiceGetPrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>userPrivilegeServiceGetPrivilege</h1>
                          <p>Get user privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns user privilege details.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/privileges/{privilegeId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-userPrivilegeServiceGetPrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/privileges/{privilegeId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter user privilege details
        try {
            UserPrivilegeResponse result = apiInstance.userPrivilegeServiceGetPrivilege(userName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userPrivilegeServiceGetPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter user privilege details
        try {
            UserPrivilegeResponse result = apiInstance.userPrivilegeServiceGetPrivilege(userName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userPrivilegeServiceGetPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *privilegeId = privilegeId_example; // privilege id
String *fields = fields_example; // Filter user privilege details (optional) (default to PrivilegeInfo/*)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get user privilege
[apiInstance userPrivilegeServiceGetPrivilegeWith:userName
    privilegeId:privilegeId
    fields:fields
              completionHandler: ^(UserPrivilegeResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var privilegeId = privilegeId_example; // {String} privilege id

var opts = { 
  'fields': fields_example // {String} Filter user privilege details
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.userPrivilegeServiceGetPrivilege(userName, privilegeId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class userPrivilegeServiceGetPrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var privilegeId = privilegeId_example;  // String | privilege id
            var fields = fields_example;  // String | Filter user privilege details (optional)  (default to PrivilegeInfo/*)

            try
            {
                // Get user privilege
                UserPrivilegeResponse result = apiInstance.userPrivilegeServiceGetPrivilege(userName, privilegeId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.userPrivilegeServiceGetPrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$privilegeId = privilegeId_example; // String | privilege id
$fields = fields_example; // String | Filter user privilege details

try {
    $result = $api_instance->userPrivilegeServiceGetPrivilege($userName, $privilegeId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->userPrivilegeServiceGetPrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $privilegeId = privilegeId_example; # String | privilege id
my $fields = fields_example; # String | Filter user privilege details

eval { 
    my $result = $api_instance->userPrivilegeServiceGetPrivilege(userName => $userName, privilegeId => $privilegeId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->userPrivilegeServiceGetPrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
privilegeId = privilegeId_example # String | privilege id
fields = fields_example # String | Filter user privilege details (optional) (default to PrivilegeInfo/*)

try: 
    # Get user privilege
    api_response = api_instance.userPrivilegeServiceGetPrivilege(userName, privilegeId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->userPrivilegeServiceGetPrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivilege_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivilege_userName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">privilegeId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "privilegeId",
  "in" : "path",
  "description" : "privilege id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivilege_privilegeId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivilege_privilegeId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user privilege details",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivilege_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivilege_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-userPrivilegeServiceGetPrivilege-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-userPrivilegeServiceGetPrivilege-200-schema">
                                  <div id='responses-userPrivilegeServiceGetPrivilege-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/UserPrivilegeResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-userPrivilegeServiceGetPrivilege-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-userPrivilegeServiceGetPrivilege-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-userPrivilegeServiceGetPrivilege-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Users-userPrivilegeServiceGetPrivileges">
                      <article id="api-Users-userPrivilegeServiceGetPrivileges-0" data-group="User" data-name="userPrivilegeServiceGetPrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>userPrivilegeServiceGetPrivileges</h1>
                          <p>Get all privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns all privileges for user.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/users/{userName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Users-userPrivilegeServiceGetPrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Users-userPrivilegeServiceGetPrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/users/{userName}/privileges?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.UsersApi;

import java.io.File;
import java.util.*;

public class UsersApiExample {

    public static void main(String[] args) {
        
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user privileges
        String sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[UserPrivilegeResponse] result = apiInstance.userPrivilegeServiceGetPrivileges(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userPrivilegeServiceGetPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.UsersApi;

public class UsersApiExample {

    public static void main(String[] args) {
        UsersApi apiInstance = new UsersApi();
        String userName = userName_example; // String | user name
        String fields = fields_example; // String | Filter user privileges
        String sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        String from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
        String to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"
        try {
            array[UserPrivilegeResponse] result = apiInstance.userPrivilegeServiceGetPrivileges(userName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling UsersApi#userPrivilegeServiceGetPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *userName = userName_example; // user name
String *fields = fields_example; // Filter user privileges (optional) (default to PrivilegeInfo/*)
String *sortBy = sortBy_example; // Sort user privileges (asc | desc) (optional) (default to PrivilegeInfo/user_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
String *from = from_example; // The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
String *to = to_example; // The ending page resource (inclusive). Valid values are :offset | "end" (optional)

UsersApi *apiInstance = [[UsersApi alloc] init];

// Get all privileges
[apiInstance userPrivilegeServiceGetPrivilegesWith:userName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[UserPrivilegeResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.UsersApi()

var userName = userName_example; // {String} user name

var opts = { 
  'fields': fields_example, // {String} Filter user privileges
  'sortBy': sortBy_example, // {String} Sort user privileges (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': from_example, // {String} The starting page resource (inclusive). Valid values are :offset | "start"
  'to': to_example // {String} The ending page resource (inclusive). Valid values are :offset | "end"
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.userPrivilegeServiceGetPrivileges(userName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class userPrivilegeServiceGetPrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new UsersApi();
            var userName = userName_example;  // String | user name
            var fields = fields_example;  // String | Filter user privileges (optional)  (default to PrivilegeInfo/*)
            var sortBy = sortBy_example;  // String | Sort user privileges (asc | desc) (optional)  (default to PrivilegeInfo/user_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = from_example;  // String | The starting page resource (inclusive). Valid values are :offset | "start" (optional)  (default to 0)
            var to = to_example;  // String | The ending page resource (inclusive). Valid values are :offset | "end" (optional) 

            try
            {
                // Get all privileges
                array[UserPrivilegeResponse] result = apiInstance.userPrivilegeServiceGetPrivileges(userName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling UsersApi.userPrivilegeServiceGetPrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\UsersApi();
$userName = userName_example; // String | user name
$fields = fields_example; // String | Filter user privileges
$sortBy = sortBy_example; // String | Sort user privileges (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = from_example; // String | The starting page resource (inclusive). Valid values are :offset | "start"
$to = to_example; // String | The ending page resource (inclusive). Valid values are :offset | "end"

try {
    $result = $api_instance->userPrivilegeServiceGetPrivileges($userName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling UsersApi->userPrivilegeServiceGetPrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::UsersApi;

my $api_instance = WWW::SwaggerClient::UsersApi->new();
my $userName = userName_example; # String | user name
my $fields = fields_example; # String | Filter user privileges
my $sortBy = sortBy_example; # String | Sort user privileges (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = from_example; # String | The starting page resource (inclusive). Valid values are :offset | "start"
my $to = to_example; # String | The ending page resource (inclusive). Valid values are :offset | "end"

eval { 
    my $result = $api_instance->userPrivilegeServiceGetPrivileges(userName => $userName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling UsersApi->userPrivilegeServiceGetPrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Users-userPrivilegeServiceGetPrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.UsersApi()
userName = userName_example # String | user name
fields = fields_example # String | Filter user privileges (optional) (default to PrivilegeInfo/*)
sortBy = sortBy_example # String | Sort user privileges (asc | desc) (optional) (default to PrivilegeInfo/user_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = from_example # String | The starting page resource (inclusive). Valid values are :offset | "start" (optional) (default to 0)
to = to_example # String | The ending page resource (inclusive). Valid values are :offset | "end" (optional)

try: 
    # Get all privileges
    api_response = api_instance.userPrivilegeServiceGetPrivileges(userName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling UsersApi->userPrivilegeServiceGetPrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">userName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "userName",
  "in" : "path",
  "description" : "user name",
  "required" : true,
  "type" : "string",
  "default" : "admin"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_userName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_userName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter user privileges",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort user privileges (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/user_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive). Valid values are :offset | \"start\"",
  "required" : false,
  "type" : "string",
  "default" : "0"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive). Valid values are :offset | \"end\"",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_userPrivilegeServiceGetPrivileges_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_userPrivilegeServiceGetPrivileges_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-userPrivilegeServiceGetPrivileges-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-userPrivilegeServiceGetPrivileges-200-schema">
                                  <div id='responses-userPrivilegeServiceGetPrivileges-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/UserPrivilegeResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-userPrivilegeServiceGetPrivileges-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-userPrivilegeServiceGetPrivileges-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-userPrivilegeServiceGetPrivileges-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
                <section id="api-Views">
                  <h1>Views</h1>
                    <div id="api-Views-createPrivilege">
                      <article id="api-Views-createPrivilege-0" data-group="User" data-name="createPrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>createPrivilege</h1>
                          <p>Create view instance privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-createPrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-createPrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-createPrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-createPrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-createPrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-createPrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-createPrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-createPrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        ViewPrivilegeService body = ; // ViewPrivilegeService | 
        try {
            apiInstance.createPrivilege(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-createPrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        ViewPrivilegeService body = ; // ViewPrivilegeService | 
        try {
            apiInstance.createPrivilege(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-createPrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-createPrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
ViewPrivilegeService *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Create view instance privilege
[apiInstance createPrivilegeWith:viewName
    version:version
    instanceName:instanceName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createPrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'body':  // {ViewPrivilegeService} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createPrivilege(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-createPrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-createPrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createPrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var body = new ViewPrivilegeService(); // ViewPrivilegeService |  (optional) 

            try
            {
                // Create view instance privilege
                apiInstance.createPrivilege(viewName, version, instanceName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.createPrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createPrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$body = ; // ViewPrivilegeService | 

try {
    $api_instance->createPrivilege($viewName, $version, $instanceName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->createPrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createPrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $body = WWW::SwaggerClient::Object::ViewPrivilegeService->new(); # ViewPrivilegeService | 

eval { 
    $api_instance->createPrivilege(viewName => $viewName, version => $version, instanceName => $instanceName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->createPrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createPrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
body =  # ViewPrivilegeService |  (optional)

try: 
    # Create view instance privilege
    api_instance.createPrivilege(viewName, version, instanceName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->createPrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createPrivilege_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createPrivilege_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createPrivilege_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createPrivilege_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createPrivilege_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createPrivilege_instanceName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewPrivilegeService"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createPrivilege_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createPrivilege_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-createService">
                      <article id="api-Views-createService-0" data-group="User" data-name="createService" data-version="0">
                        <div class="pull-left">
                          <h1>createService</h1>
                          <p>Create view instance</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-createService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-createService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-createService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-createService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-createService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-createService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-createService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-createService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-createService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-createService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-createService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-createService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-createService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.createService(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-createService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.createService(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-createService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-createService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *instanceName = instanceName_example; // instance name
ViewInstanceResponse *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Create view instance
[apiInstance createServiceWith:viewName
    version:version
    instanceName:instanceName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'body':  // {ViewInstanceResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createService(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-createService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-createService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var instanceName = instanceName_example;  // String | instance name
            var body = new ViewInstanceResponse(); // ViewInstanceResponse |  (optional) 

            try
            {
                // Create view instance
                apiInstance.createService(viewName, version, instanceName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.createService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$instanceName = instanceName_example; // String | instance name
$body = ; // ViewInstanceResponse | 

try {
    $api_instance->createService($viewName, $version, $instanceName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->createService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $instanceName = instanceName_example; # String | instance name
my $body = WWW::SwaggerClient::Object::ViewInstanceResponse->new(); # ViewInstanceResponse | 

eval { 
    $api_instance->createService(viewName => $viewName, version => $version, instanceName => $instanceName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->createService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
instanceName = instanceName_example # String | instance name
body =  # ViewInstanceResponse |  (optional)

try: 
    # Create view instance
    api_instance.createService(viewName, version, instanceName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->createService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createService_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createService_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createService_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createService_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createService_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createService_instanceName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createService_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createService_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-createServices">
                      <article id="api-Views-createServices-0" data-group="User" data-name="createServices" data-version="0">
                        <div class="pull-left">
                          <h1>createServices</h1>
                          <p>Create view instances</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/views/{viewName}/versions/{version}/instances</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-createServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-createServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-createServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-createServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-createServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-createServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-createServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-createServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.createServices(viewName, version, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-createServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.createServices(viewName, version, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-createServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-createServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // 
String *version = version_example; // 
ViewInstanceResponse *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Create view instances
[apiInstance createServicesWith:viewName
    version:version
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} 

var version = version_example; // {String} 

var opts = { 
  'body':  // {ViewInstanceResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createServices(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-createServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-createServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | 
            var version = version_example;  // String | 
            var body = new ViewInstanceResponse(); // ViewInstanceResponse |  (optional) 

            try
            {
                // Create view instances
                apiInstance.createServices(viewName, version, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.createServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | 
$version = version_example; // String | 
$body = ; // ViewInstanceResponse | 

try {
    $api_instance->createServices($viewName, $version, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->createServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | 
my $version = version_example; # String | 
my $body = WWW::SwaggerClient::Object::ViewInstanceResponse->new(); # ViewInstanceResponse | 

eval { 
    $api_instance->createServices(viewName => $viewName, version => $version, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->createServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | 
version = version_example # String | 
body =  # ViewInstanceResponse |  (optional)

try: 
    # Create view instances
    api_instance.createServices(viewName, version, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->createServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createServices_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createServices_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createServices_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createServices_version"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createServices_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createServices_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-createUrl">
                      <article id="api-Views-createUrl-0" data-group="User" data-name="createUrl" data-version="0">
                        <div class="pull-left">
                          <h1>createUrl</h1>
                          <p>Create view URL</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="post"><code><span class="pln">/view/urls/{urlName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-createUrl-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-createUrl-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-createUrl-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-createUrl-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-createUrl-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-createUrl-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-createUrl-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">post</span> "https://localhost/api/v1/view/urls/{urlName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-createUrl-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        ViewUrlResponseSwagger body = ; // ViewUrlResponseSwagger | 
        try {
            apiInstance.createUrl(urlName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-createUrl-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        ViewUrlResponseSwagger body = ; // ViewUrlResponseSwagger | 
        try {
            apiInstance.createUrl(urlName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#createUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-createUrl-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-createUrl-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *urlName = urlName_example; // 
ViewUrlResponseSwagger *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Create view URL
[apiInstance createUrlWith:urlName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createUrl-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var urlName = urlName_example; // {String} 

var opts = { 
  'body':  // {ViewUrlResponseSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.createUrl(urlName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-createUrl-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-createUrl-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class createUrlExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var urlName = urlName_example;  // String | 
            var body = new ViewUrlResponseSwagger(); // ViewUrlResponseSwagger |  (optional) 

            try
            {
                // Create view URL
                apiInstance.createUrl(urlName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.createUrl: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createUrl-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$urlName = urlName_example; // String | 
$body = ; // ViewUrlResponseSwagger | 

try {
    $api_instance->createUrl($urlName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->createUrl: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createUrl-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $urlName = urlName_example; # String | 
my $body = WWW::SwaggerClient::Object::ViewUrlResponseSwagger->new(); # ViewUrlResponseSwagger | 

eval { 
    $api_instance->createUrl(urlName => $urlName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->createUrl: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-createUrl-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
urlName = urlName_example # String | 
body =  # ViewUrlResponseSwagger |  (optional)

try: 
    # Create view URL
    api_instance.createUrl(urlName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->createUrl: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">urlName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "urlName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_createUrl_urlName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_createUrl_urlName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewUrlResponseSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_createUrl_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_createUrl_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 201 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-deletePrivilege">
                      <article id="api-Views-deletePrivilege-0" data-group="User" data-name="deletePrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>deletePrivilege</h1>
                          <p>Delete privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-deletePrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-deletePrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-deletePrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-deletePrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-deletePrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-deletePrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-deletePrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeId}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-deletePrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String privilegeId = privilegeId_example; // String | privilege id
        try {
            apiInstance.deletePrivilege(viewName, version, instanceName, privilegeId);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deletePrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-deletePrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String privilegeId = privilegeId_example; // String | privilege id
        try {
            apiInstance.deletePrivilege(viewName, version, instanceName, privilegeId);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deletePrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-deletePrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
String *privilegeId = privilegeId_example; // privilege id

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Delete privileges
[apiInstance deletePrivilegeWith:viewName
    version:version
    instanceName:instanceName
    privilegeId:privilegeId
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var privilegeId = privilegeId_example; // {String} privilege id


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deletePrivilege(viewName, version, instanceName, privilegeId, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-deletePrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deletePrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var privilegeId = privilegeId_example;  // String | privilege id

            try
            {
                // Delete privileges
                apiInstance.deletePrivilege(viewName, version, instanceName, privilegeId);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.deletePrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$privilegeId = privilegeId_example; // String | privilege id

try {
    $api_instance->deletePrivilege($viewName, $version, $instanceName, $privilegeId);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->deletePrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $privilegeId = privilegeId_example; # String | privilege id

eval { 
    $api_instance->deletePrivilege(viewName => $viewName, version => $version, instanceName => $instanceName, privilegeId => $privilegeId);
};
if ($@) {
    warn "Exception when calling ViewsApi->deletePrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
privilegeId = privilegeId_example # String | privilege id

try: 
    # Delete privileges
    api_instance.deletePrivilege(viewName, version, instanceName, privilegeId)
except ApiException as e:
    print("Exception when calling ViewsApi->deletePrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivilege_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivilege_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivilege_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivilege_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivilege_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivilege_instanceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">privilegeId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "privilegeId",
  "in" : "path",
  "description" : "privilege id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivilege_privilegeId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivilege_privilegeId"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-deletePrivileges">
                      <article id="api-Views-deletePrivileges-0" data-group="User" data-name="deletePrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>deletePrivileges</h1>
                          <p>Delete view instance privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-deletePrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-deletePrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-deletePrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-deletePrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-deletePrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-deletePrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-deletePrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-deletePrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String viewVersion = viewVersion_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        try {
            apiInstance.deletePrivileges(viewName, viewVersion, instanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deletePrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-deletePrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String viewVersion = viewVersion_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        try {
            apiInstance.deletePrivileges(viewName, viewVersion, instanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deletePrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-deletePrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *viewVersion = viewVersion_example; // view version
String *instanceName = instanceName_example; // instance name

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Delete view instance privileges
[apiInstance deletePrivilegesWith:viewName
    viewVersion:viewVersion
    instanceName:instanceName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var viewVersion = viewVersion_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deletePrivileges(viewName, viewVersion, instanceName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-deletePrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deletePrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var viewVersion = viewVersion_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name

            try
            {
                // Delete view instance privileges
                apiInstance.deletePrivileges(viewName, viewVersion, instanceName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.deletePrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$viewVersion = viewVersion_example; // String | view version
$instanceName = instanceName_example; // String | instance name

try {
    $api_instance->deletePrivileges($viewName, $viewVersion, $instanceName);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->deletePrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $viewVersion = viewVersion_example; # String | view version
my $instanceName = instanceName_example; # String | instance name

eval { 
    $api_instance->deletePrivileges(viewName => $viewName, viewVersion => $viewVersion, instanceName => $instanceName);
};
if ($@) {
    warn "Exception when calling ViewsApi->deletePrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deletePrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
viewVersion = viewVersion_example # String | view version
instanceName = instanceName_example # String | instance name

try: 
    # Delete view instance privileges
    api_instance.deletePrivileges(viewName, viewVersion, instanceName)
except ApiException as e:
    print("Exception when calling ViewsApi->deletePrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivileges_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivileges_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">viewVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewVersion",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivileges_viewVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivileges_viewVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deletePrivileges_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deletePrivileges_instanceName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-deleteService">
                      <article id="api-Views-deleteService-0" data-group="User" data-name="deleteService" data-version="0">
                        <div class="pull-left">
                          <h1>deleteService</h1>
                          <p>Delete view instance</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-deleteService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-deleteService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-deleteService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-deleteService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-deleteService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-deleteService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-deleteService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-deleteService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        try {
            apiInstance.deleteService(viewName, version, instanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deleteService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-deleteService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        try {
            apiInstance.deleteService(viewName, version, instanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deleteService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-deleteService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-deleteService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *instanceName = instanceName_example; // instance name

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Delete view instance
[apiInstance deleteServiceWith:viewName
    version:version
    instanceName:instanceName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var instanceName = instanceName_example; // {String} instance name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteService(viewName, version, instanceName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-deleteService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-deleteService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var instanceName = instanceName_example;  // String | instance name

            try
            {
                // Delete view instance
                apiInstance.deleteService(viewName, version, instanceName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.deleteService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$instanceName = instanceName_example; // String | instance name

try {
    $api_instance->deleteService($viewName, $version, $instanceName);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->deleteService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $instanceName = instanceName_example; # String | instance name

eval { 
    $api_instance->deleteService(viewName => $viewName, version => $version, instanceName => $instanceName);
};
if ($@) {
    warn "Exception when calling ViewsApi->deleteService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
instanceName = instanceName_example # String | instance name

try: 
    # Delete view instance
    api_instance.deleteService(viewName, version, instanceName)
except ApiException as e:
    print("Exception when calling ViewsApi->deleteService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteService_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteService_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteService_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteService_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteService_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteService_instanceName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-deleteUrl">
                      <article id="api-Views-deleteUrl-0" data-group="User" data-name="deleteUrl" data-version="0">
                        <div class="pull-left">
                          <h1>deleteUrl</h1>
                          <p>Delete view URL</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="delete"><code><span class="pln">/view/urls/{urlName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-deleteUrl-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-deleteUrl-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-deleteUrl-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-deleteUrl-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-deleteUrl-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-deleteUrl-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-deleteUrl-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">delete</span> "https://localhost/api/v1/view/urls/{urlName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-deleteUrl-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        try {
            apiInstance.deleteUrl(urlName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deleteUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-deleteUrl-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        try {
            apiInstance.deleteUrl(urlName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#deleteUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-deleteUrl-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-deleteUrl-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *urlName = urlName_example; // 

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Delete view URL
[apiInstance deleteUrlWith:urlName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteUrl-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var urlName = urlName_example; // {String} 


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.deleteUrl(urlName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-deleteUrl-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-deleteUrl-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class deleteUrlExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var urlName = urlName_example;  // String | 

            try
            {
                // Delete view URL
                apiInstance.deleteUrl(urlName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.deleteUrl: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteUrl-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$urlName = urlName_example; // String | 

try {
    $api_instance->deleteUrl($urlName);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->deleteUrl: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteUrl-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $urlName = urlName_example; # String | 

eval { 
    $api_instance->deleteUrl(urlName => $urlName);
};
if ($@) {
    warn "Exception when calling ViewsApi->deleteUrl: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-deleteUrl-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
urlName = urlName_example # String | 

try: 
    # Delete view URL
    api_instance.deleteUrl(urlName)
except ApiException as e:
    print("Exception when calling ViewsApi->deleteUrl: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">urlName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "urlName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_deleteUrl_urlName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_deleteUrl_urlName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getPermission">
                      <article id="api-Views-getPermission-0" data-group="User" data-name="getPermission" data-version="0">
                        <div class="pull-left">
                          <h1>getPermission</h1>
                          <p>Get single view permission</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/permissions/{permissionId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getPermission-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getPermission-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getPermission-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getPermission-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getPermission-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getPermission-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getPermission-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/permissions/{permissionId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getPermission-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String permissionId = permissionId_example; // String | permission id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewPermissionResponse result = apiInstance.getPermission(viewName, version, permissionId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPermission");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getPermission-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String permissionId = permissionId_example; // String | permission id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewPermissionResponse result = apiInstance.getPermission(viewName, version, permissionId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPermission");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getPermission-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getPermission-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *permissionId = permissionId_example; // permission id
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to PermissionInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view permission
[apiInstance getPermissionWith:viewName
    version:version
    permissionId:permissionId
    fields:fields
              completionHandler: ^(ViewPermissionResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermission-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var permissionId = permissionId_example; // {String} permission id

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getPermission(viewName, version, permissionId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getPermission-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getPermission-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getPermissionExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var permissionId = permissionId_example;  // String | permission id
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to PermissionInfo/*)

            try
            {
                // Get single view permission
                ViewPermissionResponse result = apiInstance.getPermission(viewName, version, permissionId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getPermission: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermission-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$permissionId = permissionId_example; // String | permission id
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getPermission($viewName, $version, $permissionId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getPermission: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermission-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $permissionId = permissionId_example; # String | permission id
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getPermission(viewName => $viewName, version => $version, permissionId => $permissionId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getPermission: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermission-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
permissionId = permissionId_example # String | permission id
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to PermissionInfo/*)

try: 
    # Get single view permission
    api_response = api_instance.getPermission(viewName, version, permissionId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getPermission: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermission_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermission_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermission_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermission_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">permissionId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "permissionId",
  "in" : "path",
  "description" : "permission id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermission_permissionId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermission_permissionId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "PermissionInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermission_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermission_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getPermission-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getPermission-200-schema">
                                  <div id='responses-getPermission-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewPermissionResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getPermission-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getPermission-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getPermission-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getPermissions">
                      <article id="api-Views-getPermissions-0" data-group="User" data-name="getPermissions" data-version="0">
                        <div class="pull-left">
                          <h1>getPermissions</h1>
                          <p>Get all permissions for a view</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/permissions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getPermissions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getPermissions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getPermissions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getPermissions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getPermissions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getPermissions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getPermissions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/permissions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getPermissions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewPermissionResponse] result = apiInstance.getPermissions(viewName, version, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPermissions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getPermissions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewPermissionResponse] result = apiInstance.getPermissions(viewName, version, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPermissions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getPermissions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getPermissions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to PermissionInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all permissions for a view
[apiInstance getPermissionsWith:viewName
    version:version
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewPermissionResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermissions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getPermissions(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getPermissions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getPermissions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getPermissionsExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to PermissionInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all permissions for a view
                array[ViewPermissionResponse] result = apiInstance.getPermissions(viewName, version, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getPermissions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermissions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getPermissions($viewName, $version, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getPermissions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermissions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getPermissions(viewName => $viewName, version => $version, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getPermissions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPermissions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to PermissionInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all permissions for a view
    api_response = api_instance.getPermissions(viewName, version, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getPermissions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_version"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "PermissionInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPermissions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPermissions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getPermissions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getPermissions-200-schema">
                                  <div id='responses-getPermissions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewPermissionResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getPermissions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getPermissions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getPermissions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getPrivilege">
                      <article id="api-Views-getPrivilege-0" data-group="User" data-name="getPrivilege" data-version="0">
                        <div class="pull-left">
                          <h1>getPrivilege</h1>
                          <p>Get single view instance privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeId}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getPrivilege-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getPrivilege-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getPrivilege-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getPrivilege-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getPrivilege-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getPrivilege-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getPrivilege-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges/{privilegeId}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getPrivilege-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewPrivilegeResponseWrapper result = apiInstance.getPrivilege(viewName, version, instanceName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getPrivilege-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String privilegeId = privilegeId_example; // String | privilege id
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewPrivilegeResponseWrapper result = apiInstance.getPrivilege(viewName, version, instanceName, privilegeId, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPrivilege");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getPrivilege-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getPrivilege-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
String *privilegeId = privilegeId_example; // privilege id
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to PrivilegeInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view instance privilege
[apiInstance getPrivilegeWith:viewName
    version:version
    instanceName:instanceName
    privilegeId:privilegeId
    fields:fields
              completionHandler: ^(ViewPrivilegeResponseWrapper output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivilege-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var privilegeId = privilegeId_example; // {String} privilege id

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getPrivilege(viewName, version, instanceName, privilegeId, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getPrivilege-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getPrivilege-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getPrivilegeExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var privilegeId = privilegeId_example;  // String | privilege id
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to PrivilegeInfo/*)

            try
            {
                // Get single view instance privilege
                ViewPrivilegeResponseWrapper result = apiInstance.getPrivilege(viewName, version, instanceName, privilegeId, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getPrivilege: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivilege-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$privilegeId = privilegeId_example; // String | privilege id
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getPrivilege($viewName, $version, $instanceName, $privilegeId, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getPrivilege: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivilege-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $privilegeId = privilegeId_example; # String | privilege id
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getPrivilege(viewName => $viewName, version => $version, instanceName => $instanceName, privilegeId => $privilegeId, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getPrivilege: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivilege-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
privilegeId = privilegeId_example # String | privilege id
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to PrivilegeInfo/*)

try: 
    # Get single view instance privilege
    api_response = api_instance.getPrivilege(viewName, version, instanceName, privilegeId, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getPrivilege: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_instanceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">privilegeId*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "privilegeId",
  "in" : "path",
  "description" : "privilege id",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_privilegeId');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_privilegeId"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivilege_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivilege_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getPrivilege-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getPrivilege-200-schema">
                                  <div id='responses-getPrivilege-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewPrivilegeResponseWrapper"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getPrivilege-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getPrivilege-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getPrivilege-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getPrivileges">
                      <article id="api-Views-getPrivileges-0" data-group="User" data-name="getPrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>getPrivileges</h1>
                          <p>Get all view instance privileges</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getPrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getPrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getPrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getPrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getPrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getPrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getPrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getPrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewPrivilegeResponseWrapper] result = apiInstance.getPrivileges(viewName, version, instanceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getPrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewPrivilegeResponseWrapper] result = apiInstance.getPrivileges(viewName, version, instanceName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getPrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getPrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getPrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to PrivilegeInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all view instance privileges
[apiInstance getPrivilegesWith:viewName
    version:version
    instanceName:instanceName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewPrivilegeResponseWrapper] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getPrivileges(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getPrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getPrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getPrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to PrivilegeInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all view instance privileges
                array[ViewPrivilegeResponseWrapper] result = apiInstance.getPrivileges(viewName, version, instanceName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getPrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getPrivileges($viewName, $version, $instanceName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getPrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getPrivileges(viewName => $viewName, version => $version, instanceName => $instanceName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getPrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getPrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to PrivilegeInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all view instance privileges
    api_response = api_instance.getPrivileges(viewName, version, instanceName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getPrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_instanceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "PrivilegeInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getPrivileges_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getPrivileges_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getPrivileges-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getPrivileges-200-schema">
                                  <div id='responses-getPrivileges-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewPrivilegeResponseWrapper"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getPrivileges-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getPrivileges-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getPrivileges-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getService">
                      <article id="api-Views-getService-0" data-group="User" data-name="getService" data-version="0">
                        <div class="pull-left">
                          <h1>getService</h1>
                          <p>Get single view instance</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewInstanceResponse result = apiInstance.getService(viewName, version, instanceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewInstanceResponse result = apiInstance.getService(viewName, version, instanceName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *instanceName = instanceName_example; // instance name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewInstanceInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view instance
[apiInstance getServiceWith:viewName
    version:version
    instanceName:instanceName
    fields:fields
              completionHandler: ^(ViewInstanceResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getService(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var instanceName = instanceName_example;  // String | instance name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewInstanceInfo/*)

            try
            {
                // Get single view instance
                ViewInstanceResponse result = apiInstance.getService(viewName, version, instanceName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$instanceName = instanceName_example; // String | instance name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getService($viewName, $version, $instanceName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $instanceName = instanceName_example; # String | instance name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getService(viewName => $viewName, version => $version, instanceName => $instanceName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
instanceName = instanceName_example # String | instance name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewInstanceInfo/*)

try: 
    # Get single view instance
    api_response = api_instance.getService(viewName, version, instanceName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getService_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getService_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getService_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getService_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getService_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getService_instanceName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewInstanceInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getService_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getService_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getService-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getService-200-schema">
                                  <div id='responses-getService-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getService-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getService-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getService-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getServices">
                      <article id="api-Views-getServices-0" data-group="User" data-name="getServices" data-version="0">
                        <div class="pull-left">
                          <h1>getServices</h1>
                          <p>Get all view instances</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}/instances</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewInstanceResponse] result = apiInstance.getServices(viewName, version, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewInstanceResponse] result = apiInstance.getServices(viewName, version, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // 
String *version = version_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewInstanceInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all view instances
[apiInstance getServicesWith:viewName
    version:version
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewInstanceResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} 

var version = version_example; // {String} 

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getServices(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | 
            var version = version_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewInstanceInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all view instances
                array[ViewInstanceResponse] result = apiInstance.getServices(viewName, version, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | 
$version = version_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getServices($viewName, $version, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | 
my $version = version_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getServices(viewName => $viewName, version => $version, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | 
version = version_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewInstanceInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all view instances
    api_response = api_instance.getServices(viewName, version, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_version"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewInstanceInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getServices_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getServices_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getServices-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getServices-200-schema">
                                  <div id='responses-getServices-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewInstanceResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getServices-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getServices-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getServices-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getVersion">
                      <article id="api-Views-getVersion-0" data-group="User" data-name="getVersion" data-version="0">
                        <div class="pull-left">
                          <h1>getVersion</h1>
                          <p>Get single view version</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions/{version}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getVersion-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getVersion-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getVersion-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getVersion-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getVersion-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getVersion-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getVersion-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions/{version}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getVersion-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewVersionResponse result = apiInstance.getVersion(viewName, version, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getVersion");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getVersion-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewVersionResponse result = apiInstance.getVersion(viewName, version, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getVersion");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getVersion-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getVersion-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewVersionInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view version
[apiInstance getVersionWith:viewName
    version:version
    fields:fields
              completionHandler: ^(ViewVersionResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersion-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getVersion(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getVersion-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getVersion-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getVersionExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewVersionInfo/*)

            try
            {
                // Get single view version
                ViewVersionResponse result = apiInstance.getVersion(viewName, version, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getVersion: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersion-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getVersion($viewName, $version, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getVersion: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersion-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getVersion(viewName => $viewName, version => $version, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getVersion: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersion-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewVersionInfo/*)

try: 
    # Get single view version
    api_response = api_instance.getVersion(viewName, version, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getVersion: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersion_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersion_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersion_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersion_version"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewVersionInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersion_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersion_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getVersion-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getVersion-200-schema">
                                  <div id='responses-getVersion-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewVersionResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getVersion-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getVersion-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getVersion-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getVersions">
                      <article id="api-Views-getVersions-0" data-group="User" data-name="getVersions" data-version="0">
                        <div class="pull-left">
                          <h1>getVersions</h1>
                          <p>Get all versions for a view</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}/versions</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getVersions-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getVersions-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getVersions-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getVersions-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getVersions-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getVersions-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getVersions-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}/versions?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getVersions-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewVersionResponse] result = apiInstance.getVersions(viewName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getVersions-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewVersionResponse] result = apiInstance.getVersions(viewName, fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getVersions");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getVersions-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getVersions-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewVersionInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all versions for a view
[apiInstance getVersionsWith:viewName
    fields:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewVersionResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersions-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getVersions(viewName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getVersions-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getVersions-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getVersionsExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewVersionInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all versions for a view
                array[ViewVersionResponse] result = apiInstance.getVersions(viewName, fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getVersions: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersions-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getVersions($viewName, $fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getVersions: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersions-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getVersions(viewName => $viewName, fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getVersions: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getVersions-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewVersionInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all versions for a view
    api_response = api_instance.getVersions(viewName, fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getVersions: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_viewName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewVersionInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getVersions_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getVersions_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getVersions-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getVersions-200-schema">
                                  <div id='responses-getVersions-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewVersionResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getVersions-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getVersions-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getVersions-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getView">
                      <article id="api-Views-getView-0" data-group="User" data-name="getView" data-version="0">
                        <div class="pull-left">
                          <h1>getView</h1>
                          <p>Get single view</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views/{viewName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getView-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getView-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getView-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getView-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getView-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getView-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getView-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getView-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getView-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getView-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getView-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getView-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views/{viewName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getView-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewResponse result = apiInstance.getView(viewName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getView");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getView-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewResponse result = apiInstance.getView(viewName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getView");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getView-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getView-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Views/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view
[apiInstance getViewWith:viewName
    fields:fields
              completionHandler: ^(ViewResponse output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getView-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getView(viewName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getView-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getView-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getViewExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Views/*)

            try
            {
                // Get single view
                ViewResponse result = apiInstance.getView(viewName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getView: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getView-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getView($viewName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getView: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getView-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getView(viewName => $viewName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getView: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getView-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Views/*)

try: 
    # Get single view
    api_response = api_instance.getView(viewName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getView: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getView_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getView_viewName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Views/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getView_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getView_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getView-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getView-200-schema">
                                  <div id='responses-getView-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewResponse"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getView-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getView-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getView-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getViewUrl">
                      <article id="api-Views-getViewUrl-0" data-group="User" data-name="getViewUrl" data-version="0">
                        <div class="pull-left">
                          <h1>getViewUrl</h1>
                          <p>Get single view URL</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/view/urls/{urlName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getViewUrl-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getViewUrl-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getViewUrl-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getViewUrl-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getViewUrl-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getViewUrl-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getViewUrl-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/view/urls/{urlName}?fields="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getViewUrl-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewUrlResponseSwagger result = apiInstance.getViewUrl(urlName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViewUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getViewUrl-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        try {
            ViewUrlResponseSwagger result = apiInstance.getViewUrl(urlName, fields);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViewUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getViewUrl-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getViewUrl-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *urlName = urlName_example; // 
String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewUrlInfo/*)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get single view URL
[apiInstance getViewUrlWith:urlName
    fields:fields
              completionHandler: ^(ViewUrlResponseSwagger output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrl-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var urlName = urlName_example; // {String} 

var opts = { 
  'fields': fields_example // {String} Filter fields in the response (identifier fields are mandatory)
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getViewUrl(urlName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getViewUrl-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getViewUrl-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getViewUrlExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var urlName = urlName_example;  // String | 
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewUrlInfo/*)

            try
            {
                // Get single view URL
                ViewUrlResponseSwagger result = apiInstance.getViewUrl(urlName, fields);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getViewUrl: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrl-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$urlName = urlName_example; // String | 
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)

try {
    $result = $api_instance->getViewUrl($urlName, $fields);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getViewUrl: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrl-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $urlName = urlName_example; # String | 
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)

eval { 
    my $result = $api_instance->getViewUrl(urlName => $urlName, fields => $fields);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getViewUrl: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrl-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
urlName = urlName_example # String | 
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewUrlInfo/*)

try: 
    # Get single view URL
    api_response = api_instance.getViewUrl(urlName, fields=fields)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getViewUrl: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">urlName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "urlName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrl_urlName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrl_urlName"></div>
</td>
</tr>

                            </table>




                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewUrlInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrl_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrl_fields"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getViewUrl-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getViewUrl-200-schema">
                                  <div id='responses-getViewUrl-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "$ref" : "#/definitions/ViewUrlResponseSwagger"
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getViewUrl-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getViewUrl-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getViewUrl-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getViewUrls">
                      <article id="api-Views-getViewUrls-0" data-group="User" data-name="getViewUrls" data-version="0">
                        <div class="pull-left">
                          <h1>getViewUrls</h1>
                          <p>Get all view URLs</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/view/urls</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getViewUrls-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getViewUrls-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getViewUrls-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getViewUrls-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getViewUrls-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getViewUrls-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getViewUrls-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/view/urls?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getViewUrls-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewUrlResponseSwagger] result = apiInstance.getViewUrls(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViewUrls");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getViewUrls-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewUrlResponseSwagger] result = apiInstance.getViewUrls(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViewUrls");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getViewUrls-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getViewUrls-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewUrlInfo/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all view URLs
[apiInstance getViewUrlsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewUrlResponseSwagger] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrls-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getViewUrls(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getViewUrls-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getViewUrls-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getViewUrlsExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to ViewUrlInfo/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional) 
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all view URLs
                array[ViewUrlResponseSwagger] result = apiInstance.getViewUrls(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getViewUrls: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrls-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getViewUrls($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getViewUrls: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrls-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getViewUrls(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getViewUrls: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViewUrls-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to ViewUrlInfo/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all view URLs
    api_response = api_instance.getViewUrls(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getViewUrls: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "ViewUrlInfo/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViewUrls_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViewUrls_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getViewUrls-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getViewUrls-200-schema">
                                  <div id='responses-getViewUrls-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewUrlResponseSwagger"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getViewUrls-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getViewUrls-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getViewUrls-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-getViews">
                      <article id="api-Views-getViews-0" data-group="User" data-name="getViews" data-version="0">
                        <div class="pull-left">
                          <h1>getViews</h1>
                          <p>Get all views</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Returns details of all views.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="get"><code><span class="pln">/views</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-getViews-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-getViews-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-getViews-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-getViews-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-getViews-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-getViews-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-getViews-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">get</span> "https://localhost/api/v1/views?fields=&sortBy=&pageSize=&from=&to="</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-getViews-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewResponse] result = apiInstance.getViews(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViews");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-getViews-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
        String sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
        Integer pageSize = 56; // Integer | The number of resources to be returned for the paged response.
        Integer from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
        Integer to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.
        try {
            array[ViewResponse] result = apiInstance.getViews(fields, sortBy, pageSize, from, to);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#getViews");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-getViews-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-getViews-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *fields = fields_example; // Filter fields in the response (identifier fields are mandatory) (optional) (default to Views/*)
String *sortBy = sortBy_example; // Sort resources in result by (asc | desc) (optional) (default to Views/view_name.asc)
Integer *pageSize = 56; // The number of resources to be returned for the paged response. (optional) (default to 10)
Integer *from = 56; // The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
Integer *to = 56; // The ending page resource (inclusive).  "end" is also accepted. (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Get all views
[apiInstance getViewsWith:fields
    sortBy:sortBy
    pageSize:pageSize
    from:from
    to:to
              completionHandler: ^(array[ViewResponse] output, NSError* error) {
                            if (output) {
                                NSLog(@"%@", output);
                            }
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViews-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var opts = { 
  'fields': fields_example, // {String} Filter fields in the response (identifier fields are mandatory)
  'sortBy': sortBy_example, // {String} Sort resources in result by (asc | desc)
  'pageSize': 56, // {Integer} The number of resources to be returned for the paged response.
  'from': 56, // {Integer} The starting page resource (inclusive).  "start" is also accepted.
  'to': 56 // {Integer} The ending page resource (inclusive).  "end" is also accepted.
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully. Returned data: ' + data);
  }
};
api.getViews(opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-getViews-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-getViews-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class getViewsExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var fields = fields_example;  // String | Filter fields in the response (identifier fields are mandatory) (optional)  (default to Views/*)
            var sortBy = sortBy_example;  // String | Sort resources in result by (asc | desc) (optional)  (default to Views/view_name.asc)
            var pageSize = 56;  // Integer | The number of resources to be returned for the paged response. (optional)  (default to 10)
            var from = 56;  // Integer | The starting page resource (inclusive).  "start" is also accepted. (optional)  (default to 0)
            var to = 56;  // Integer | The ending page resource (inclusive).  "end" is also accepted. (optional) 

            try
            {
                // Get all views
                array[ViewResponse] result = apiInstance.getViews(fields, sortBy, pageSize, from, to);
                Debug.WriteLine(result);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.getViews: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViews-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$fields = fields_example; // String | Filter fields in the response (identifier fields are mandatory)
$sortBy = sortBy_example; // String | Sort resources in result by (asc | desc)
$pageSize = 56; // Integer | The number of resources to be returned for the paged response.
$from = 56; // Integer | The starting page resource (inclusive).  "start" is also accepted.
$to = 56; // Integer | The ending page resource (inclusive).  "end" is also accepted.

try {
    $result = $api_instance->getViews($fields, $sortBy, $pageSize, $from, $to);
    print_r($result);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->getViews: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViews-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $fields = fields_example; # String | Filter fields in the response (identifier fields are mandatory)
my $sortBy = sortBy_example; # String | Sort resources in result by (asc | desc)
my $pageSize = 56; # Integer | The number of resources to be returned for the paged response.
my $from = 56; # Integer | The starting page resource (inclusive).  "start" is also accepted.
my $to = 56; # Integer | The ending page resource (inclusive).  "end" is also accepted.

eval { 
    my $result = $api_instance->getViews(fields => $fields, sortBy => $sortBy, pageSize => $pageSize, from => $from, to => $to);
    print Dumper($result);
};
if ($@) {
    warn "Exception when calling ViewsApi->getViews: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-getViews-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
fields = fields_example # String | Filter fields in the response (identifier fields are mandatory) (optional) (default to Views/*)
sortBy = sortBy_example # String | Sort resources in result by (asc | desc) (optional) (default to Views/view_name.asc)
pageSize = 56 # Integer | The number of resources to be returned for the paged response. (optional) (default to 10)
from = 56 # Integer | The starting page resource (inclusive).  "start" is also accepted. (optional) (default to 0)
to = 56 # Integer | The ending page resource (inclusive).  "end" is also accepted. (optional)

try: 
    # Get all views
    api_response = api_instance.getViews(fields=fields, sortBy=sortBy, pageSize=pageSize, from=from, to=to)
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ViewsApi->getViews: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>





                            <div class="methodsubtabletitle">Query parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">fields</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "fields",
  "in" : "query",
  "description" : "Filter fields in the response (identifier fields are mandatory)",
  "required" : false,
  "type" : "string",
  "default" : "Views/*"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_fields');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_fields"></div>
</td>
</tr>

                                <tr><td style="width:150px;">sortBy</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "sortBy",
  "in" : "query",
  "description" : "Sort resources in result by (asc | desc)",
  "required" : false,
  "type" : "string",
  "default" : "Views/view_name.asc"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_sortBy');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_sortBy"></div>
</td>
</tr>

                                <tr><td style="width:150px;">page_size</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "page_size",
  "in" : "query",
  "description" : "The number of resources to be returned for the paged response.",
  "required" : false,
  "type" : "integer",
  "default" : 10
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_pageSize');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_pageSize"></div>
</td>
</tr>

                                <tr><td style="width:150px;">from</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "from",
  "in" : "query",
  "description" : "The starting page resource (inclusive).  \"start\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "default" : 0,
  "minimum" : 0.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_from');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_from"></div>
</td>
</tr>

                                <tr><td style="width:150px;">to</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "to",
  "in" : "query",
  "description" : "The ending page resource (inclusive).  \"end\" is also accepted.",
  "required" : false,
  "type" : "integer",
  "minimum" : 1.0
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_getViews_to');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_getViews_to"></div>
</td>
</tr>

                            </table>

                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                                <li class="active">
                                  <a data-toggle="tab" href="#responses-getViews-200-schema">Schema</a>
                                </li>

                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                                <div class="tab-pane active" id="responses-getViews-200-schema">
                                  <div id='responses-getViews-200-schema-200' style="padding: 30px; border-left: 1px solid #eee; border-right: 1px solid #eee; border-bottom: 1px solid #eee;">
                                                               <script>
                                      $(document).ready(function() {
                                        var schemaWrapper = {
  "description" : "Successful operation",
  "schema" : {
    "type" : "array",
    "items" : {
      "$ref" : "#/definitions/ViewResponse"
    }
  }
};
                                        var schema = schemaWrapper.schema;
                                        schemaWrapper.definitions = defs;
                                        //console.log(JSON.stringify(schema))
                                        JsonRefs.resolveRefs(schemaWrapper, {
                                            "depth": 3,
                                            "resolveRemoteRefs": false,
                                            "resolveFileRefs": false
                                        }, function(err, resolved, metadata) {
                                          //console.log(JSON.stringify(resolved));
                                          var view = new JSONSchemaView(resolved.schema, 3);
                                          $('#responses-getViews-200-schema-data').val(JSON.stringify(resolved.schema));
                                          var result = $('#responses-getViews-200-schema-200');
                                          result.empty();
                                          result.append(view.render());
                                        });
                                      });
                                    </script>
                                  </div>
                                  <input id='responses-getViews-200-schema-data' type='hidden' value=''></input>
                                </div>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-migrateData">
                      <article id="api-Views-migrateData-0" data-group="User" data-name="migrateData" data-version="0">
                        <div class="pull-left">
                          <h1>migrateData</h1>
                          <p>Migrate view instance data</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked">Migrates view instance persistence data from origin view instance specified in the path params.</p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/migrate/{originVersion}/{originInstanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-migrateData-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-migrateData-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-migrateData-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-migrateData-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-migrateData-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-migrateData-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-migrateData-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/migrate/{originVersion}/{originInstanceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-migrateData-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String originVersion = originVersion_example; // String | origin version
        String originInstanceName = originInstanceName_example; // String | origin instance name
        try {
            apiInstance.migrateData(viewName, version, instanceName, originVersion, originInstanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#migrateData");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-migrateData-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        String originVersion = originVersion_example; // String | origin version
        String originInstanceName = originInstanceName_example; // String | origin instance name
        try {
            apiInstance.migrateData(viewName, version, instanceName, originVersion, originInstanceName);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#migrateData");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-migrateData-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-migrateData-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
String *originVersion = originVersion_example; // origin version
String *originInstanceName = originInstanceName_example; // origin instance name

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Migrate view instance data
[apiInstance migrateDataWith:viewName
    version:version
    instanceName:instanceName
    originVersion:originVersion
    originInstanceName:originInstanceName
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-migrateData-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var originVersion = originVersion_example; // {String} origin version

var originInstanceName = originInstanceName_example; // {String} origin instance name


var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.migrateData(viewName, version, instanceName, originVersion, originInstanceName, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-migrateData-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-migrateData-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class migrateDataExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var originVersion = originVersion_example;  // String | origin version
            var originInstanceName = originInstanceName_example;  // String | origin instance name

            try
            {
                // Migrate view instance data
                apiInstance.migrateData(viewName, version, instanceName, originVersion, originInstanceName);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.migrateData: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-migrateData-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$originVersion = originVersion_example; // String | origin version
$originInstanceName = originInstanceName_example; // String | origin instance name

try {
    $api_instance->migrateData($viewName, $version, $instanceName, $originVersion, $originInstanceName);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->migrateData: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-migrateData-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $originVersion = originVersion_example; # String | origin version
my $originInstanceName = originInstanceName_example; # String | origin instance name

eval { 
    $api_instance->migrateData(viewName => $viewName, version => $version, instanceName => $instanceName, originVersion => $originVersion, originInstanceName => $originInstanceName);
};
if ($@) {
    warn "Exception when calling ViewsApi->migrateData: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-migrateData-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
originVersion = originVersion_example # String | origin version
originInstanceName = originInstanceName_example # String | origin instance name

try: 
    # Migrate view instance data
    api_instance.migrateData(viewName, version, instanceName, originVersion, originInstanceName)
except ApiException as e:
    print("Exception when calling ViewsApi->migrateData: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_instanceName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">originVersion*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "originVersion",
  "in" : "path",
  "description" : "origin version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_originVersion');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_originVersion"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">originInstanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "originInstanceName",
  "in" : "path",
  "description" : "origin instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_migrateData_originInstanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_migrateData_originInstanceName"></div>
</td>
</tr>

                            </table>





                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-updatePrivileges">
                      <article id="api-Views-updatePrivileges-0" data-group="User" data-name="updatePrivileges" data-version="0">
                        <div class="pull-left">
                          <h1>updatePrivileges</h1>
                          <p>Update view instance privilege</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}/privileges</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-updatePrivileges-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-updatePrivileges-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-updatePrivileges-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-updatePrivileges-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-updatePrivileges-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-updatePrivileges-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-updatePrivileges-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}/privileges"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-updatePrivileges-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        ViewPrivilegeService body = ; // ViewPrivilegeService | 
        try {
            apiInstance.updatePrivileges(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updatePrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-updatePrivileges-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | view version
        String instanceName = instanceName_example; // String | instance name
        ViewPrivilegeService body = ; // ViewPrivilegeService | 
        try {
            apiInstance.updatePrivileges(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updatePrivileges");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-updatePrivileges-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // view version
String *instanceName = instanceName_example; // instance name
ViewPrivilegeService *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Update view instance privilege
[apiInstance updatePrivilegesWith:viewName
    version:version
    instanceName:instanceName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} view version

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'body':  // {ViewPrivilegeService} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updatePrivileges(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-updatePrivileges-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updatePrivilegesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | view version
            var instanceName = instanceName_example;  // String | instance name
            var body = new ViewPrivilegeService(); // ViewPrivilegeService |  (optional) 

            try
            {
                // Update view instance privilege
                apiInstance.updatePrivileges(viewName, version, instanceName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.updatePrivileges: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | view version
$instanceName = instanceName_example; // String | instance name
$body = ; // ViewPrivilegeService | 

try {
    $api_instance->updatePrivileges($viewName, $version, $instanceName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->updatePrivileges: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | view version
my $instanceName = instanceName_example; # String | instance name
my $body = WWW::SwaggerClient::Object::ViewPrivilegeService->new(); # ViewPrivilegeService | 

eval { 
    $api_instance->updatePrivileges(viewName => $viewName, version => $version, instanceName => $instanceName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->updatePrivileges: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updatePrivileges-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | view version
instanceName = instanceName_example # String | instance name
body =  # ViewPrivilegeService |  (optional)

try: 
    # Update view instance privilege
    api_instance.updatePrivileges(viewName, version, instanceName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->updatePrivileges: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updatePrivileges_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updatePrivileges_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "description" : "view version",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updatePrivileges_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updatePrivileges_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updatePrivileges_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updatePrivileges_instanceName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewPrivilegeService"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updatePrivileges_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updatePrivileges_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-updateService">
                      <article id="api-Views-updateService-0" data-group="User" data-name="updateService" data-version="0">
                        <div class="pull-left">
                          <h1>updateService</h1>
                          <p>Update view instance detail</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/views/{viewName}/versions/{version}/instances/{instanceName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-updateService-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-updateService-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-updateService-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-updateService-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-updateService-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-updateService-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-updateService-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances/{instanceName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-updateService-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.updateService(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-updateService-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | view name
        String version = version_example; // String | 
        String instanceName = instanceName_example; // String | instance name
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.updateService(viewName, version, instanceName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateService");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-updateService-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-updateService-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // view name
String *version = version_example; // 
String *instanceName = instanceName_example; // instance name
ViewInstanceResponse *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Update view instance detail
[apiInstance updateServiceWith:viewName
    version:version
    instanceName:instanceName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateService-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} view name

var version = version_example; // {String} 

var instanceName = instanceName_example; // {String} instance name

var opts = { 
  'body':  // {ViewInstanceResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateService(viewName, version, instanceName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-updateService-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-updateService-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateServiceExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | view name
            var version = version_example;  // String | 
            var instanceName = instanceName_example;  // String | instance name
            var body = new ViewInstanceResponse(); // ViewInstanceResponse |  (optional) 

            try
            {
                // Update view instance detail
                apiInstance.updateService(viewName, version, instanceName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.updateService: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateService-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | view name
$version = version_example; // String | 
$instanceName = instanceName_example; // String | instance name
$body = ; // ViewInstanceResponse | 

try {
    $api_instance->updateService($viewName, $version, $instanceName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->updateService: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateService-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | view name
my $version = version_example; # String | 
my $instanceName = instanceName_example; # String | instance name
my $body = WWW::SwaggerClient::Object::ViewInstanceResponse->new(); # ViewInstanceResponse | 

eval { 
    $api_instance->updateService(viewName => $viewName, version => $version, instanceName => $instanceName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->updateService: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateService-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | view name
version = version_example # String | 
instanceName = instanceName_example # String | instance name
body =  # ViewInstanceResponse |  (optional)

try: 
    # Update view instance detail
    api_instance.updateService(viewName, version, instanceName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->updateService: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "description" : "view name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateService_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateService_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateService_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateService_version"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">instanceName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "instanceName",
  "in" : "path",
  "description" : "instance name",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateService_instanceName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateService_instanceName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateService_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateService_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-updateServices">
                      <article id="api-Views-updateServices-0" data-group="User" data-name="updateServices" data-version="0">
                        <div class="pull-left">
                          <h1>updateServices</h1>
                          <p>Update multiple view instance detail</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/views/{viewName}/versions/{version}/instances</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-updateServices-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-updateServices-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-updateServices-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-updateServices-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-updateServices-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-updateServices-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-updateServices-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/views/{viewName}/versions/{version}/instances"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-updateServices-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.updateServices(viewName, version, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-updateServices-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String viewName = viewName_example; // String | 
        String version = version_example; // String | 
        ViewInstanceResponse body = ; // ViewInstanceResponse | 
        try {
            apiInstance.updateServices(viewName, version, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateServices");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-updateServices-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-updateServices-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *viewName = viewName_example; // 
String *version = version_example; // 
ViewInstanceResponse *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Update multiple view instance detail
[apiInstance updateServicesWith:viewName
    version:version
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateServices-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var viewName = viewName_example; // {String} 

var version = version_example; // {String} 

var opts = { 
  'body':  // {ViewInstanceResponse} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateServices(viewName, version, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-updateServices-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-updateServices-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateServicesExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var viewName = viewName_example;  // String | 
            var version = version_example;  // String | 
            var body = new ViewInstanceResponse(); // ViewInstanceResponse |  (optional) 

            try
            {
                // Update multiple view instance detail
                apiInstance.updateServices(viewName, version, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.updateServices: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateServices-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$viewName = viewName_example; // String | 
$version = version_example; // String | 
$body = ; // ViewInstanceResponse | 

try {
    $api_instance->updateServices($viewName, $version, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->updateServices: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateServices-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $viewName = viewName_example; # String | 
my $version = version_example; # String | 
my $body = WWW::SwaggerClient::Object::ViewInstanceResponse->new(); # ViewInstanceResponse | 

eval { 
    $api_instance->updateServices(viewName => $viewName, version => $version, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->updateServices: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateServices-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
viewName = viewName_example # String | 
version = version_example # String | 
body =  # ViewInstanceResponse |  (optional)

try: 
    # Update multiple view instance detail
    api_instance.updateServices(viewName, version, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->updateServices: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">viewName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "viewName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateServices_viewName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateServices_viewName"></div>
</td>
</tr>

                                  <tr><td style="width:150px;">version*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "version",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateServices_version');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateServices_version"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewInstanceResponse"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateServices_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateServices_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                    <div id="api-Views-updateUrl">
                      <article id="api-Views-updateUrl-0" data-group="User" data-name="updateUrl" data-version="0">
                        <div class="pull-left">
                          <h1>updateUrl</h1>
                          <p>Update view URL</p>
                        </div>
                        <div class="pull-right"></div>
                        <div class="clearfix"></div>
                        <p></p>
                        <p class="marked"></p>
                        <p></p>
                        <br />
                        <pre class="prettyprint language-html prettyprinted" data-type="put"><code><span class="pln">/view/urls/{urlName}</span></code></pre>
                        <p>
                          <h3>Usage and SDK Samples</h3>
                        </p>
                        <ul class="nav nav-tabs nav-tabs-examples">
                          <li class="active"><a href="#examples-Views-updateUrl-0-curl">Curl</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-java">Java</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-android">Android</a></li>
                          <!--<li class=""><a href="#examples-Views-updateUrl-0-groovy">Groovy</a></li>-->
                          <li class=""><a href="#examples-Views-updateUrl-0-objc">Obj-C</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-javascript">JavaScript</a></li>
                          <!--<li class=""><a href="#examples-Views-updateUrl-0-angular">Angular</a></li>-->
                          <li class=""><a href="#examples-Views-updateUrl-0-csharp">C#</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-php">PHP</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-perl">Perl</a></li>
                          <li class=""><a href="#examples-Views-updateUrl-0-python">Python</a></li>
                        </ul>

                        <div class="tab-content">
                          <div class="tab-pane active" id="examples-Views-updateUrl-0-curl">
                            <pre class="prettyprint"><code class="language-bsh">curl -X <span style="text-transform: uppercase;">put</span> "https://localhost/api/v1/view/urls/{urlName}"</code></pre>
                          </div>
                          <div class="tab-pane" id="examples-Views-updateUrl-0-java">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.*;
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.ViewsApi;

import java.io.File;
import java.util.*;

public class ViewsApiExample {

    public static void main(String[] args) {
        
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        ViewUrlResponseSwagger body = ; // ViewUrlResponseSwagger | 
        try {
            apiInstance.updateUrl(urlName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>

                          <div class="tab-pane" id="examples-Views-updateUrl-0-android">
                            <pre class="prettyprint"><code class="language-java">import io.swagger.client.api.ViewsApi;

public class ViewsApiExample {

    public static void main(String[] args) {
        ViewsApi apiInstance = new ViewsApi();
        String urlName = urlName_example; // String | 
        ViewUrlResponseSwagger body = ; // ViewUrlResponseSwagger | 
        try {
            apiInstance.updateUrl(urlName, body);
        } catch (ApiException e) {
            System.err.println("Exception when calling ViewsApi#updateUrl");
            e.printStackTrace();
        }
    }
}</code></pre>
                          </div>
  <!--
  <div class="tab-pane" id="examples-Views-updateUrl-0-groovy">
  <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
  </div> -->
                            <div class="tab-pane" id="examples-Views-updateUrl-0-objc">
                              <pre class="prettyprint"><code class="language-cpp">String *urlName = urlName_example; // 
ViewUrlResponseSwagger *body = ; //  (optional)

ViewsApi *apiInstance = [[ViewsApi alloc] init];

// Update view URL
[apiInstance updateUrlWith:urlName
    body:body
              completionHandler: ^(NSError* error) {
                            if (error) {
                                NSLog(@"Error: %@", error);
                            }
                        }];
</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateUrl-0-javascript">
                              <pre class="prettyprint"><code class="language-js">var SwaggerSpecForAmbariRestApi = require('swagger_spec_for_ambari_rest_api');

var api = new SwaggerSpecForAmbariRestApi.ViewsApi()

var urlName = urlName_example; // {String} 

var opts = { 
  'body':  // {ViewUrlResponseSwagger} 
};

var callback = function(error, data, response) {
  if (error) {
    console.error(error);
  } else {
    console.log('API called successfully.');
  }
};
api.updateUrl(urlName, opts, callback);
</code></pre>
                            </div>

                            <!--<div class="tab-pane" id="examples-Views-updateUrl-0-angular">
              <pre class="prettyprint language-json prettyprinted" data-type="json"><code>Coming Soon!</code></pre>
            </div>-->
                            <div class="tab-pane" id="examples-Views-updateUrl-0-csharp">
                              <pre class="prettyprint"><code class="language-cs">using System;
using System.Diagnostics;
using IO.Swagger.Api;
using IO.Swagger.Client;
using IO.Swagger.Model;

namespace Example
{
    public class updateUrlExample
    {
        public void main()
        {
            
            var apiInstance = new ViewsApi();
            var urlName = urlName_example;  // String | 
            var body = new ViewUrlResponseSwagger(); // ViewUrlResponseSwagger |  (optional) 

            try
            {
                // Update view URL
                apiInstance.updateUrl(urlName, body);
            }
            catch (Exception e)
            {
                Debug.Print("Exception when calling ViewsApi.updateUrl: " + e.Message );
            }
        }
    }
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateUrl-0-php">
                              <pre class="prettyprint"><code class="language-php"><&#63;php
require_once(__DIR__ . '/vendor/autoload.php');

$api_instance = new Swagger\Client\Api\ViewsApi();
$urlName = urlName_example; // String | 
$body = ; // ViewUrlResponseSwagger | 

try {
    $api_instance->updateUrl($urlName, $body);
} catch (Exception $e) {
    echo 'Exception when calling ViewsApi->updateUrl: ', $e->getMessage(), PHP_EOL;
}
?></code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateUrl-0-perl">
                              <pre class="prettyprint"><code class="language-perl">use Data::Dumper;
use WWW::SwaggerClient::Configuration;
use WWW::SwaggerClient::ViewsApi;

my $api_instance = WWW::SwaggerClient::ViewsApi->new();
my $urlName = urlName_example; # String | 
my $body = WWW::SwaggerClient::Object::ViewUrlResponseSwagger->new(); # ViewUrlResponseSwagger | 

eval { 
    $api_instance->updateUrl(urlName => $urlName, body => $body);
};
if ($@) {
    warn "Exception when calling ViewsApi->updateUrl: $@\n";
}</code></pre>
                            </div>

                            <div class="tab-pane" id="examples-Views-updateUrl-0-python">
                              <pre class="prettyprint"><code class="language-python">from __future__ import print_statement
import time
import swagger_client
from swagger_client.rest import ApiException
from pprint import pprint

# create an instance of the API class
api_instance = swagger_client.ViewsApi()
urlName = urlName_example # String | 
body =  # ViewUrlResponseSwagger |  (optional)

try: 
    # Update view URL
    api_instance.updateUrl(urlName, body=body)
except ApiException as e:
    print("Exception when calling ViewsApi->updateUrl: %s\n" % e)</code></pre>
                            </div>
                          </div>

                          <h2>Parameters</h2>

                            <div class="methodsubtabletitle">Path parameters</div>
                            <table id="methodsubtable">
                                <tr>
                                  <th width="150px">Name</th>
                                  <th>Description</th>
                                </tr>
                                  <tr><td style="width:150px;">urlName*</td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "name" : "urlName",
  "in" : "path",
  "required" : true,
  "type" : "string"
};
													var schema = schemaWrapper;




													var view = new JSONSchemaView(schema,1);
													var result = $('#d2e199_updateUrl_urlName');
													result.empty();
													result.append(view.render());





												});
												</script>
												<div id="d2e199_updateUrl_urlName"></div>
</td>
</tr>

                            </table>


                            <div class="methodsubtabletitle">Body parameters</div>
                            <table id="methodsubtable">
                              <tr>
                                <th width="150px">Name</th>
                                <th>Description</th>
                              </tr>
                                <tr><td style="width:150px;">body </td>
<td>


<script>
												$(document).ready(function() {
													var schemaWrapper = {
  "in" : "body",
  "name" : "body",
  "required" : false,
  "schema" : {
    "$ref" : "#/definitions/ViewUrlResponseSwagger"
  }
};
													
														var schema = schemaWrapper.schema;
														schemaWrapper.definitions = defs;
														JsonRefs.resolveRefs(schemaWrapper, {"depth":3, "resolveRemoteRefs":false,"resolveFileRefs":false },function (err, resolved, metadata) {
														

														
													var view = new JSONSchemaView(resolved.schema,2,{isBodyParam: true});
													 
													var result = $('#d2e199_updateUrl_body');
													result.empty();
													result.append(view.render());
													

													
    											
													


												});



												});
												</script>
												<div id="d2e199_updateUrl_body"></div>
</td>
</tr>

                            </table>



                          <h2>Responses</h2>
                            <h3> Status: 200 - Successful operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 202 - Request is accepted, but not completely processed yet </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 400 - Invalid arguments </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 401 - Not authenticated </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 403 - Not permitted to perform the operation </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 404 - Cluster or host not found </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                            <h3> Status: 500 - Internal server error </h3>

                            <ul class="nav nav-tabs nav-tabs-examples" >
                            </ul>

                            <div class="tab-content" style='margin-bottom: 10px;'>
                            </div>

                        </article>
                      </div>
                      <hr>
                  </section>
          </div>
          <div id="footer">
            <div id="api-_footer">
              <p>Suggestions, contact, support and error reporting;
                  <div class="app-desc">Information URL: <a href="https://helloreverb.com">https://helloreverb.com</a></div>
                  <div class="app-desc">Contact Info: <a href="hello@helloreverb.com">hello@helloreverb.com</a></div>
              </p>
                <div class="license-info">Apache License, Version 2.0</div>
                <div class="license-url">http://www.apache.org/licenses/LICENSE-2.0</div>
            </div>
          </div>
          <div id="generator">
            <div class="content">
              Generated 2019-08-27T12:59:32.195+03:00
            </div>
          </div>
      </div>
    </div>
  </div>
  <script>

(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JSONSchemaView = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';
/*
 * Converts anyOf, allOf and oneOf to human readable string
*/
Object.defineProperty(exports, '__esModule', {
  value: true
});
exports.convertXOf = convertXOf;
exports._if = _if;

function convertXOf(type) {
  return type.substring(0, 3) + ' of';
}

/*
 * if condition for ES6 template strings
 * to be used only in template string
 *
 * @example mystr = `Random is ${_if(Math.random() > 0.5)`greater than 0.5``
 *
 * @param {boolean} condition
 *
 * @returns {function} the template function
*/

function _if(condition) {
  return condition ? normal : empty;
}

function empty() {
  return '';
}
function normal(template) {
  for (var _len = arguments.length, expressions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
    expressions[_key - 1] = arguments[_key];
  }

  return template.slice(1).reduce(function (accumulator, part, i) {
    return accumulator + expressions[i] + part;
  }, template[0]);
}

},{}],2:[function(require,module,exports){
'use strict';

/* globals JSONSchemaView */

Object.defineProperty(exports, '__esModule', {
  value: true
});

var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();

var _templateObject = _taggedTemplateLiteral(['\n        <div class="any">\n          ', '\n\n          <span class="type type-any">&lt;any&gt;</span>\n\n          ', '\n\t\t \n\t\t  ', '\n\t\t  ', '\n\t\t   ', '\n        </div>\n      '], ['\n        <div class="any">\n          ', '\n\n          <span class="type type-any">&lt;any&gt;</span>\n\n          ', '\n\t\t \n\t\t  ', '\n\t\t  ', '\n\t\t   ', '\n        </div>\n      ']),
    _templateObject2 = _taggedTemplateLiteral(['\n            <a class="title"><span class="toggle-handle"></span>', ' </a>\n          '], ['\n            <a class="title"><span class="toggle-handle"></span>', ' </a>\n          ']),
    _templateObject3 = _taggedTemplateLiteral(['\n            <div class="inner description marked">', '</div>\n          '], ['\n            <div class="inner description marked">', '</div>\n          ']),
    _templateObject4 = _taggedTemplateLiteral(['\n            <div class="inner required">Required: ', '</div>\n          '], ['\n            <div class="inner required">Required: ', '</div>\n          ']),
    _templateObject5 = _taggedTemplateLiteral(['\n            <div class="inner default">Default: ', '</div>\n          '], ['\n            <div class="inner default">Default: ', '</div>\n          ']),
    _templateObject6 = _taggedTemplateLiteral(['\n            <div class="inner pattern">Pattern: ', '</div>\n          '], ['\n            <div class="inner pattern">Pattern: ', '</div>\n          ']),
    _templateObject7 = _taggedTemplateLiteral(['\n        <div class="primitive">\n          ', '\n\n            <span class="type">', '</span>\n\n         \n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\t\t  \n\t\t \n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t   ', '\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n        </div>\n      '], ['\n        <div class="primitive">\n          ', '\n\n            <span class="type">', '</span>\n\n         \n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\n          ', '\n\t\t  \n\t\t \n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t   ', '\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n        </div>\n      ']),
    _templateObject8 = _taggedTemplateLiteral(['\n            <span class="format">(', ')</span>\n          '], ['\n            <span class="format">(', ')</span>\n          ']),
    _templateObject9 = _taggedTemplateLiteral(['\n            <span class="range minimum">minimum:', '</span>\n          '], ['\n            <span class="range minimum">minimum:', '</span>\n          ']),
    _templateObject10 = _taggedTemplateLiteral(['\n            <span class="range exclusiveMinimum">(ex)minimum:', '</span>\n          '], ['\n            <span class="range exclusiveMinimum">(ex)minimum:', '</span>\n          ']),
    _templateObject11 = _taggedTemplateLiteral(['\n            <span class="range maximum">maximum:', '</span>\n          '], ['\n            <span class="range maximum">maximum:', '</span>\n          ']),
    _templateObject12 = _taggedTemplateLiteral(['\n            <span class="range exclusiveMaximum">(ex)maximum:', '</span>\n          '], ['\n            <span class="range exclusiveMaximum">(ex)maximum:', '</span>\n          ']),
    _templateObject13 = _taggedTemplateLiteral(['\n            <span class="range minLength">minLength:', '</span>\n          '], ['\n            <span class="range minLength">minLength:', '</span>\n          ']),
    _templateObject14 = _taggedTemplateLiteral(['\n            <span class="range maxLength">maxLength:', '</span>\n          '], ['\n            <span class="range maxLength">maxLength:', '</span>\n          ']),
    _templateObject15 = _taggedTemplateLiteral(['\n            <div class="inner required">Required</div>\n          '], ['\n            <div class="inner required">Required</div>\n          ']),
    _templateObject16 = _taggedTemplateLiteral(['\n            ', '\n          '], ['\n            ', '\n          ']),
    _templateObject17 = _taggedTemplateLiteral(['', ''], ['', '']),
    _templateObject18 = _taggedTemplateLiteral(['\n        <div class="array">\n          <a class="title"><span class="toggle-handle"></span>', '<span class="opening bracket">[</span>', '</a>\n          ', '\n          <div class="inner">\n            ', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      '], ['\n        <div class="array">\n          <a class="title"><span class="toggle-handle"></span>', '<span class="opening bracket">[</span>', '</a>\n          ', '\n          <div class="inner">\n            ', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      ']),
    _templateObject19 = _taggedTemplateLiteral(['<span class="closing bracket">]</span>'], ['<span class="closing bracket">]</span>']),
    _templateObject20 = _taggedTemplateLiteral(['\n          <span>\n            <span title="items range">(', '..', ')</span>\n            ', '\n          </span>\n          '], ['\n          <span>\n            <span title="items range">(', '..', ')</span>\n            ', '\n          </span>\n          ']),
    _templateObject21 = _taggedTemplateLiteral(['<span title="unique" class="uniqueItems">♦</span>'], ['<span title="unique" class="uniqueItems">♦</span>']),
    _templateObject22 = _taggedTemplateLiteral(['\n              <div class="description">', '</div>\n            '], ['\n              <div class="description">', '</div>\n            ']),
    _templateObject23 = _taggedTemplateLiteral(['\n          <span class="closing bracket">]</span>\n          '], ['\n          <span class="closing bracket">]</span>\n          ']),
    _templateObject24 = _taggedTemplateLiteral(['\n        <div class="object">\n          <a class="title"><span\n            class="toggle-handle"></span>', ' <span\n            class="opening brace">{</span>', '</a>\n\n          <div class="inner">\n            ', '\n            <!-- children go here -->\n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t  \n\t\t\t', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      '], ['\n        <div class="object">\n          <a class="title"><span\n            class="toggle-handle"></span>', ' <span\n            class="opening brace">{</span>', '</a>\n\n          <div class="inner">\n            ', '\n            <!-- children go here -->\n\t\t  \n\t\t   ', '\n\t\t  ', '\n\t\t  \n\t\t\t', '\n          </div>\n\n          ', '\n\n          ', '\n          ', '\n          ', '\n\n          ', '\n        </div>\n      ']),
    _templateObject25 = _taggedTemplateLiteral(['\n              <span class="closing brace" ng-if="isCollapsed">}</span>\n          '], ['\n              <span class="closing brace" ng-if="isCollapsed">}</span>\n          ']),
    _templateObject26 = _taggedTemplateLiteral(['\n            <div class="required">Required: ', '</div>\n          '], ['\n            <div class="required">Required: ', '</div>\n          ']),
   _templateObject266 = _taggedTemplateLiteral(['\n            <div class="required">Required: ', '</div>\n          '], ['\n            <div class="required">Required: ', '</div>\n          ']),
    _templateObject27 = _taggedTemplateLiteral(['\n            <div class="default">Default: ', '</div>\n          '], ['\n            <div class="default">Default: ', '</div>\n          ']),
    _templateObject28 = _taggedTemplateLiteral(['\n              <div class="pattern">Pattern: ', '</div>\n            '], ['\n              <div class="pattern">Pattern: ', '</div>\n            ']),
    _templateObject29 = _taggedTemplateLiteral(['\n          <span class="closing brace">}</span>\n          '], ['\n          <span class="closing brace">}</span>\n          ']),
    _templateObject30 = _taggedTemplateLiteral(['\n        <div class="inner enums">\n          <b>Enum:</b>\n        </div>\n      '], ['\n        <div class="inner enums">\n          <b>Enum:</b>\n        </div>\n      ']);

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }

function _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }

var _helpersJs = require('./helpers.js');

/**
 * @class JSONSchemaView
 *
 * A pure JavaScript component for rendering JSON Schema in HTML.
*/

var JSONSchemaView = (function () {

  /**
   * @param {object} schema The JSON Schema object
   *
   * @param {number} [open=1] his number indicates up to how many levels the
   * rendered tree should expand. Set it to `0` to make the whole tree collapsed
   * or set it to `Infinity` to expand the tree deeply
   * @param {object} options.
   *  theme {string}: one of the following options: ['dark']
  */

  function JSONSchemaView(schema, open) {
    var _this = this;

    var options = arguments.length <= 2 || arguments[2] === undefined ? { theme: null } : arguments[2];

    _classCallCheck(this, JSONSchemaView);

    this.schema = schema; //console.log(schema);
    this.open = open;
    this.options = options;
    this.isCollapsed = open <= 0;

    // if schema is an empty object which means any JOSN
    this.isAny = typeof schema === 'object' && !Array.isArray(schema) && !Object.keys(schema).filter(function (k) {
      return ['title', 'description'].indexOf(k) === -1;
    }).length;

    // Determine if a schema is an array
    this.isArray = !this.isAny && this.schema && this.schema.type === 'array';

    this.isObject = this.schema && (this.schema.type === 'object' || this.schema.properties || this.schema.anyOf || this.schema.oneof || this.schema.allOf);

    // Determine if a schema is a primitive
    this.isPrimitive = !this.isAny && !this.isArray && !this.isObject;

    //
    this.showToggle = this.schema.description || this.schema.title || this.isPrimitive && (this.schema.minimum || this.schema.maximum || this.schema.exclusiveMinimum || this.schema.exclusiveMaximum);

    // populate isRequired property down to properties
    if (this.schema && Array.isArray(this.schema.required)) {
      this.schema.required.forEach(function (requiredProperty) {
        if (typeof _this.schema.properties[requiredProperty] === 'object') {
          _this.schema.properties[requiredProperty].isRequired = true;
        }
      });
    }
  }

  /*
   * Returns the template with populated properties.
   * This template does not have the children
  */

  _createClass(JSONSchemaView, [{
    key: 'template',
    value: function template() {
      if (!this.schema) {
        return '';
      }

      return ('\n      <!-- Any -->\n      ' + (0, _helpersJs._if)(this.isAny)(_templateObject, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, marked(this.schema.description || "")), (0, _helpersJs._if)(this.schema.required && !this.isCollapsed)(_templateObject4, this.schema.required), (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject5, this.schema['default']), (0, _helpersJs._if)(this.schema.pattern && !this.isCollapsed)(_templateObject6, this.schema.pattern)) + '\n\n      <!-- Primitive -->\n      ' + (0, _helpersJs._if)(this.isPrimitive)(_templateObject7, (0, _helpersJs._if)(this.showToggle)(_templateObject2, this.schema.title || ''), this.schema.type, (0, _helpersJs._if)(!this.isCollapsed && this.schema.format)(_templateObject8, this.schema.format), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minimum)(_templateObject9, this.schema.minimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMinimum)(_templateObject10, this.schema.exclusiveMinimum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maximum)(_templateObject11, this.schema.maximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.exclusiveMaximum)(_templateObject12, this.schema.exclusiveMaximum), (0, _helpersJs._if)(!this.isCollapsed && this.schema.minLength)(_templateObject13, this.schema.minLength), (0, _helpersJs._if)(!this.isCollapsed && this.schema.maxLength)(_templateObject14, this.schema.maxLength), (0, _helpersJs._if)(this.schema.description && !this.isCollapsed)(_templateObject3, marked(this.schema.description || "")), (0, _helpersJs._if)(this.schema.required && !this.isCollapsed)(_templateObject15), (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject5, this.schema['default']), (0, _helpersJs._if)(this.schema.pattern && !this.isCollapsed)(_templateObject6, this.schema.pattern), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf'))) + '\n\n\n      <!-- Array -->\n      ' + (0, _helpersJs._if)(this.isArray)(_templateObject18, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject19), (0, _helpersJs._if)(!this.isCollapsed && (this.schema.uniqueItems || this.schema.minItems || this.schema.maxItems))(_templateObject20, this.schema.minItems || 0, this.schema.maxItems || '∞', (0, _helpersJs._if)(!this.isCollapsed && this.schema.uniqueItems)(_templateObject21)), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject22, marked(this.schema.description || "")), (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject23)) + '\n\n      <!-- Object -->\n      ' + (0, _helpersJs._if)(!this.isPrimitive && !this.isArray && !this.isAny)(_templateObject24, this.schema.title || '', (0, _helpersJs._if)(this.isCollapsed)(_templateObject25), (0, _helpersJs._if)(!this.isCollapsed && this.schema.description)(_templateObject22, marked(this.schema.description || "")),

        (0, _helpersJs._if)(this.schema.required && !this.isCollapsed && this.options.isBodyParam != true)(_templateObject26, this.schema.required),
        (0, _helpersJs._if)(this.schema.required && !this.isCollapsed && this.options.isBodyParam == true)(_templateObject266, this.schema.required),

        (0, _helpersJs._if)(this.schema['default'] && !this.isCollapsed)(_templateObject27, this.schema['default']),
        (0, _helpersJs._if)(!this.isCollapsed && this.schema.pattern)(_templateObject28, this.schema.pattern),
        (0, _helpersJs._if)(!this.isCollapsed && this.schema['enum'])(_templateObject16, this['enum'](this.schema, this.isCollapsed, this.open)), (0, _helpersJs._if)(this.schema.allOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'allOf')), (0, _helpersJs._if)(this.schema.oneOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'oneOf')), (0, _helpersJs._if)(this.schema.anyOf && !this.isCollapsed)(_templateObject17, this.xOf(this.schema, 'anyOf')), (0, _helpersJs._if)(!this.isCollapsed)(_templateObject29)) + '\n').replace(/\s*\n/g, '\n').replace(/(\<\!\-\-).+/g, '').trim();
    }

    /*
     * Template for oneOf, anyOf and allOf
    */
  }, {
    key: 'xOf',
    value: function xOf(schema, type) {
      return '\n      <div class="inner ' + type + '">\n        <b>' + (0, _helpersJs.convertXOf)(type) + ':</b>\n      </div>\n    ';
    }

    /*
     * Template for enums
    */
  }, {
    key: 'enum',
    value: function _enum(schema, isCollapsed, open) {
      return '\n      ' + (0, _helpersJs._if)(!isCollapsed && schema['enum'])(_templateObject30) + '\n    ';
    }

    /*
     * Toggles the 'collapsed' state
    */
  }, {
    key: 'toggle',
    value: function toggle() {
      this.isCollapsed = !this.isCollapsed;
      this.render();
    }

    /*
     * Renders the element and returns it
    */
  }, {
    key: 'render',
    value: function render() {
      if (!this.element) {
        this.element = document.createElement('div');
        this.element.classList.add('json-schema-view');
      }

      if (this.isCollapsed) {
        this.element.classList.add('collapsed');
      } else {
        this.element.classList.remove('collapsed');
      }

      if (this.options.theme) {
        this.element.classList.add('json-schema-view-' + this.options.theme);
      }

      this.element.innerHTML = this.template();

      if (!this.schema) {
        return this.element;
      }

      if (!this.isCollapsed) {
        this.appendChildren(this.element);
      }

      // add event listener for toggling
      if (this.element.querySelector('a.title')) {
        this.element.querySelector('a.title').addEventListener('click', this.toggle.bind(this));
      }
      return this.element;
    }

    /*
     * Appends children to given element based on current schema
    */
  }, {
    key: 'appendChildren',
    value: function appendChildren(element) {
      var _this2 = this;

      var inner = element.querySelector('.inner');

      if (!inner) {
        return;
      }

      if (this.schema['enum']) {
        var tempDiv = document.createElement('span');;
        tempDiv.classList.add('inner');
        tempDiv.innerHTML = '<code>' + this.schema['enum'].join('</code>, <code>') + '</code>';
        element.querySelector('.enums.inner').appendChild(tempDiv);
      }

      if (this.isArray) {
        var view = new JSONSchemaView(this.schema.items, this.open - 1);
        inner.appendChild(view.render());
      }

      if (typeof this.schema.properties === 'object') {
        Object.keys(this.schema.properties).forEach(function (propertyName) {
          var property = _this2.schema.properties[propertyName];
          var tempDiv = document.createElement('div');;
          tempDiv.innerHTML = '<div class="property">\n          <span class="name">' + propertyName + ':</span>\n        </div>';
          var view = new JSONSchemaView(property, _this2.open - 1);
          tempDiv.querySelector('.property').appendChild(view.render());

          inner.appendChild(tempDiv.querySelector('.property'));
        });
      }

      if (this.schema.allOf) {
        appendXOf.call(this, 'allOf');
      }
      if (this.schema.oneOf) {
        appendXOf.call(this, 'oneOf');
      }
      if (this.schema.anyOf) {
        appendXOf.call(this, 'anyOf');
      }

      function appendXOf(type) {
        var _this3 = this;

        var innerAllOf = element.querySelector('.inner.' + type);

        this.schema[type].forEach(function (schema) {
          var inner = document.createElement('div');
          inner.classList.add('inner');
          var view = new JSONSchemaView(schema, _this3.open - 1);
          inner.appendChild(view.render());
          innerAllOf.appendChild(inner);
        });
      }
    }
  }]);

  return JSONSchemaView;
})();

exports['default'] = JSONSchemaView;
module.exports = exports['default'];

},{"./helpers.js":1}]},{},[2])(2)
});
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJDOi9Vc2Vycy9qYW1lc2hpL0Rlc2t0b3AvanNvbi1zY2hlbWEtdmlldy1qcy1tYXN0ZXIvc3JjL2hlbHBlcnMuanMiLCJDOi9Vc2Vycy9qYW1lc2hpL0Rlc2t0b3AvanNvbi1zY2hlbWEtdmlldy1qcy1tYXN0ZXIvc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUEsWUFBWSxDQUFDOzs7Ozs7Ozs7O0FBSU4sU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0FBQy9CLFNBQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0NBQ3JDOzs7Ozs7Ozs7Ozs7O0FBWU0sU0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFO0FBQzdCLFNBQU8sU0FBUyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7Q0FDbkM7O0FBQ0QsU0FBUyxLQUFLLEdBQUU7QUFDZCxTQUFPLEVBQUUsQ0FBQztDQUNYO0FBQ0QsU0FBUyxNQUFNLENBQUUsUUFBUSxFQUFrQjtvQ0FBYixXQUFXO0FBQVgsZUFBVzs7O0FBQ3ZDLFNBQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBSztBQUN4RCxXQUFPLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0dBQzVDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDakI7OztBQzVCRCxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt5QkFPTixjQUFjOzs7Ozs7OztJQVFBLGNBQWM7Ozs7Ozs7Ozs7OztBQVd0QixXQVhRLGNBQWMsQ0FXckIsTUFBTSxFQUFFLElBQUksRUFBMkI7OztRQUF6QixPQUFPLHlEQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQzs7MEJBWDlCLGNBQWM7O0FBWS9CLFFBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3JCLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFFBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQzs7O0FBRzdCLFFBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUNyQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQ3RCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDbkIsTUFBTSxDQUFDLFVBQUEsQ0FBQzthQUFHLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDOzs7QUFHakUsUUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7O0FBRTFFLFFBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQSxBQUFDLENBQUM7OztBQUd0QixRQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7QUFHbEUsUUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQ2hCLElBQUksQ0FBQyxXQUFXLEtBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFBLEFBQUMsQUFDOUIsQ0FBQzs7O0FBR0osUUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUN0RCxVQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQSxnQkFBZ0IsRUFBSTtBQUMvQyxZQUFJLE9BQU8sTUFBSyxNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssUUFBUSxFQUFFO0FBQ2hFLGdCQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQzVEO09BQ0YsQ0FBQyxDQUFDO0tBQ0o7R0FDRjs7Ozs7OztlQXREa0IsY0FBYzs7V0E0RHpCLG9CQUFHO0FBQ1QsVUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDaEIsZUFBTyxFQUFFLENBQUM7T0FDWDs7QUFFRCxhQUFPLGtDQUVILG9CQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBRVgsb0JBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFDa0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxHQUs3RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUc5RCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBRWxFLG9CQUFJLElBQUksQ0FBQyxNQUFNLFdBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0QsSUFBSSxDQUFDLE1BQU0sV0FBUSxHQUU5RCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLDhDQU03RCxvQkFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUVqQixvQkFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUNrQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEdBR3hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUlyQyxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUcxQyxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBR3pELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG9CQUNILElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEdBRy9FLG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FHekQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsb0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FHL0Usb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLG9CQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUcvRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBRy9ELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBSzdELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFHL0Msb0JBQUksSUFBSSxDQUFDLE1BQU0sV0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDRCxJQUFJLENBQUMsTUFBTSxXQUFRLEdBRTlELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FHekQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFFBQUssQ0FBQyxvQkFDeEMsSUFBSSxRQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FHckQsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsNENBTWhGLG9CQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBRXVDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBeUMsb0JBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFDekksb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFBLEFBQUMsQ0FBQyxvQkFFdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEdBQUcsRUFDcEYsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUlqRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsb0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUlwRCxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sUUFBSyxDQUFDLG9CQUN4QyxJQUFJLFFBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUdyRCxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUM1RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUM1RSxvQkFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUU1RSxvQkFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsNkRBTzFCLG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUduQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQ3RCLG9CQUFJLElBQUksQ0FBQyxXQUFXLENBQUMscUJBS25ELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxvQkFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBSXpELG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FFbEUsb0JBQUksSUFBSSxDQUFDLE1BQU0sV0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFDUCxJQUFJLENBQUMsTUFBTSxXQUFRLEdBRzFELG9CQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFDSixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FJckQsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLFFBQUssQ0FBQyxvQkFDeEMsSUFBSSxRQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FHckQsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FDNUUsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FFNUUsb0JBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLDZCQUtoQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDM0Q7Ozs7Ozs7V0FLRSxhQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDaEIsNENBQ3NCLElBQUksdUJBQ2pCLDJCQUFXLElBQUksQ0FBQywrQkFFdkI7S0FDSDs7Ozs7OztXQUtHLGVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7QUFDOUIsMEJBQ0ksb0JBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxRQUFLLENBQUMsK0JBS2xDO0tBQ0g7Ozs7Ozs7V0FLSyxrQkFBRztBQUNQLFVBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0FBQ3JDLFVBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUNmOzs7Ozs7O1dBS0ssa0JBQUc7QUFDUCxVQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0MsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7T0FDaEQ7O0FBRUQsVUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQ3BCLFlBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztPQUN6QyxNQUFNO0FBQ0wsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO09BQzVDOztBQUVELFVBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDdEIsWUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyx1QkFBcUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUcsQ0FBQztPQUN0RTs7QUFFRCxVQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0FBRXpDLFVBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2hCLGVBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztPQUNyQjs7QUFFRCxVQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUNyQixZQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztPQUNuQzs7O0FBR0QsVUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRTtBQUN6QyxZQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztPQUN6RjtBQUNELGFBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUNyQjs7Ozs7OztXQUthLHdCQUFDLE9BQU8sRUFBRTs7O0FBQ3RCLFVBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRTlDLFVBQUksQ0FBQyxLQUFLLEVBQUU7QUFDVixlQUFPO09BQ1I7O0FBRUQsVUFBSSxJQUFJLENBQUMsTUFBTSxRQUFLLEVBQUU7QUFDcEIsWUFBTSxTQUFTLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sUUFBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckUsWUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ3ZDLG1CQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQyxlQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztPQUVoRTs7QUFFRCxVQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDaEIsWUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNqRSxhQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO09BQ2xDOztBQUVELFVBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUU7QUFDOUMsY0FBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLFlBQVksRUFBSTtBQUMxRCxjQUFNLFFBQVEsR0FBRyxPQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdEQsY0FBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQy9DLGlCQUFPLENBQUMsU0FBUyw2REFDTSxZQUFZLDZCQUM1QixDQUFDO0FBQ1IsY0FBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQzs7QUFFOUQsZUFBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDdkQsQ0FBQyxDQUFDO09BQ0o7O0FBRUQsVUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtBQUFFLGlCQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztPQUFFO0FBQ3pELFVBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7QUFBRSxpQkFBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7T0FBRTtBQUN6RCxVQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQUUsaUJBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQUU7O0FBRXpELGVBQVMsU0FBUyxDQUFDLElBQUksRUFBRTs7O0FBQ3ZCLFlBQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxhQUFhLGFBQVcsSUFBSSxDQUFHLENBQUM7O0FBRTNELFlBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTSxFQUFJO0FBQ2xDLGNBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUMsZUFBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0IsY0FBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELGVBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDakMsb0JBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0IsQ0FBQyxDQUFDO09BQ0o7S0FDRjs7O1NBOVZrQixjQUFjOzs7cUJBQWQsY0FBYyIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG4vKlxuICogQ29udmVydHMgYW55T2YsIGFsbE9mIGFuZCBvbmVPZiB0byBodW1hbiByZWFkYWJsZSBzdHJpbmdcbiovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFhPZih0eXBlKSB7XG4gIHJldHVybiB0eXBlLnN1YnN0cmluZygwLCAzKSArICcgb2YnO1xufVxuXG4vKlxuICogaWYgY29uZGl0aW9uIGZvciBFUzYgdGVtcGxhdGUgc3RyaW5nc1xuICogdG8gYmUgdXNlZCBvbmx5IGluIHRlbXBsYXRlIHN0cmluZ1xuICpcbiAqIEBleGFtcGxlIG15c3RyID0gYFJhbmRvbSBpcyAke19pZihNYXRoLnJhbmRvbSgpID4gMC41KWBncmVhdGVyIHRoYW4gMC41YGBcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNvbmRpdGlvblxuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gdGhlIHRlbXBsYXRlIGZ1bmN0aW9uXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIF9pZihjb25kaXRpb24pIHtcbiAgcmV0dXJuIGNvbmRpdGlvbiA/IG5vcm1hbCA6IGVtcHR5O1xufVxuZnVuY3Rpb24gZW1wdHkoKXtcbiAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gbm9ybWFsICh0ZW1wbGF0ZSwgLi4uZXhwcmVzc2lvbnMpIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnNsaWNlKDEpLnJlZHVjZSgoYWNjdW11bGF0b3IsIHBhcnQsIGkpID0+IHtcbiAgICByZXR1cm4gYWNjdW11bGF0b3IgKyBleHByZXNzaW9uc1tpXSArIHBhcnQ7XG4gIH0sIHRlbXBsYXRlWzBdKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbHMgSlNPTlNjaGVtYVZpZXcgKi9cblxuaW1wb3J0IHtcbiAgY29udmVydFhPZixcbiAgX2lmXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5cblxuLyoqXG4gKiBAY2xhc3MgSlNPTlNjaGVtYVZpZXdcbiAqXG4gKiBBIHB1cmUgSmF2YVNjcmlwdCBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBKU09OIFNjaGVtYSBpbiBIVE1MLlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTT05TY2hlbWFWaWV3IHtcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYSBUaGUgSlNPTiBTY2hlbWEgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3Blbj0xXSBoaXMgbnVtYmVyIGluZGljYXRlcyB1cCB0byBob3cgbWFueSBsZXZlbHMgdGhlXG4gICAqIHJlbmRlcmVkIHRyZWUgc2hvdWxkIGV4cGFuZC4gU2V0IGl0IHRvIGAwYCB0byBtYWtlIHRoZSB3aG9sZSB0cmVlIGNvbGxhcHNlZFxuICAgKiBvciBzZXQgaXQgdG8gYEluZmluaXR5YCB0byBleHBhbmQgdGhlIHRyZWUgZGVlcGx5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLlxuICAgKiAgdGhlbWUge3N0cmluZ306IG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IFsnZGFyayddXG4gICovXG4gIGNvbnN0cnVjdG9yKHNjaGVtYSwgb3Blbiwgb3B0aW9ucyA9IHt0aGVtZTogbnVsbH0pIHtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5pc0NvbGxhcHNlZCA9IG9wZW4gPD0gMDtcblxuICAgIC8vIGlmIHNjaGVtYSBpcyBhbiBlbXB0eSBvYmplY3Qgd2hpY2ggbWVhbnMgYW55IEpPU05cbiAgICB0aGlzLmlzQW55ID0gdHlwZW9mIHNjaGVtYSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHNjaGVtYSkgJiZcbiAgICAgICFPYmplY3Qua2V5cyhzY2hlbWEpXG4gICAgICAuZmlsdGVyKGs9PiBbJ3RpdGxlJywgJ2Rlc2NyaXB0aW9uJ10uaW5kZXhPZihrKSA9PT0gLTEpLmxlbmd0aDtcblxuICAgIC8vIERldGVybWluZSBpZiBhIHNjaGVtYSBpcyBhbiBhcnJheVxuICAgIHRoaXMuaXNBcnJheSA9ICF0aGlzLmlzQW55ICYmIHRoaXMuc2NoZW1hICYmIHRoaXMuc2NoZW1hLnR5cGUgPT09ICdhcnJheSc7XG5cbiAgICB0aGlzLmlzT2JqZWN0ID0gdGhpcy5zY2hlbWEgJiZcbiAgICAgICh0aGlzLnNjaGVtYS50eXBlID09PSAnb2JqZWN0JyB8fFxuICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXMgfHxcbiAgICAgICB0aGlzLnNjaGVtYS5hbnlPZiB8fFxuICAgICAgIHRoaXMuc2NoZW1hLm9uZW9mIHx8XG4gICAgICAgdGhpcy5zY2hlbWEuYWxsT2YpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgc2NoZW1hIGlzIGEgcHJpbWl0aXZlXG4gICAgdGhpcy5pc1ByaW1pdGl2ZSA9ICF0aGlzLmlzQW55ICYmICF0aGlzLmlzQXJyYXkgJiYgIXRoaXMuaXNPYmplY3Q7XG5cbiAgICAvL1xuICAgIHRoaXMuc2hvd1RvZ2dsZSA9IHRoaXMuc2NoZW1hLmRlc2NyaXB0aW9uIHx8XG4gICAgICB0aGlzLnNjaGVtYS50aXRsZSB8fFxuICAgICAgKHRoaXMuaXNQcmltaXRpdmUgJiYgKFxuICAgICAgICB0aGlzLnNjaGVtYS5taW5pbXVtIHx8XG4gICAgICAgIHRoaXMuc2NoZW1hLm1heGltdW0gfHxcbiAgICAgICAgdGhpcy5zY2hlbWEuZXhjbHVzaXZlTWluaW11bSB8fFxuICAgICAgICB0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtKVxuICAgICAgKTtcblxuICAgIC8vIHBvcHVsYXRlIGlzUmVxdWlyZWQgcHJvcGVydHkgZG93biB0byBwcm9wZXJ0aWVzXG4gICAgaWYgKHRoaXMuc2NoZW1hICYmIEFycmF5LmlzQXJyYXkodGhpcy5zY2hlbWEucmVxdWlyZWQpKSB7XG4gICAgICB0aGlzLnNjaGVtYS5yZXF1aXJlZC5mb3JFYWNoKHJlcXVpcmVkUHJvcGVydHkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcmVxdWlyZWRQcm9wZXJ0eV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5zY2hlbWEucHJvcGVydGllc1tyZXF1aXJlZFByb3BlcnR5XS5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgd2l0aCBwb3B1bGF0ZWQgcHJvcGVydGllcy5cbiAgICogVGhpcyB0ZW1wbGF0ZSBkb2VzIG5vdCBoYXZlIHRoZSBjaGlsZHJlblxuICAqL1xuICB0ZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIDwhLS0gQW55IC0tPlxuICAgICAgJHtfaWYodGhpcy5pc0FueSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnlcIj5cbiAgICAgICAgICAke19pZih0aGlzLnNob3dUb2dnbGUpYFxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfSA8L2E+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwZSB0eXBlLWFueVwiPiZsdDthbnkmZ3Q7PC9zcGFuPlxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCBcblx0XHQgICR7X2lmKHRoaXMuc2NoZW1hLnJlcXVpcmVkICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciByZXF1aXJlZFwiPlJlcXVpcmVkOiAke3RoaXMuc2NoZW1hLnJlcXVpcmVkfTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAke19pZih0aGlzLnNjaGVtYS5kZWZhdWx0ICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciBkZWZhdWx0XCI+RGVmYXVsdDogJHt0aGlzLnNjaGVtYS5kZWZhdWx0fTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAgJHtfaWYodGhpcy5zY2hlbWEucGF0dGVybiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgcGF0dGVyblwiPlBhdHRlcm46ICR7dGhpcy5zY2hlbWEucGF0dGVybn08L2Rpdj5cbiAgICAgICAgICBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5cbiAgICAgIDwhLS0gUHJpbWl0aXZlIC0tPlxuICAgICAgJHtfaWYodGhpcy5pc1ByaW1pdGl2ZSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmltaXRpdmVcIj5cbiAgICAgICAgICAke19pZih0aGlzLnNob3dUb2dnbGUpYFxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZVwiPjxzcGFuIGNsYXNzPVwidG9nZ2xlLWhhbmRsZVwiPjwvc3Bhbj4ke3RoaXMuc2NoZW1hLnRpdGxlIHx8ICcnfSA8L2E+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0eXBlXCI+JHt0aGlzLnNjaGVtYS50eXBlfTwvc3Bhbj5cblxuICAgICAgICAgXG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5mb3JtYXQpYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtYXRcIj4oJHt0aGlzLnNjaGVtYS5mb3JtYXR9KTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWluaW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIG1pbmltdW1cIj5taW5pbXVtOiR7dGhpcy5zY2hlbWEubWluaW11bX08L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0pYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBleGNsdXNpdmVNaW5pbXVtXCI+KGV4KW1pbmltdW06JHt0aGlzLnNjaGVtYS5leGNsdXNpdmVNaW5pbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWF4aW11bSlgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhbmdlIG1heGltdW1cIj5tYXhpbXVtOiR7dGhpcy5zY2hlbWEubWF4aW11bX08L3NwYW4+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pYFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYW5nZSBleGNsdXNpdmVNYXhpbXVtXCI+KGV4KW1heGltdW06JHt0aGlzLnNjaGVtYS5leGNsdXNpdmVNYXhpbXVtfTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWluTGVuZ3RoKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWluTGVuZ3RoXCI+bWluTGVuZ3RoOiR7dGhpcy5zY2hlbWEubWluTGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEubWF4TGVuZ3RoKWBcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFuZ2UgbWF4TGVuZ3RoXCI+bWF4TGVuZ3RoOiR7dGhpcy5zY2hlbWEubWF4TGVuZ3RofTwvc3Bhbj5cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuZGVzY3JpcHRpb24gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIGRlc2NyaXB0aW9uXCI+JHt0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbn08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgXG5cdFx0IFxuXHRcdCAgXG5cdFx0ICAgJHtfaWYodGhpcy5zY2hlbWEucmVxdWlyZWQgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIHJlcXVpcmVkXCI+UmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgJHtfaWYodGhpcy5zY2hlbWEuZGVmYXVsdCAmJiAhdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgZGVmYXVsdFwiPkRlZmF1bHQ6ICR7dGhpcy5zY2hlbWEuZGVmYXVsdH08L2Rpdj5cbiAgICAgICAgICBgfVxuXHRcdCAgICR7X2lmKHRoaXMuc2NoZW1hLnBhdHRlcm4gJiYgIXRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyIHBhdHRlcm5cIj5QYXR0ZXJuOiAke3RoaXMuc2NoZW1hLnBhdHRlcm59PC9kaXY+XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLmVudW0pYFxuICAgICAgICAgICAgJHt0aGlzLmVudW0odGhpcy5zY2hlbWEsIHRoaXMuaXNDb2xsYXBzZWQsIHRoaXMub3Blbil9XG4gICAgICAgICAgYH1cblxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFsbE9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYWxsT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLm9uZU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnb25lT2YnKX1gfVxuICAgICAgICAgICR7X2lmKHRoaXMuc2NoZW1hLmFueU9mICYmICF0aGlzLmlzQ29sbGFwc2VkKWAke3RoaXMueE9mKHRoaXMuc2NoZW1hLCAnYW55T2YnKX1gfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG5cblxuICAgICAgPCEtLSBBcnJheSAtLT5cbiAgICAgICR7X2lmKHRoaXMuaXNBcnJheSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcnJheVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhbiBjbGFzcz1cInRvZ2dsZS1oYW5kbGVcIj48L3NwYW4+JHt0aGlzLnNjaGVtYS50aXRsZSB8fCAnJ308c3BhbiBjbGFzcz1cIm9wZW5pbmcgYnJhY2tldFwiPls8L3NwYW4+JHtfaWYodGhpcy5pc0NvbGxhcHNlZClgPHNwYW4gY2xhc3M9XCJjbG9zaW5nIGJyYWNrZXRcIj5dPC9zcGFuPmB9PC9hPlxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmICh0aGlzLnNjaGVtYS51bmlxdWVJdGVtcyB8fCB0aGlzLnNjaGVtYS5taW5JdGVtcyB8fCB0aGlzLnNjaGVtYS5tYXhJdGVtcykpYFxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPHNwYW4gdGl0bGU9XCJpdGVtcyByYW5nZVwiPigke3RoaXMuc2NoZW1hLm1pbkl0ZW1zIHx8IDB9Li4ke3RoaXMuc2NoZW1hLm1heEl0ZW1zIHx8ICfiiJ4nfSk8L3NwYW4+XG4gICAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS51bmlxdWVJdGVtcylgPHNwYW4gdGl0bGU9XCJ1bmlxdWVcIiBjbGFzcz1cInVuaXF1ZUl0ZW1zXCI+4pmmPC9zcGFuPmB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCI+XG4gICAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5kZXNjcmlwdGlvbilgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPiR7dGhpcy5zY2hlbWEuZGVzY3JpcHRpb259PC9kaXY+XG4gICAgICAgICAgICBgfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZW51bSlgXG4gICAgICAgICAgICAke3RoaXMuZW51bSh0aGlzLnNjaGVtYSwgdGhpcy5pc0NvbGxhcHNlZCwgdGhpcy5vcGVuKX1cbiAgICAgICAgICBgfVxuXG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYWxsT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbGxPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEub25lT2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdvbmVPZicpfWB9XG4gICAgICAgICAgJHtfaWYodGhpcy5zY2hlbWEuYW55T2YgJiYgIXRoaXMuaXNDb2xsYXBzZWQpYCR7dGhpcy54T2YodGhpcy5zY2hlbWEsICdhbnlPZicpfWB9XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZClgXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zaW5nIGJyYWNrZXRcIj5dPC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cblxuICAgICAgPCEtLSBPYmplY3QgLS0+XG4gICAgICAke19pZighdGhpcy5pc1ByaW1pdGl2ZSAmJiAhdGhpcy5pc0FycmF5ICYmICF0aGlzLmlzQW55KWBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9iamVjdFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGVcIj48c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtaGFuZGxlXCI+PC9zcGFuPiR7dGhpcy5zY2hlbWEudGl0bGUgfHwgJyd9IDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cIm9wZW5pbmcgYnJhY2VcIj57PC9zcGFuPiR7X2lmKHRoaXMuaXNDb2xsYXBzZWQpYFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2VcIiBuZy1pZj1cImlzQ29sbGFwc2VkXCI+fTwvc3Bhbj5cbiAgICAgICAgICBgfTwvYT5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiPlxuICAgICAgICAgICAgJHtfaWYoIXRoaXMuaXNDb2xsYXBzZWQgJiYgdGhpcy5zY2hlbWEuZGVzY3JpcHRpb24pYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIj4ke3RoaXMuc2NoZW1hLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICAgICAgYH1cbiAgICAgICAgICAgIDwhLS0gY2hpbGRyZW4gZ28gaGVyZSAtLT5cblx0XHQgIFxuXHRcdCAgICR7X2lmKHRoaXMuc2NoZW1hLnJlcXVpcmVkICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1aXJlZFwiPkRlZmF1bHQgRmllbGRzOiAke3RoaXMuc2NoZW1hLnJlcXVpcmVkfTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICAke19pZih0aGlzLnNjaGVtYS5kZWZhdWx0ICYmICF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWZhdWx0XCI+RGVmYXVsdDogJHt0aGlzLnNjaGVtYS5kZWZhdWx0fTwvZGl2PlxuICAgICAgICAgIGB9XG5cdFx0ICBcblx0XHRcdCR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkICYmIHRoaXMuc2NoZW1hLnBhdHRlcm4pYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF0dGVyblwiPlBhdHRlcm46ICR7dGhpcy5zY2hlbWEucGF0dGVybn08L2Rpdj5cbiAgICAgICAgICAgIGB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAke19pZighdGhpcy5pc0NvbGxhcHNlZCAmJiB0aGlzLnNjaGVtYS5lbnVtKWBcbiAgICAgICAgICAgICR7dGhpcy5lbnVtKHRoaXMuc2NoZW1hLCB0aGlzLmlzQ29sbGFwc2VkLCB0aGlzLm9wZW4pfVxuICAgICAgICAgIGB9XG5cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbGxPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FsbE9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5vbmVPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ29uZU9mJyl9YH1cbiAgICAgICAgICAke19pZih0aGlzLnNjaGVtYS5hbnlPZiAmJiAhdGhpcy5pc0NvbGxhcHNlZClgJHt0aGlzLnhPZih0aGlzLnNjaGVtYSwgJ2FueU9mJyl9YH1cblxuICAgICAgICAgICR7X2lmKCF0aGlzLmlzQ29sbGFwc2VkKWBcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NpbmcgYnJhY2VcIj59PC9zcGFuPlxuICAgICAgICAgIGB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cbmAucmVwbGFjZSgvXFxzKlxcbi9nLCAnXFxuJykucmVwbGFjZSgvKFxcPFxcIVxcLVxcLSkuKy9nLCAnJykudHJpbSgpO1xuICB9XG5cbiAgLypcbiAgICogVGVtcGxhdGUgZm9yIG9uZU9mLCBhbnlPZiBhbmQgYWxsT2ZcbiAgKi9cbiAgeE9mKHNjaGVtYSwgdHlwZSkge1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5uZXIgJHt0eXBlfVwiPlxuICAgICAgICA8Yj4ke2NvbnZlcnRYT2YodHlwZSl9OjwvYj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvKlxuICAgKiBUZW1wbGF0ZSBmb3IgZW51bXNcbiAgKi9cbiAgZW51bShzY2hlbWEsIGlzQ29sbGFwc2VkLCBvcGVuKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgICR7X2lmKCFpc0NvbGxhcHNlZCAmJiBzY2hlbWEuZW51bSlgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lciBlbnVtc1wiPlxuICAgICAgICAgIDxiPkVudW06PC9iPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGB9XG4gICAgYDtcbiAgfVxuXG4gIC8qXG4gICAqIFRvZ2dsZXMgdGhlICdjb2xsYXBzZWQnIHN0YXRlXG4gICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qXG4gICAqIFJlbmRlcnMgdGhlIGVsZW1lbnQgYW5kIHJldHVybnMgaXRcbiAgKi9cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdqc29uLXNjaGVtYS12aWV3Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2NvbGxhcHNlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGhlbWUpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKGBqc29uLXNjaGVtYS12aWV3LSR7dGhpcy5vcHRpb25zLnRoZW1lfWApO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnRlbXBsYXRlKCk7XG5cbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZHJlbih0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lciBmb3IgdG9nZ2xpbmdcbiAgICBpZiAodGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EudGl0bGUnKSkge1xuICAgICAgdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EudGl0bGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudG9nZ2xlLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xuICB9XG5cbiAgLypcbiAgICogQXBwZW5kcyBjaGlsZHJlbiB0byBnaXZlbiBlbGVtZW50IGJhc2VkIG9uIGN1cnJlbnQgc2NoZW1hXG4gICovXG4gIGFwcGVuZENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbm5lciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmlubmVyJyk7XG5cbiAgICBpZiAoIWlubmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2NoZW1hLmVudW0pIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBKU09ORm9ybWF0dGVyKHRoaXMuc2NoZW1hLmVudW0sIHRoaXMub3BlbiAtIDEpO1xuICAgICAgY29uc3QgZm9ybWF0dGVyRWwgPSBmb3JtYXR0ZXIucmVuZGVyKCk7XG4gICAgICBmb3JtYXR0ZXJFbC5jbGFzc0xpc3QuYWRkKCdpbm5lcicpO1xuICAgICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZW51bXMuaW5uZXInKS5hcHBlbmRDaGlsZChmb3JtYXR0ZXJFbCk7XG5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0FycmF5KSB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IEpTT05TY2hlbWFWaWV3KHRoaXMuc2NoZW1hLml0ZW1zLCB0aGlzLm9wZW4gLSAxKVxuICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzID09PSAnb2JqZWN0Jykge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zY2hlbWEucHJvcGVydGllcykuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOztcbiAgICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInByb3BlcnR5XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+JHtwcm9wZXJ0eU5hbWV9Ojwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBKU09OU2NoZW1hVmlldyhwcm9wZXJ0eSwgdGhpcy5vcGVuIC0gMSk7XG4gICAgICAgIHRlbXBEaXYucXVlcnlTZWxlY3RvcignLnByb3BlcnR5JykuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG5cbiAgICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodGVtcERpdi5xdWVyeVNlbGVjdG9yKCcucHJvcGVydHknKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2hlbWEuYWxsT2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ2FsbE9mJyk7IH1cbiAgICBpZiAodGhpcy5zY2hlbWEub25lT2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ29uZU9mJyk7IH1cbiAgICBpZiAodGhpcy5zY2hlbWEuYW55T2YpIHsgYXBwZW5kWE9mLmNhbGwodGhpcywgJ2FueU9mJyk7IH1cblxuICAgIGZ1bmN0aW9uIGFwcGVuZFhPZih0eXBlKSB7XG4gICAgICBjb25zdCBpbm5lckFsbE9mID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKGAuaW5uZXIuJHt0eXBlfWApO1xuXG4gICAgICB0aGlzLnNjaGVtYVt0eXBlXS5mb3JFYWNoKHNjaGVtYSA9PiB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGlubmVyLmNsYXNzTGlzdC5hZGQoJ2lubmVyJyk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgSlNPTlNjaGVtYVZpZXcoc2NoZW1hLCB0aGlzLm9wZW4gLSAxKTtcbiAgICAgICAgaW5uZXIuYXBwZW5kQ2hpbGQodmlldy5yZW5kZXIoKSk7XG4gICAgICAgIGlubmVyQWxsT2YuYXBwZW5kQ2hpbGQoaW5uZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=

</script>

  <script>
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.JsonRefs=t()}}(function(){var t;return function e(t,n,r){function o(s,u){if(!n[s]){if(!t[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var f=n[s]={exports:{}};t[s][0].call(f.exports,function(e){var n=t[s][1][e];return o(n?n:e)},f,f.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(t,e,n){"use strict";function r(t,e){var n=p[t],r=Promise.resolve(),o=-1===t.indexOf(":")?void 0:t.split(":")[0];return a.isUndefined(n)?-1!==h.indexOf(o)||a.isUndefined(o)?(r=c.load(t,e),r=r.then(e.processContent?function(n){return e.processContent(n,t)}:JSON.parse),r=r.then(function(e){return p[t]=e,e})):r=r.then(function(){return Promise.reject(new Error("Unsupported remote reference scheme: "+o))}):r=r.then(function(){return n}),r=r.then(function(t){return a.cloneDeep(t)})}function o(t,e){var n=m(t);return v(e)&&(e=-1===e.indexOf("#")?"#":e.substring(e.indexOf("#"))),d(n.concat(m(e))).replace(/\/\$ref/g,"")}function i(t,e){function n(t){".."===t?o.pop():"."!==t&&o.push(t)}var r="#"!==e.charAt(0)&&-1===e.indexOf(":"),o=[],i=(e.indexOf("#")>-1?e.split("#")[0]:e).split("/");return t&&(t.indexOf("#")>-1&&(t=t.substring(0,t.indexOf("#"))),t.length>1&&"/"===t[t.length-1]&&(t=t.substring(0,t.length-1)),t.split("#")[0].split("/").forEach(n)),r?i.forEach(n):o=i,o.join("/")}function s(t,e,n){function r(t){var e=t.slice(0,t.lastIndexOf("allOf")),o=n[d(e)];return a.isUndefined(o)?e.indexOf("allOf")>-1?r(e):void 0:d(e)}function i(t){var e=[],o=t.map(function(){var t,o=d(this.path),i=n[o];this.circular&&(e.push(o),a.isUndefined(i)&&(t=r(this.path),i=n[t]),a.isUndefined(i)||(i.circular=!0),this.update(0===u?{}:f(this.node).map(function(){this.circular&&this.parent.update({})})))});return a.each(e,function(t){var e,n=[],r=m(t),i=f(o).get(r);for(e=0;u>e;e++)n.push.apply(n,r),f(o).set(n,a.cloneDeep(i))}),o}function s(t,e){var r=o(e,"#"),i=t=-1===t.indexOf("#")?"#":t.substring(t.indexOf("#")),s=m(i),u=!c.has(s),a=c.get(s),f=m(e),p=f.slice(0,f.length-1),h=n[r]||{ref:t};u?h.missing=!0:0===p.length?(c.value===a&&(a={},h.circular=!0),c.value=a):(c.get(p)===a&&(a={},h.circular=!0),c.set(p,a)),n[r]=h}var u=a.isUndefined(e.depth)?1:e.depth,c=f(t);return a.each(y(t),function(t,e){v(t)||s(t,e)}),a.isUndefined(e.location)||a.each(n,function(t){var n=t.ref;0===n.indexOf(e.location)&&(n=n.substring(e.location.length),"/"===n.charAt(0)&&(n=n.substring(1))),t.ref=n}),{metadata:n,resolved:i(c)}}function u(t,e,n,c,p){function h(t,e,r,i,s){var u,h=r+("#"===i?"":i),l=o(n,t),d=p[l]||{},y=m(t);a.isUndefined(s)?(d.circular=!0,u=c[r].ref):(u=f(s).get(m(i)),a.isUndefined(u)?d.missing=!0:u.$ref?u=u.$ref:y.pop()),0===y.length?g.value=u:g.set(y,u),d.ref=h,p[l]=d}function l(){return{metadata:p,resolved:g.value}}var d=Promise.resolve(),g=f(t);return a.each(y(t),function(t,s){v(t)&&(d=d.then(function(){var f=i(e.location,t),l=t.split("#"),d="#"+(l[1]||"");return a.isUndefined(c[f])?r(f,e).then(function(t){return t},function(t){return t}).then(function(r){var y=l[0],v=a.cloneDeep(e),m=o(n,s);return y=y.substring(0,y.lastIndexOf("/")+1),v.location=i(e.location,y),a.isError(r)?void(p[m]={err:r,missing:!0,ref:t}):(c[f]={ref:n},u(r,v,m,c,p).then(function(e){return delete c[f],h(s,t,f,d,e.resolved),e}))}):void h(s,t,f,d)}))}),d=d.then(function(){s(g.value,e,p)}).then(l,l)}"undefined"==typeof Promise&&t("native-promise-only");var a=t("./lib/utils"),c=t("path-loader"),f=t("traverse"),p={},h=["file","http","https"];e.exports.clearCache=function(){p={}};var l=e.exports.isJsonReference=function(t){return a.isPlainObject(t)&&a.isString(t.$ref)},d=e.exports.pathToPointer=function(t){if(a.isUndefined(t))throw new Error("path is required");if(!a.isArray(t))throw new Error("path must be an array");var e="#";return t.length>0&&(e+="/"+t.map(function(t){return t.replace(/~/g,"~0").replace(/\//g,"~1")}).join("/")),e},y=e.exports.findRefs=function(t){if(a.isUndefined(t))throw new Error("json is required");if(!a.isPlainObject(t))throw new Error("json must be an object");return f(t).reduce(function(t){var e=this.node;return"$ref"===this.key&&l(this.parent.node)&&(t[d(this.path)]=e),t},{})},v=e.exports.isRemotePointer=function(t){if(a.isUndefined(t))throw new Error("ptr is required");if(!a.isString(t))throw new Error("ptr must be a string");return""!==t&&"#"!==t.charAt(0)},m=e.exports.pathFromPointer=function(t){if(a.isUndefined(t))throw new Error("ptr is required");if(!a.isString(t))throw new Error("ptr must be a string");var e=[],n=["","#","#/"];return v(t)?e=t:-1===n.indexOf(t)&&"#"===t.charAt(0)&&(e=t.substring(t.indexOf("/")).split("/").reduce(function(t,e){return""!==e&&t.push(e.replace(/~0/g,"~").replace(/~1/g,"/")),t},[])),e};e.exports.resolveRefs=function(t,e,n){var r=Promise.resolve();return 2===arguments.length&&a.isFunction(e)&&(n=e,e={}),a.isUndefined(e)&&(e={}),r=r.then(function(){if(a.isUndefined(t))throw new Error("json is required");if(!a.isPlainObject(t))throw new Error("json must be an object");if(!a.isPlainObject(e))throw new Error("options must be an object");if(!a.isUndefined(n)&&!a.isFunction(n))throw new Error("done must be a function");if(!a.isUndefined(e.processContent)&&!a.isFunction(e.processContent))throw new Error("options.processContent must be a function");if(!a.isUndefined(e.prepareRequest)&&!a.isFunction(e.prepareRequest))throw new Error("options.prepareRequest must be a function");if(!a.isUndefined(e.location)&&!a.isString(e.location))throw new Error("options.location must be a string");if(!a.isUndefined(e.depth)&&!a.isNumber(e.depth))throw new Error("options.depth must be a number");if(!a.isUndefined(e.depth)&&e.depth<0)throw new Error("options.depth must be greater or equal to zero")}),t=f(t).clone(),e=f(e).clone(),r=r.then(function(){return u(t,e,"#",{},{})}).then(function(t){return s(t.resolved,e,t.metadata)}),!a.isUndefined(n)&&a.isFunction(n)&&(r=r.then(function(t){n(void 0,t.resolved,t.metadata)},function(t){n(t)})),r}},{"./lib/utils":2,"native-promise-only":3,"path-loader":4,traverse:10}],2:[function(t,e,n){"use strict";function r(t,e){return Object.prototype.toString.call(t)==="[object "+e+"]"}var o=t("traverse");e.exports.cloneDeep=function(t){return o(t).clone()};var i=e.exports.isArray=function(t){return r(t,"Array")};e.exports.isError=function(t){return r(t,"Error")},e.exports.isFunction=function(t){return r(t,"Function")},e.exports.isNumber=function(t){return r(t,"Number")};var s=e.exports.isPlainObject=function(t){return r(t,"Object")};e.exports.isString=function(t){return r(t,"String")},e.exports.isUndefined=function(t){return"undefined"==typeof t},e.exports.each=function(t,e){i(t)?t.forEach(e):s(t)&&Object.keys(t).forEach(function(n){e(t[n],n)})}},{traverse:10}],3:[function(e,n,r){(function(e){!function(e,r,o){r[e]=r[e]||o(),"undefined"!=typeof n&&n.exports?n.exports=r[e]:"function"==typeof t&&t.amd&&t(function(){return r[e]})}("Promise","undefined"!=typeof e?e:this,function(){"use strict";function t(t,e){h.add(t,e),p||(p=d(h.drain))}function e(t){var e,n=typeof t;return null==t||"object"!=n&&"function"!=n||(e=t.then),"function"==typeof e?e:!1}function n(){for(var t=0;t<this.chain.length;t++)r(this,1===this.state?this.chain[t].success:this.chain[t].failure,this.chain[t]);this.chain.length=0}function r(t,n,r){var o,i;try{n===!1?r.reject(t.msg):(o=n===!0?t.msg:n.call(void 0,t.msg),o===r.promise?r.reject(TypeError("Promise-chain cycle")):(i=e(o))?i.call(o,r.resolve,r.reject):r.resolve(o))}catch(s){r.reject(s)}}function o(r){var s,a=this;if(!a.triggered){a.triggered=!0,a.def&&(a=a.def);try{(s=e(r))?t(function(){var t=new u(a);try{s.call(r,function(){o.apply(t,arguments)},function(){i.apply(t,arguments)})}catch(e){i.call(t,e)}}):(a.msg=r,a.state=1,a.chain.length>0&&t(n,a))}catch(c){i.call(new u(a),c)}}}function i(e){var r=this;r.triggered||(r.triggered=!0,r.def&&(r=r.def),r.msg=e,r.state=2,r.chain.length>0&&t(n,r))}function s(t,e,n,r){for(var o=0;o<e.length;o++)!function(o){t.resolve(e[o]).then(function(t){n(o,t)},r)}(o)}function u(t){this.def=t,this.triggered=!1}function a(t){this.promise=t,this.state=0,this.triggered=!1,this.chain=[],this.msg=void 0}function c(e){if("function"!=typeof e)throw TypeError("Not a function");if(0!==this.__NPO__)throw TypeError("Not a promise");this.__NPO__=1;var r=new a(this);this.then=function(e,o){var i={success:"function"==typeof e?e:!0,failure:"function"==typeof o?o:!1};return i.promise=new this.constructor(function(t,e){if("function"!=typeof t||"function"!=typeof e)throw TypeError("Not a function");i.resolve=t,i.reject=e}),r.chain.push(i),0!==r.state&&t(n,r),i.promise},this["catch"]=function(t){return this.then(void 0,t)};try{e.call(void 0,function(t){o.call(r,t)},function(t){i.call(r,t)})}catch(s){i.call(r,s)}}var f,p,h,l=Object.prototype.toString,d="undefined"!=typeof setImmediate?function(t){return setImmediate(t)}:setTimeout;try{Object.defineProperty({},"x",{}),f=function(t,e,n,r){return Object.defineProperty(t,e,{value:n,writable:!0,configurable:r!==!1})}}catch(y){f=function(t,e,n){return t[e]=n,t}}h=function(){function t(t,e){this.fn=t,this.self=e,this.next=void 0}var e,n,r;return{add:function(o,i){r=new t(o,i),n?n.next=r:e=r,n=r,r=void 0},drain:function(){var t=e;for(e=n=p=void 0;t;)t.fn.call(t.self),t=t.next}}}();var v=f({},"constructor",c,!1);return c.prototype=v,f(v,"__NPO__",0,!1),f(c,"resolve",function(t){var e=this;return t&&"object"==typeof t&&1===t.__NPO__?t:new e(function(e,n){if("function"!=typeof e||"function"!=typeof n)throw TypeError("Not a function");e(t)})}),f(c,"reject",function(t){return new this(function(e,n){if("function"!=typeof e||"function"!=typeof n)throw TypeError("Not a function");n(t)})}),f(c,"all",function(t){var e=this;return"[object Array]"!=l.call(t)?e.reject(TypeError("Not an array")):0===t.length?e.resolve([]):new e(function(n,r){if("function"!=typeof n||"function"!=typeof r)throw TypeError("Not a function");var o=t.length,i=Array(o),u=0;s(e,t,function(t,e){i[t]=e,++u===o&&n(i)},r)})}),f(c,"race",function(t){var e=this;return"[object Array]"!=l.call(t)?e.reject(TypeError("Not an array")):new e(function(n,r){if("function"!=typeof n||"function"!=typeof r)throw TypeError("Not a function");s(e,t,function(t,e){n(e)},r)})}),c})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(t,e,n){"use strict";function r(t){return o[t.split(":")[0]]||i}var o={file:t("./lib/loaders/file"),http:t("./lib/loaders/http"),https:t("./lib/loaders/http")},i="object"==typeof window||"function"==typeof importScripts?o.http:o.file;"undefined"==typeof Promise&&t("native-promise-only"),e.exports.load=function(t,e,n){var o=Promise.resolve();return 2===arguments.length&&"function"==typeof e&&(n=e,e=void 0),o=o.then(function(){if("undefined"==typeof t)throw new TypeError("location is required");if("string"!=typeof t)throw new TypeError("location must be a string");if("undefined"!=typeof e){if("object"!=typeof e)throw new TypeError("options must be an object")}else e={};if("undefined"!=typeof n&&"function"!=typeof n)throw new TypeError("callback must be a function")}),o=o.then(function(){return new Promise(function(n,o){var i=r(t);i.load(t,e,function(t,e){t?o(t):n(e)})})}),"function"==typeof n&&(o=o.then(function(t){n(void 0,t)},function(t){n(t)})),o}},{"./lib/loaders/file":5,"./lib/loaders/http":6,"native-promise-only":3}],5:[function(t,e,n){"use strict";e.exports.load=function(t,e,n){n(new TypeError("The 'file' scheme is not supported in the browser"))}},{}],6:[function(t,e,n){"use strict";var r=t("superagent"),o=["delete","get","head","patch","post","put"];e.exports.load=function(t,e,n){var i,s,u=t.split("#")[0],a=e.method?e.method.toLowerCase():"get";"undefined"!=typeof e.prepareRequest&&"function"!=typeof e.prepareRequest?i=new TypeError("options.prepareRequest must be a function"):"undefined"!=typeof e.method&&("string"!=typeof e.method?i=new TypeError("options.method must be a string"):-1===o.indexOf(e.method)&&(i=new TypeError("options.method must be one of the following: "+o.slice(0,o.length-1).join(", ")+" or "+o[o.length-1]))),i?n(i):(s=r["delete"===a?"del":a](u),e.prepareRequest&&e.prepareRequest(s),"function"==typeof s.buffer&&s.buffer(!0),s.end(function(t,e){n(t,e?e.text:e)}))}},{superagent:7}],7:[function(t,e,n){function r(){}function o(t){var e={}.toString.call(t);switch(e){case"[object File]":case"[object Blob]":case"[object FormData]":return!0;default:return!1}}function i(t){return t===Object(t)}function s(t){if(!i(t))return t;var e=[];for(var n in t)null!=t[n]&&e.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e.join("&")}function u(t){for(var e,n,r={},o=t.split("&"),i=0,s=o.length;s>i;++i)n=o[i],e=n.split("="),r[decodeURIComponent(e[0])]=decodeURIComponent(e[1]);return r}function a(t){var e,n,r,o,i=t.split(/\r?\n/),s={};i.pop();for(var u=0,a=i.length;a>u;++u)n=i[u],e=n.indexOf(":"),r=n.slice(0,e).toLowerCase(),o=m(n.slice(e+1)),s[r]=o;return s}function c(t){return t.split(/ *; */).shift()}function f(t){return v(t.split(/ *; */),function(t,e){var n=e.split(/ *= */),r=n.shift(),o=n.shift();return r&&o&&(t[r]=o),t},{})}function p(t,e){e=e||{},this.req=t,this.xhr=this.req.xhr,this.text="HEAD"!=this.req.method&&(""===this.xhr.responseType||"text"===this.xhr.responseType)||"undefined"==typeof this.xhr.responseType?this.xhr.responseText:null,this.statusText=this.req.xhr.statusText,this.setStatusProperties(this.xhr.status),this.header=this.headers=a(this.xhr.getAllResponseHeaders()),this.header["content-type"]=this.xhr.getResponseHeader("content-type"),this.setHeaderProperties(this.header),this.body="HEAD"!=this.req.method?this.parseBody(this.text?this.text:this.xhr.response):null}function h(t,e){var n=this;y.call(this),this._query=this._query||[],this.method=t,this.url=e,this.header={},this._header={},this.on("end",function(){var t=null,e=null;try{e=new p(n)}catch(r){return t=new Error("Parser is unable to parse the response"),t.parse=!0,t.original=r,n.callback(t)}if(n.emit("response",e),t)return n.callback(t,e);if(e.status>=200&&e.status<300)return n.callback(t,e);var o=new Error(e.statusText||"Unsuccessful HTTP response");o.original=t,o.response=e,o.status=e.status,n.callback(o,e)})}function l(t,e){return"function"==typeof e?new h("GET",t).end(e):1==arguments.length?new h("GET",t):new h(t,e)}var d,y=t("emitter"),v=t("reduce");d="undefined"!=typeof window?window:"undefined"!=typeof self?self:this,l.getXHR=function(){if(!(!d.XMLHttpRequest||d.location&&"file:"==d.location.protocol&&d.ActiveXObject))return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(t){}return!1};var m="".trim?function(t){return t.trim()}:function(t){return t.replace(/(^\s*|\s*$)/g,"")};l.serializeObject=s,l.parseString=u,l.types={html:"text/html",json:"application/json",xml:"application/xml",urlencoded:"application/x-www-form-urlencoded",form:"application/x-www-form-urlencoded","form-data":"application/x-www-form-urlencoded"},l.serialize={"application/x-www-form-urlencoded":s,"application/json":JSON.stringify},l.parse={"application/x-www-form-urlencoded":u,"application/json":JSON.parse},p.prototype.get=function(t){return this.header[t.toLowerCase()]},p.prototype.setHeaderProperties=function(t){var e=this.header["content-type"]||"";this.type=c(e);var n=f(e);for(var r in n)this[r]=n[r]},p.prototype.parse=function(t){return this.parser=t,this},p.prototype.parseBody=function(t){var e=this.parser||l.parse[this.type];return e&&t&&(t.length||t instanceof Object)?e(t):null},p.prototype.setStatusProperties=function(t){1223===t&&(t=204);var e=t/100|0;this.status=this.statusCode=t,this.statusType=e,this.info=1==e,this.ok=2==e,this.clientError=4==e,this.serverError=5==e,this.error=4==e||5==e?this.toError():!1,this.accepted=202==t,this.noContent=204==t,this.badRequest=400==t,this.unauthorized=401==t,this.notAcceptable=406==t,this.notFound=404==t,this.forbidden=403==t},p.prototype.toError=function(){var t=this.req,e=t.method,n=t.url,r="cannot "+e+" "+n+" ("+this.status+")",o=new Error(r);return o.status=this.status,o.method=e,o.url=n,o},l.Response=p,y(h.prototype),h.prototype.use=function(t){return t(this),this},h.prototype.timeout=function(t){return this._timeout=t,this},h.prototype.clearTimeout=function(){return this._timeout=0,clearTimeout(this._timer),this},h.prototype.abort=function(){return this.aborted?void 0:(this.aborted=!0,this.xhr.abort(),this.clearTimeout(),this.emit("abort"),this)},h.prototype.set=function(t,e){if(i(t)){for(var n in t)this.set(n,t[n]);return this}return this._header[t.toLowerCase()]=e,this.header[t]=e,this},h.prototype.unset=function(t){return delete this._header[t.toLowerCase()],delete this.header[t],this},h.prototype.getHeader=function(t){return this._header[t.toLowerCase()]},h.prototype.type=function(t){return this.set("Content-Type",l.types[t]||t),this},h.prototype.accept=function(t){return this.set("Accept",l.types[t]||t),this},h.prototype.auth=function(t,e){var n=btoa(t+":"+e);return this.set("Authorization","Basic "+n),this},h.prototype.query=function(t){return"string"!=typeof t&&(t=s(t)),t&&this._query.push(t),this},h.prototype.field=function(t,e){return this._formData||(this._formData=new d.FormData),this._formData.append(t,e),this},h.prototype.attach=function(t,e,n){return this._formData||(this._formData=new d.FormData),this._formData.append(t,e,n),this},h.prototype.send=function(t){var e=i(t),n=this.getHeader("Content-Type");if(e&&i(this._data))for(var r in t)this._data[r]=t[r];else"string"==typeof t?(n||this.type("form"),n=this.getHeader("Content-Type"),this._data="application/x-www-form-urlencoded"==n?this._data?this._data+"&"+t:t:(this._data||"")+t):this._data=t;return!e||o(t)?this:(n||this.type("json"),this)},h.prototype.callback=function(t,e){var n=this._callback;this.clearTimeout(),n(t,e)},h.prototype.crossDomainError=function(){var t=new Error("Origin is not allowed by Access-Control-Allow-Origin");t.crossDomain=!0,this.callback(t)},h.prototype.timeoutError=function(){var t=this._timeout,e=new Error("timeout of "+t+"ms exceeded");e.timeout=t,this.callback(e)},h.prototype.withCredentials=function(){return this._withCredentials=!0,this},h.prototype.end=function(t){var e=this,n=this.xhr=l.getXHR(),i=this._query.join("&"),s=this._timeout,u=this._formData||this._data;this._callback=t||r,n.onreadystatechange=function(){if(4==n.readyState){var t;try{t=n.status}catch(r){t=0}if(0==t){if(e.timedout)return e.timeoutError();if(e.aborted)return;return e.crossDomainError()}e.emit("end")}};var a=function(t){t.total>0&&(t.percent=t.loaded/t.total*100),e.emit("progress",t)};this.hasListeners("progress")&&(n.onprogress=a);try{n.upload&&this.hasListeners("progress")&&(n.upload.onprogress=a)}catch(c){}if(s&&!this._timer&&(this._timer=setTimeout(function(){e.timedout=!0,e.abort()},s)),i&&(i=l.serializeObject(i),this.url+=~this.url.indexOf("?")?"&"+i:"?"+i),n.open(this.method,this.url,!0),this._withCredentials&&(n.withCredentials=!0),"GET"!=this.method&&"HEAD"!=this.method&&"string"!=typeof u&&!o(u)){var f=this.getHeader("Content-Type"),p=l.serialize[f?f.split(";")[0]:""];p&&(u=p(u))}for(var h in this.header)null!=this.header[h]&&n.setRequestHeader(h,this.header[h]);return this.emit("request",this),n.send(u),this},h.prototype.then=function(t,e){return this.end(function(n,r){n?e(n):t(r)})},l.Request=h,l.get=function(t,e,n){var r=l("GET",t);return"function"==typeof e&&(n=e,e=null),e&&r.query(e),n&&r.end(n),r},l.head=function(t,e,n){var r=l("HEAD",t);return"function"==typeof e&&(n=e,e=null),e&&r.send(e),n&&r.end(n),r},l.del=function(t,e){var n=l("DELETE",t);return e&&n.end(e),n},l.patch=function(t,e,n){var r=l("PATCH",t);return"function"==typeof e&&(n=e,e=null),e&&r.send(e),n&&r.end(n),r},l.post=function(t,e,n){var r=l("POST",t);return"function"==typeof e&&(n=e,e=null),e&&r.send(e),n&&r.end(n),r},l.put=function(t,e,n){var r=l("PUT",t);return"function"==typeof e&&(n=e,e=null),e&&r.send(e),n&&r.end(n),r},e.exports=l},{emitter:8,reduce:9}],8:[function(t,e,n){function r(t){return t?o(t):void 0}function o(t){for(var e in r.prototype)t[e]=r.prototype[e];return t}e.exports=r,r.prototype.on=r.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},r.prototype.once=function(t,e){function n(){r.off(t,n),e.apply(this,arguments)}var r=this;return this._callbacks=this._callbacks||{},n.fn=e,this.on(t,n),this},r.prototype.off=r.prototype.removeListener=r.prototype.removeAllListeners=r.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n=this._callbacks[t];if(!n)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var r,o=0;o<n.length;o++)if(r=n[o],r===e||r.fn===e){n.splice(o,1);break}return this},r.prototype.emit=function(t){this._callbacks=this._callbacks||{};var e=[].slice.call(arguments,1),n=this._callbacks[t];if(n){n=n.slice(0);for(var r=0,o=n.length;o>r;++r)n[r].apply(this,e)}return this},r.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},r.prototype.hasListeners=function(t){return!!this.listeners(t).length}},{}],9:[function(t,e,n){e.exports=function(t,e,n){for(var r=0,o=t.length,i=3==arguments.length?n:t[r++];o>r;)i=e.call(null,i,t[r],++r,t);return i}},{}],10:[function(t,e,n){function r(t){this.value=t}function o(t,e,n){var r=[],o=[],s=!0;return function u(t){function a(){if("object"==typeof h.node&&null!==h.node){h.keys&&h.node_===h.node||(h.keys=d(h.node)),h.isLeaf=0==h.keys.length;for(var e=0;e<o.length;e++)if(o[e].node_===t){h.circular=o[e];break}}else h.isLeaf=!0,h.keys=null;h.notLeaf=!h.isLeaf,h.notRoot=!h.isRoot}var c=n?i(t):t,f={},p=!0,h={node:c,node_:t,path:[].concat(r),parent:o[o.length-1],parents:o,key:r.slice(-1)[0],isRoot:0===r.length,level:r.length,circular:null,update:function(t,e){h.isRoot||(h.parent.node[h.key]=t),h.node=t,e&&(p=!1)},"delete":function(t){delete h.parent.node[h.key],t&&(p=!1)},remove:function(t){y(h.parent.node)?h.parent.node.splice(h.key,1):delete h.parent.node[h.key],t&&(p=!1)},keys:null,before:function(t){f.before=t},after:function(t){f.after=t},pre:function(t){f.pre=t},post:function(t){f.post=t},stop:function(){s=!1},block:function(){p=!1}};if(!s)return h;a();var l=e.call(h,h.node);return void 0!==l&&h.update&&h.update(l),f.before&&f.before.call(h,h.node),p?("object"!=typeof h.node||null===h.node||h.circular||(o.push(h),a(),v(h.keys,function(t,e){r.push(t),f.pre&&f.pre.call(h,h.node[t],t);var o=u(h.node[t]);n&&m.call(h.node,t)&&(h.node[t]=o.node),o.isLast=e==h.keys.length-1,o.isFirst=0==e,f.post&&f.post.call(h,o),r.pop()}),o.pop()),f.after&&f.after.call(h,h.node),h):h}(t).node}function i(t){if("object"==typeof t&&null!==t){var e;if(y(t))e=[];else if(u(t))e=new Date(t.getTime?t.getTime():t);else if(a(t))e=new RegExp(t);else if(c(t))e={message:t.message};else if(f(t))e=new Boolean(t);else if(p(t))e=new Number(t);else if(h(t))e=new String(t);else if(Object.create&&Object.getPrototypeOf)e=Object.create(Object.getPrototypeOf(t));else if(t.constructor===Object)e={};else{var n=t.constructor&&t.constructor.prototype||t.__proto__||{},r=function(){};r.prototype=n,e=new r}return v(d(t),function(n){e[n]=t[n]}),e}return t}function s(t){return Object.prototype.toString.call(t)}function u(t){return"[object Date]"===s(t)}function a(t){return"[object RegExp]"===s(t)}function c(t){return"[object Error]"===s(t)}function f(t){return"[object Boolean]"===s(t)}function p(t){return"[object Number]"===s(t)}function h(t){return"[object String]"===s(t)}var l=e.exports=function(t){return new r(t)};r.prototype.get=function(t){for(var e=this.value,n=0;n<t.length;n++){var r=t[n];if(!e||!m.call(e,r)){e=void 0;break}e=e[r]}return e},r.prototype.has=function(t){for(var e=this.value,n=0;n<t.length;n++){var r=t[n];if(!e||!m.call(e,r))return!1;e=e[r]}return!0},r.prototype.set=function(t,e){for(var n=this.value,r=0;r<t.length-1;r++){var o=t[r];m.call(n,o)||(n[o]={}),n=n[o]}return n[t[r]]=e,e},r.prototype.map=function(t){return o(this.value,t,!0)},r.prototype.forEach=function(t){return this.value=o(this.value,t,!1),this.value},r.prototype.reduce=function(t,e){var n=1===arguments.length,r=n?this.value:e;return this.forEach(function(e){this.isRoot&&n||(r=t.call(this,r,e))}),r},r.prototype.paths=function(){var t=[];return this.forEach(function(e){t.push(this.path)}),t},r.prototype.nodes=function(){var t=[];return this.forEach(function(e){t.push(this.node)}),t},r.prototype.clone=function(){var t=[],e=[];return function n(r){for(var o=0;o<t.length;o++)if(t[o]===r)return e[o];if("object"==typeof r&&null!==r){var s=i(r);return t.push(r),e.push(s),v(d(r),function(t){s[t]=n(r[t])}),t.pop(),e.pop(),s}return r}(this.value)};var d=Object.keys||function(t){var e=[];for(var n in t)e.push(n);return e},y=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},v=function(t,e){if(t.forEach)return t.forEach(e);for(var n=0;n<t.length;n++)e(t[n],n,t)};v(d(r.prototype),function(t){l[t]=function(e){var n=[].slice.call(arguments,1),o=new r(e);return o[t].apply(o,n)}});var m=Object.hasOwnProperty||function(t,e){return e in t}},{}]},{},[1])(1)});
</script>

  <script>
/* Web Font Loader v1.6.24 - (c) Adobe Systems, Google. License: Apache 2.0 */
(function(){function aa(a,b,d){return a.call.apply(a.bind,arguments)}function ba(a,b,d){if(!a)throw Error();if(2<arguments.length){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(d,c);return a.apply(b,d)}}return function(){return a.apply(b,arguments)}}function p(a,b,d){p=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?aa:ba;return p.apply(null,arguments)}var q=Date.now||function(){return+new Date};function ca(a,b){this.a=a;this.m=b||a;this.c=this.m.document}var da=!!window.FontFace;function t(a,b,d,c){b=a.c.createElement(b);if(d)for(var e in d)d.hasOwnProperty(e)&&("style"==e?b.style.cssText=d[e]:b.setAttribute(e,d[e]));c&&b.appendChild(a.c.createTextNode(c));return b}function u(a,b,d){a=a.c.getElementsByTagName(b)[0];a||(a=document.documentElement);a.insertBefore(d,a.lastChild)}function v(a){a.parentNode&&a.parentNode.removeChild(a)}
function w(a,b,d){b=b||[];d=d||[];for(var c=a.className.split(/\s+/),e=0;e<b.length;e+=1){for(var f=!1,g=0;g<c.length;g+=1)if(b[e]===c[g]){f=!0;break}f||c.push(b[e])}b=[];for(e=0;e<c.length;e+=1){f=!1;for(g=0;g<d.length;g+=1)if(c[e]===d[g]){f=!0;break}f||b.push(c[e])}a.className=b.join(" ").replace(/\s+/g," ").replace(/^\s+|\s+$/,"")}function y(a,b){for(var d=a.className.split(/\s+/),c=0,e=d.length;c<e;c++)if(d[c]==b)return!0;return!1}
function z(a){if("string"===typeof a.f)return a.f;var b=a.m.location.protocol;"about:"==b&&(b=a.a.location.protocol);return"https:"==b?"https:":"http:"}function ea(a){return a.m.location.hostname||a.a.location.hostname}
function A(a,b,d){function c(){k&&e&&f&&(k(g),k=null)}b=t(a,"link",{rel:"stylesheet",href:b,media:"all"});var e=!1,f=!0,g=null,k=d||null;da?(b.onload=function(){e=!0;c()},b.onerror=function(){e=!0;g=Error("Stylesheet failed to load");c()}):setTimeout(function(){e=!0;c()},0);u(a,"head",b)}
function B(a,b,d,c){var e=a.c.getElementsByTagName("head")[0];if(e){var f=t(a,"script",{src:b}),g=!1;f.onload=f.onreadystatechange=function(){g||this.readyState&&"loaded"!=this.readyState&&"complete"!=this.readyState||(g=!0,d&&d(null),f.onload=f.onreadystatechange=null,"HEAD"==f.parentNode.tagName&&e.removeChild(f))};e.appendChild(f);setTimeout(function(){g||(g=!0,d&&d(Error("Script load timeout")))},c||5E3);return f}return null};function C(){this.a=0;this.c=null}function D(a){a.a++;return function(){a.a--;E(a)}}function F(a,b){a.c=b;E(a)}function E(a){0==a.a&&a.c&&(a.c(),a.c=null)};function G(a){this.a=a||"-"}G.prototype.c=function(a){for(var b=[],d=0;d<arguments.length;d++)b.push(arguments[d].replace(/[\W_]+/g,"").toLowerCase());return b.join(this.a)};function H(a,b){this.c=a;this.f=4;this.a="n";var d=(b||"n4").match(/^([nio])([1-9])$/i);d&&(this.a=d[1],this.f=parseInt(d[2],10))}function fa(a){return I(a)+" "+(a.f+"00")+" 300px "+J(a.c)}function J(a){var b=[];a=a.split(/,\s*/);for(var d=0;d<a.length;d++){var c=a[d].replace(/['"]/g,"");-1!=c.indexOf(" ")||/^\d/.test(c)?b.push("'"+c+"'"):b.push(c)}return b.join(",")}function K(a){return a.a+a.f}function I(a){var b="normal";"o"===a.a?b="oblique":"i"===a.a&&(b="italic");return b}
function ga(a){var b=4,d="n",c=null;a&&((c=a.match(/(normal|oblique|italic)/i))&&c[1]&&(d=c[1].substr(0,1).toLowerCase()),(c=a.match(/([1-9]00|normal|bold)/i))&&c[1]&&(/bold/i.test(c[1])?b=7:/[1-9]00/.test(c[1])&&(b=parseInt(c[1].substr(0,1),10))));return d+b};function ha(a,b){this.c=a;this.f=a.m.document.documentElement;this.h=b;this.a=new G("-");this.j=!1!==b.events;this.g=!1!==b.classes}function ia(a){a.g&&w(a.f,[a.a.c("wf","loading")]);L(a,"loading")}function M(a){if(a.g){var b=y(a.f,a.a.c("wf","active")),d=[],c=[a.a.c("wf","loading")];b||d.push(a.a.c("wf","inactive"));w(a.f,d,c)}L(a,"inactive")}function L(a,b,d){if(a.j&&a.h[b])if(d)a.h[b](d.c,K(d));else a.h[b]()};function ja(){this.c={}}function ka(a,b,d){var c=[],e;for(e in b)if(b.hasOwnProperty(e)){var f=a.c[e];f&&c.push(f(b[e],d))}return c};function N(a,b){this.c=a;this.f=b;this.a=t(this.c,"span",{"aria-hidden":"true"},this.f)}function O(a){u(a.c,"body",a.a)}function P(a){return"display:block;position:absolute;top:-9999px;left:-9999px;font-size:300px;width:auto;height:auto;line-height:normal;margin:0;padding:0;font-variant:normal;white-space:nowrap;font-family:"+J(a.c)+";"+("font-style:"+I(a)+";font-weight:"+(a.f+"00")+";")};function Q(a,b,d,c,e,f){this.g=a;this.j=b;this.a=c;this.c=d;this.f=e||3E3;this.h=f||void 0}Q.prototype.start=function(){var a=this.c.m.document,b=this,d=q(),c=new Promise(function(c,e){function k(){q()-d>=b.f?e():a.fonts.load(fa(b.a),b.h).then(function(a){1<=a.length?c():setTimeout(k,25)},function(){e()})}k()}),e=new Promise(function(a,c){setTimeout(c,b.f)});Promise.race([e,c]).then(function(){b.g(b.a)},function(){b.j(b.a)})};function R(a,b,d,c,e,f,g){this.v=a;this.B=b;this.c=d;this.a=c;this.s=g||"BESbswy";this.f={};this.w=e||3E3;this.u=f||null;this.o=this.j=this.h=this.g=null;this.g=new N(this.c,this.s);this.h=new N(this.c,this.s);this.j=new N(this.c,this.s);this.o=new N(this.c,this.s);a=new H(this.a.c+",serif",K(this.a));a=P(a);this.g.a.style.cssText=a;a=new H(this.a.c+",sans-serif",K(this.a));a=P(a);this.h.a.style.cssText=a;a=new H("serif",K(this.a));a=P(a);this.j.a.style.cssText=a;a=new H("sans-serif",K(this.a));a=
P(a);this.o.a.style.cssText=a;O(this.g);O(this.h);O(this.j);O(this.o)}var S={D:"serif",C:"sans-serif"},T=null;function U(){if(null===T){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);T=!!a&&(536>parseInt(a[1],10)||536===parseInt(a[1],10)&&11>=parseInt(a[2],10))}return T}R.prototype.start=function(){this.f.serif=this.j.a.offsetWidth;this.f["sans-serif"]=this.o.a.offsetWidth;this.A=q();la(this)};
function ma(a,b,d){for(var c in S)if(S.hasOwnProperty(c)&&b===a.f[S[c]]&&d===a.f[S[c]])return!0;return!1}function la(a){var b=a.g.a.offsetWidth,d=a.h.a.offsetWidth,c;(c=b===a.f.serif&&d===a.f["sans-serif"])||(c=U()&&ma(a,b,d));c?q()-a.A>=a.w?U()&&ma(a,b,d)&&(null===a.u||a.u.hasOwnProperty(a.a.c))?V(a,a.v):V(a,a.B):na(a):V(a,a.v)}function na(a){setTimeout(p(function(){la(this)},a),50)}function V(a,b){setTimeout(p(function(){v(this.g.a);v(this.h.a);v(this.j.a);v(this.o.a);b(this.a)},a),0)};function W(a,b,d){this.c=a;this.a=b;this.f=0;this.o=this.j=!1;this.s=d}var X=null;W.prototype.g=function(a){var b=this.a;b.g&&w(b.f,[b.a.c("wf",a.c,K(a).toString(),"active")],[b.a.c("wf",a.c,K(a).toString(),"loading"),b.a.c("wf",a.c,K(a).toString(),"inactive")]);L(b,"fontactive",a);this.o=!0;oa(this)};
W.prototype.h=function(a){var b=this.a;if(b.g){var d=y(b.f,b.a.c("wf",a.c,K(a).toString(),"active")),c=[],e=[b.a.c("wf",a.c,K(a).toString(),"loading")];d||c.push(b.a.c("wf",a.c,K(a).toString(),"inactive"));w(b.f,c,e)}L(b,"fontinactive",a);oa(this)};function oa(a){0==--a.f&&a.j&&(a.o?(a=a.a,a.g&&w(a.f,[a.a.c("wf","active")],[a.a.c("wf","loading"),a.a.c("wf","inactive")]),L(a,"active")):M(a.a))};function pa(a){this.j=a;this.a=new ja;this.h=0;this.f=this.g=!0}pa.prototype.load=function(a){this.c=new ca(this.j,a.context||this.j);this.g=!1!==a.events;this.f=!1!==a.classes;qa(this,new ha(this.c,a),a)};
function ra(a,b,d,c,e){var f=0==--a.h;(a.f||a.g)&&setTimeout(function(){var a=e||null,k=c||null||{};if(0===d.length&&f)M(b.a);else{b.f+=d.length;f&&(b.j=f);var h,m=[];for(h=0;h<d.length;h++){var l=d[h],n=k[l.c],r=b.a,x=l;r.g&&w(r.f,[r.a.c("wf",x.c,K(x).toString(),"loading")]);L(r,"fontloading",x);r=null;null===X&&(X=window.FontFace?(x=/Gecko.*Firefox\/(\d+)/.exec(window.navigator.userAgent))?42<parseInt(x[1],10):!0:!1);X?r=new Q(p(b.g,b),p(b.h,b),b.c,l,b.s,n):r=new R(p(b.g,b),p(b.h,b),b.c,l,b.s,a,
n);m.push(r)}for(h=0;h<m.length;h++)m[h].start()}},0)}function qa(a,b,d){var c=[],e=d.timeout;ia(b);var c=ka(a.a,d,a.c),f=new W(a.c,b,e);a.h=c.length;b=0;for(d=c.length;b<d;b++)c[b].load(function(b,c,d){ra(a,f,b,c,d)})};function sa(a,b){this.c=a;this.a=b}function ta(a,b,d){var c=z(a.c);a=(a.a.api||"fast.fonts.net/jsapi").replace(/^.*http(s?):(\/\/)?/,"");return c+"//"+a+"/"+b+".js"+(d?"?v="+d:"")}
sa.prototype.load=function(a){function b(){if(e["__mti_fntLst"+d]){var c=e["__mti_fntLst"+d](),g=[],k;if(c)for(var h=0;h<c.length;h++){var m=c[h].fontfamily;void 0!=c[h].fontStyle&&void 0!=c[h].fontWeight?(k=c[h].fontStyle+c[h].fontWeight,g.push(new H(m,k))):g.push(new H(m))}a(g)}else setTimeout(function(){b()},50)}var d=this.a.projectId,c=this.a.version;if(d){var e=this.c.m;B(this.c,ta(this,d,c),function(c){c?a([]):b()}).id="__MonotypeAPIScript__"+d}else a([])};function ua(a,b){this.c=a;this.a=b}ua.prototype.load=function(a){var b,d,c=this.a.urls||[],e=this.a.families||[],f=this.a.testStrings||{},g=new C;b=0;for(d=c.length;b<d;b++)A(this.c,c[b],D(g));var k=[];b=0;for(d=e.length;b<d;b++)if(c=e[b].split(":"),c[1])for(var h=c[1].split(","),m=0;m<h.length;m+=1)k.push(new H(c[0],h[m]));else k.push(new H(c[0]));F(g,function(){a(k,f)})};function va(a,b,d){a?this.c=a:this.c=b+wa;this.a=[];this.f=[];this.g=d||""}var wa="//fonts.googleapis.com/css";function xa(a,b){for(var d=b.length,c=0;c<d;c++){var e=b[c].split(":");3==e.length&&a.f.push(e.pop());var f="";2==e.length&&""!=e[1]&&(f=":");a.a.push(e.join(f))}}
function ya(a){if(0==a.a.length)throw Error("No fonts to load!");if(-1!=a.c.indexOf("kit="))return a.c;for(var b=a.a.length,d=[],c=0;c<b;c++)d.push(a.a[c].replace(/ /g,"+"));b=a.c+"?family="+d.join("%7C");0<a.f.length&&(b+="&subset="+a.f.join(","));0<a.g.length&&(b+="&text="+encodeURIComponent(a.g));return b};function za(a){this.f=a;this.a=[];this.c={}}
var Aa={latin:"BESbswy",cyrillic:"\u0439\u044f\u0416",greek:"\u03b1\u03b2\u03a3",khmer:"\u1780\u1781\u1782",Hanuman:"\u1780\u1781\u1782"},Ba={thin:"1",extralight:"2","extra-light":"2",ultralight:"2","ultra-light":"2",light:"3",regular:"4",book:"4",medium:"5","semi-bold":"6",semibold:"6","demi-bold":"6",demibold:"6",bold:"7","extra-bold":"8",extrabold:"8","ultra-bold":"8",ultrabold:"8",black:"9",heavy:"9",l:"3",r:"4",b:"7"},Ca={i:"i",italic:"i",n:"n",normal:"n"},Da=/^(thin|(?:(?:extra|ultra)-?)?light|regular|book|medium|(?:(?:semi|demi|extra|ultra)-?)?bold|black|heavy|l|r|b|[1-9]00)?(n|i|normal|italic)?$/;
function Ea(a){for(var b=a.f.length,d=0;d<b;d++){var c=a.f[d].split(":"),e=c[0].replace(/\+/g," "),f=["n4"];if(2<=c.length){var g;var k=c[1];g=[];if(k)for(var k=k.split(","),h=k.length,m=0;m<h;m++){var l;l=k[m];if(l.match(/^[\w-]+$/)){var n=Da.exec(l.toLowerCase());if(null==n)l="";else{l=n[2];l=null==l||""==l?"n":Ca[l];n=n[1];if(null==n||""==n)n="4";else var r=Ba[n],n=r?r:isNaN(n)?"4":n.substr(0,1);l=[l,n].join("")}}else l="";l&&g.push(l)}0<g.length&&(f=g);3==c.length&&(c=c[2],g=[],c=c?c.split(","):
g,0<c.length&&(c=Aa[c[0]])&&(a.c[e]=c))}a.c[e]||(c=Aa[e])&&(a.c[e]=c);for(c=0;c<f.length;c+=1)a.a.push(new H(e,f[c]))}};function Fa(a,b){this.c=a;this.a=b}var Ga={Arimo:!0,Cousine:!0,Tinos:!0};Fa.prototype.load=function(a){var b=new C,d=this.c,c=new va(this.a.api,z(d),this.a.text),e=this.a.families;xa(c,e);var f=new za(e);Ea(f);A(d,ya(c),D(b));F(b,function(){a(f.a,f.c,Ga)})};function Ha(a,b){this.c=a;this.a=b}Ha.prototype.load=function(a){var b=this.a.id,d=this.c.m;b?B(this.c,(this.a.api||"https://use.typekit.net")+"/"+b+".js",function(b){if(b)a([]);else if(d.Typekit&&d.Typekit.config&&d.Typekit.config.fn){b=d.Typekit.config.fn;for(var e=[],f=0;f<b.length;f+=2)for(var g=b[f],k=b[f+1],h=0;h<k.length;h++)e.push(new H(g,k[h]));try{d.Typekit.load({events:!1,classes:!1,async:!0})}catch(m){}a(e)}},2E3):a([])};function Ia(a,b){this.c=a;this.f=b;this.a=[]}Ia.prototype.load=function(a){var b=this.f.id,d=this.c.m,c=this;b?(d.__webfontfontdeckmodule__||(d.__webfontfontdeckmodule__={}),d.__webfontfontdeckmodule__[b]=function(b,d){for(var g=0,k=d.fonts.length;g<k;++g){var h=d.fonts[g];c.a.push(new H(h.name,ga("font-weight:"+h.weight+";font-style:"+h.style)))}a(c.a)},B(this.c,z(this.c)+(this.f.api||"//f.fontdeck.com/s/css/js/")+ea(this.c)+"/"+b+".js",function(b){b&&a([])})):a([])};var Y=new pa(window);Y.a.c.custom=function(a,b){return new ua(b,a)};Y.a.c.fontdeck=function(a,b){return new Ia(b,a)};Y.a.c.monotype=function(a,b){return new sa(b,a)};Y.a.c.typekit=function(a,b){return new Ha(b,a)};Y.a.c.google=function(a,b){return new Fa(b,a)};var Z={load:p(Y.load,Y)};"function"===typeof define&&define.amd?define(function(){return Z}):"undefined"!==typeof module&&module.exports?module.exports=Z:(window.WebFont=Z,window.WebFontConfig&&Y.load(window.WebFontConfig));}());
</script>

  <script>
  $(document).ready(function () {
    $('.nav-tabs-examples').find('a:first').tab('show');
    $(this).scrollspy({ target: '#scrollingNav', offset: 18 });
  });
  </script>
</body>
</html>
